diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.c | 33 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/sim_gk20a.h | 2 |
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 | ||
239 | static int alloc_and_kmap_iopage(struct device *d, | 239 | static 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 | ||
433 | static int rpc_recv_poll(struct gk20a *g) | 434 | static 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; |