summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2015-05-27 13:29:13 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2015-06-01 11:16:28 -0400
commite19d349858d00fd97ab518376c90d6da9390510c (patch)
treea7810f24135163b7efada2ab438a3ef8d72c3efa
parent2ea47dec763b818852066db53fbf08f5146e6e9a (diff)
gpu: nvgpu: Support >32bit addresses in simulation
Change-Id: I96282b4e047ba8b5369dac039f0f51856c69235b Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/747935 (cherry-picked from commit 0bb090745b4122fc4149b1bd6026138a1b9a32bc) Reviewed-on: http://git-master/r/749235
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c33
-rw-r--r--drivers/gpu/nvgpu/gk20a/sim_gk20a.h2
2 files changed, 18 insertions, 17 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index 2e88726a..cc1b221d 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -238,7 +238,7 @@ static void gk20a_remove_sim_support(struct sim_gk20a *s)
238 238
239static int alloc_and_kmap_iopage(struct device *d, 239static int alloc_and_kmap_iopage(struct device *d,
240 void **kvaddr, 240 void **kvaddr,
241 phys_addr_t *phys, 241 u64 *phys,
242 struct page **page) 242 struct page **page)
243{ 243{
244 int err = 0; 244 int err = 0;
@@ -282,7 +282,7 @@ static int gk20a_init_sim_support(struct platform_device *dev)
282 int err = 0; 282 int err = 0;
283 struct gk20a *g = get_gk20a(dev); 283 struct gk20a *g = get_gk20a(dev);
284 struct device *d = &dev->dev; 284 struct device *d = &dev->dev;
285 phys_addr_t phys; 285 u64 phys;
286 286
287 g->sim.g = g; 287 g->sim.g = g;
288 g->sim.regs = gk20a_ioremap_resource(dev, GK20A_SIM_IORESOURCE_MEM, 288 g->sim.regs = gk20a_ioremap_resource(dev, GK20A_SIM_IORESOURCE_MEM,
@@ -320,9 +320,9 @@ static int gk20a_init_sim_support(struct platform_device *dev)
320 sim_writel(g, sim_send_put_r(), g->sim.send_ring_put); 320 sim_writel(g, sim_send_put_r(), g->sim.send_ring_put);
321 321
322 /*write send ring address and make it valid*/ 322 /*write send ring address and make it valid*/
323 /*TBD: work for >32b physmem*/
324 phys = g->sim.send_bfr.phys; 323 phys = g->sim.send_bfr.phys;
325 sim_writel(g, sim_send_ring_hi_r(), 0); 324 sim_writel(g, sim_send_ring_hi_r(),
325 sim_send_ring_hi_addr_f(u64_hi32(phys)));
326 sim_writel(g, sim_send_ring_r(), 326 sim_writel(g, sim_send_ring_r(),
327 sim_send_ring_status_valid_f() | 327 sim_send_ring_status_valid_f() |
328 sim_send_ring_target_phys_pci_coherent_f() | 328 sim_send_ring_target_phys_pci_coherent_f() |
@@ -337,9 +337,9 @@ static int gk20a_init_sim_support(struct platform_device *dev)
337 sim_writel(g, sim_recv_get_r(), g->sim.recv_ring_get); 337 sim_writel(g, sim_recv_get_r(), g->sim.recv_ring_get);
338 338
339 /*write send ring address and make it valid*/ 339 /*write send ring address and make it valid*/
340 /*TBD: work for >32b physmem*/
341 phys = g->sim.recv_bfr.phys; 340 phys = g->sim.recv_bfr.phys;
342 sim_writel(g, sim_recv_ring_hi_r(), 0); 341 sim_writel(g, sim_recv_ring_hi_r(),
342 sim_recv_ring_hi_addr_f(u64_hi32(phys)));
343 sim_writel(g, sim_recv_ring_r(), 343 sim_writel(g, sim_recv_ring_r(),
344 sim_recv_ring_status_valid_f() | 344 sim_recv_ring_status_valid_f() |
345 sim_recv_ring_target_phys_pci_coherent_f() | 345 sim_recv_ring_target_phys_pci_coherent_f() |
@@ -408,7 +408,8 @@ static int rpc_send_message(struct gk20a *g)
408 sim_dma_size_4kb_f() | 408 sim_dma_size_4kb_f() |
409 sim_dma_addr_lo_f(g->sim.msg_bfr.phys >> PAGE_SHIFT); 409 sim_dma_addr_lo_f(g->sim.msg_bfr.phys >> PAGE_SHIFT);
410 410
411 *sim_send_ring_bfr(g, dma_hi_offset*sizeof(u32)) = 0; /*TBD >32b phys*/ 411 *sim_send_ring_bfr(g, dma_hi_offset*sizeof(u32)) =
412 u64_hi32(g->sim.msg_bfr.phys);
412 413
413 *sim_msg_hdr(g, sim_msg_sequence_r()) = g->sim.sequence_base++; 414 *sim_msg_hdr(g, sim_msg_sequence_r()) = g->sim.sequence_base++;
414 415
@@ -432,7 +433,7 @@ static inline u32 *sim_recv_ring_bfr(struct gk20a *g, u32 byte_offset)
432 433
433static int rpc_recv_poll(struct gk20a *g) 434static int rpc_recv_poll(struct gk20a *g)
434{ 435{
435 phys_addr_t recv_phys_addr; 436 u64 recv_phys_addr;
436 437
437 /* XXX This read is not required (?) */ 438 /* XXX This read is not required (?) */
438 /*pVGpu->recv_ring_get = VGPU_REG_RD32(pGpu, NV_VGPU_RECV_GET);*/ 439 /*pVGpu->recv_ring_get = VGPU_REG_RD32(pGpu, NV_VGPU_RECV_GET);*/
@@ -447,14 +448,14 @@ static int rpc_recv_poll(struct gk20a *g)
447 /* these are in u32 offsets*/ 448 /* these are in u32 offsets*/
448 u32 dma_lo_offset = 449 u32 dma_lo_offset =
449 sim_recv_put_pointer_v(g->sim.recv_ring_get)*2 + 0; 450 sim_recv_put_pointer_v(g->sim.recv_ring_get)*2 + 0;
450 /*u32 dma_hi_offset = dma_lo_offset + 1;*/ 451 u32 dma_hi_offset = dma_lo_offset + 1;
451 u32 recv_phys_addr_lo = sim_dma_addr_lo_v(*sim_recv_ring_bfr(g, dma_lo_offset*4)); 452 u32 recv_phys_addr_lo = sim_dma_addr_lo_v(
452 453 *sim_recv_ring_bfr(g, dma_lo_offset*4));
453 /*u32 recv_phys_addr_hi = sim_dma_hi_addr_v( 454 u32 recv_phys_addr_hi = sim_dma_hi_addr_v(
454 (phys_addr_t)sim_recv_ring_bfr(g,dma_hi_offset*4));*/ 455 *sim_recv_ring_bfr(g, dma_hi_offset*4));
455 456
456 /*TBD >32b phys addr */ 457 recv_phys_addr = (u64)recv_phys_addr_hi << 32 |
457 recv_phys_addr = recv_phys_addr_lo << PAGE_SHIFT; 458 (u64)recv_phys_addr_lo << PAGE_SHIFT;
458 459
459 if (recv_phys_addr != g->sim.msg_bfr.phys) { 460 if (recv_phys_addr != g->sim.msg_bfr.phys) {
460 dev_err(dev_from_gk20a(g), "%s Error in RPC reply\n", 461 dev_err(dev_from_gk20a(g), "%s Error in RPC reply\n",
diff --git a/drivers/gpu/nvgpu/gk20a/sim_gk20a.h b/drivers/gpu/nvgpu/gk20a/sim_gk20a.h
index 5fc8006e..3c21d69e 100644
--- a/drivers/gpu/nvgpu/gk20a/sim_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/sim_gk20a.h
@@ -30,7 +30,7 @@ struct sim_gk20a {
30 struct { 30 struct {
31 struct page *page; 31 struct page *page;
32 void *kvaddr; 32 void *kvaddr;
33 phys_addr_t phys; 33 u64 phys;
34 } send_bfr, recv_bfr, msg_bfr; 34 } send_bfr, recv_bfr, msg_bfr;
35 u32 send_ring_put; 35 u32 send_ring_put;
36 u32 recv_ring_get; 36 u32 recv_ring_get;