summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorAlex Waterman <alexw@nvidia.com>2017-06-07 20:32:56 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-08-04 17:54:32 -0400
commit1da69dd8b2c60a11e112844dd4e9636a913a99a0 (patch)
tree56e6912518e205b1e999881cb02f7fa504878846 /drivers/gpu/nvgpu/gk20a
parent192cf8c1f8d1005ab08619c9152d514dec3a34ef (diff)
gpu: nvgpu: Remove mm.get_iova_addr
Remove the mm.get_iova_addr() HAL and replace it with a new HAL called mm.gpu_phys_addr(). This new HAL provides the real phys address that should be passed to the GPU from a physical address obtained from a scatter list. It also provides a mechanism by which the HAL code can add extra bits to a GPU physical address based on the attributes passed in. This is necessary during GMMU page table programming. Also remove the flags argument from the various address functions. This flag was used for adding an IO coherence bit to the GPU physical address which is not supported. JIRA NVGPU-30 Change-Id: I69af5b1c6bd905c4077c26c098fac101c6b41a33 Signed-off-by: Alex Waterman <alexw@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1530864 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/fb_gk20a.c5
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c7
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h2
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c4
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c53
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.h5
6 files changed, 17 insertions, 59 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fb_gk20a.c b/drivers/gpu/nvgpu/gk20a/fb_gk20a.c
index c5f9c1fd..79f469cd 100644
--- a/drivers/gpu/nvgpu/gk20a/fb_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fb_gk20a.c
@@ -44,8 +44,7 @@ void fb_gk20a_reset(struct gk20a *g)
44 44
45void gk20a_fb_init_hw(struct gk20a *g) 45void gk20a_fb_init_hw(struct gk20a *g)
46{ 46{
47 u32 addr = g->ops.mm.get_iova_addr(g, 47 u32 addr = nvgpu_mem_get_addr(g, &g->mm.sysmem_flush) >> 8;
48 g->mm.sysmem_flush.priv.sgt->sgl, 0) >> 8;
49 48
50 gk20a_writel(g, fb_niso_flush_sysmem_addr_r(), addr); 49 gk20a_writel(g, fb_niso_flush_sysmem_addr_r(), addr);
51} 50}
@@ -67,7 +66,7 @@ void gk20a_fb_tlb_invalidate(struct gk20a *g, struct nvgpu_mem *pdb)
67 if (!g->power_on) 66 if (!g->power_on)
68 return; 67 return;
69 68
70 addr_lo = u64_lo32(nvgpu_mem_get_base_addr(g, pdb, 0) >> 12); 69 addr_lo = u64_lo32(nvgpu_mem_get_addr(g, pdb) >> 12);
71 70
72 nvgpu_mutex_acquire(&g->mm.tlb_lock); 71 nvgpu_mutex_acquire(&g->mm.tlb_lock);
73 72
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index 347ee7dd..c0fef59d 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -891,8 +891,8 @@ static int gk20a_init_fifo_setup_sw(struct gk20a *g)
891 891
892 for (chid = 0; chid < f->num_channels; chid++) { 892 for (chid = 0; chid < f->num_channels; chid++) {
893 f->channel[chid].userd_iova = 893 f->channel[chid].userd_iova =
894 g->ops.mm.get_iova_addr(g, f->userd.priv.sgt->sgl, 0) 894 nvgpu_mem_get_addr(g, &f->userd) +
895 + chid * f->userd_entry_size; 895 chid * f->userd_entry_size;
896 f->channel[chid].userd_gpu_va = 896 f->channel[chid].userd_gpu_va =
897 f->userd.gpu_va + chid * f->userd_entry_size; 897 f->userd.gpu_va + chid * f->userd_entry_size;
898 gk20a_init_channel_support(g, chid); 898 gk20a_init_channel_support(g, chid);
@@ -3106,8 +3106,7 @@ static int gk20a_fifo_update_runlist_locked(struct gk20a *g, u32 runlist_id,
3106 old_buf = runlist->cur_buffer; 3106 old_buf = runlist->cur_buffer;
3107 new_buf = !runlist->cur_buffer; 3107 new_buf = !runlist->cur_buffer;
3108 3108
3109 runlist_iova = g->ops.mm.get_iova_addr( 3109 runlist_iova = nvgpu_mem_get_addr(g, &runlist->mem[new_buf]);
3110 g, runlist->mem[new_buf].priv.sgt->sgl, 0);
3111 3110
3112 gk20a_dbg_info("runlist_id : %d, switch to new buffer 0x%16llx", 3111 gk20a_dbg_info("runlist_id : %d, switch to new buffer 0x%16llx",
3113 runlist_id, (u64)runlist_iova); 3112 runlist_id, (u64)runlist_iova);
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index 4517f6e0..7b998204 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -730,8 +730,6 @@ struct gpu_ops {
730 struct vm_gk20a *vm); 730 struct vm_gk20a *vm);
731 u64 (*gpu_phys_addr)(struct gk20a *g, 731 u64 (*gpu_phys_addr)(struct gk20a *g,
732 struct nvgpu_gmmu_attrs *attrs, u64 phys); 732 struct nvgpu_gmmu_attrs *attrs, u64 phys);
733 u64 (*get_iova_addr)(struct gk20a *g, struct scatterlist *sgl,
734 u32 flags);
735 size_t (*get_vidmem_size)(struct gk20a *g); 733 size_t (*get_vidmem_size)(struct gk20a *g);
736 void (*init_inst_block)(struct nvgpu_mem *inst_block, 734 void (*init_inst_block)(struct nvgpu_mem *inst_block,
737 struct vm_gk20a *vm, u32 big_page_size); 735 struct vm_gk20a *vm, u32 big_page_size);
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 1fc57a56..497e7ee2 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -4443,7 +4443,7 @@ static int gk20a_init_gr_setup_hw(struct gk20a *g)
4443 gk20a_dbg_fn(""); 4443 gk20a_dbg_fn("");
4444 4444
4445 /* init mmu debug buffer */ 4445 /* init mmu debug buffer */
4446 addr = g->ops.mm.get_iova_addr(g, gr->mmu_wr_mem.priv.sgt->sgl, 0); 4446 addr = nvgpu_mem_get_addr(g, &gr->mmu_wr_mem);
4447 addr >>= fb_mmu_debug_wr_addr_alignment_v(); 4447 addr >>= fb_mmu_debug_wr_addr_alignment_v();
4448 4448
4449 gk20a_writel(g, fb_mmu_debug_wr_r(), 4449 gk20a_writel(g, fb_mmu_debug_wr_r(),
@@ -4453,7 +4453,7 @@ static int gk20a_init_gr_setup_hw(struct gk20a *g)
4453 fb_mmu_debug_wr_vol_false_f() | 4453 fb_mmu_debug_wr_vol_false_f() |
4454 fb_mmu_debug_wr_addr_f(addr)); 4454 fb_mmu_debug_wr_addr_f(addr));
4455 4455
4456 addr = g->ops.mm.get_iova_addr(g, gr->mmu_rd_mem.priv.sgt->sgl, 0); 4456 addr = nvgpu_mem_get_addr(g, &gr->mmu_rd_mem);
4457 addr >>= fb_mmu_debug_rd_addr_alignment_v(); 4457 addr >>= fb_mmu_debug_rd_addr_alignment_v();
4458 4458
4459 gk20a_writel(g, fb_mmu_debug_rd_r(), 4459 gk20a_writel(g, fb_mmu_debug_rd_r(),
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index f4395116..16fe7149 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -1383,7 +1383,7 @@ int nvgpu_vm_map_compbits(struct vm_gk20a *vm,
1383 return -EINVAL; 1383 return -EINVAL;
1384 } 1384 }
1385 1385
1386 *mapping_iova = gk20a_mm_iova_addr(g, mapped_buffer->sgt->sgl, 0); 1386 *mapping_iova = nvgpu_mem_get_addr_sgl(g, mapped_buffer->sgt->sgl);
1387 *compbits_win_gva = mapped_buffer->ctag_map_win_addr; 1387 *compbits_win_gva = mapped_buffer->ctag_map_win_addr;
1388 1388
1389 nvgpu_mutex_release(&vm->update_gmmu_lock); 1389 nvgpu_mutex_release(&vm->update_gmmu_lock);
@@ -1454,30 +1454,6 @@ static int gk20a_gmmu_clear_vidmem_mem(struct gk20a *g, struct nvgpu_mem *mem)
1454} 1454}
1455#endif 1455#endif
1456 1456
1457/*
1458 * If mem is in VIDMEM, return base address in vidmem
1459 * else return IOVA address for SYSMEM
1460 */
1461u64 nvgpu_mem_get_base_addr(struct gk20a *g, struct nvgpu_mem *mem,
1462 u32 flags)
1463{
1464 struct nvgpu_page_alloc *alloc;
1465 u64 addr;
1466
1467 if (mem->aperture == APERTURE_VIDMEM) {
1468 alloc = get_vidmem_page_alloc(mem->priv.sgt->sgl);
1469
1470 /* This API should not be used with > 1 chunks */
1471 WARN_ON(alloc->nr_chunks != 1);
1472
1473 addr = alloc->base;
1474 } else {
1475 addr = g->ops.mm.get_iova_addr(g, mem->priv.sgt->sgl, flags);
1476 }
1477
1478 return addr;
1479}
1480
1481#if defined(CONFIG_GK20A_VIDMEM) 1457#if defined(CONFIG_GK20A_VIDMEM)
1482static struct nvgpu_mem *get_pending_mem_desc(struct mm_gk20a *mm) 1458static struct nvgpu_mem *get_pending_mem_desc(struct mm_gk20a *mm)
1483{ 1459{
@@ -1526,8 +1502,7 @@ dma_addr_t gk20a_mm_gpuva_to_iova_base(struct vm_gk20a *vm, u64 gpu_vaddr)
1526 nvgpu_mutex_acquire(&vm->update_gmmu_lock); 1502 nvgpu_mutex_acquire(&vm->update_gmmu_lock);
1527 buffer = __nvgpu_vm_find_mapped_buf(vm, gpu_vaddr); 1503 buffer = __nvgpu_vm_find_mapped_buf(vm, gpu_vaddr);
1528 if (buffer) 1504 if (buffer)
1529 addr = g->ops.mm.get_iova_addr(g, buffer->sgt->sgl, 1505 addr = nvgpu_mem_get_addr_sgl(g, buffer->sgt->sgl);
1530 buffer->flags);
1531 nvgpu_mutex_release(&vm->update_gmmu_lock); 1506 nvgpu_mutex_release(&vm->update_gmmu_lock);
1532 1507
1533 return addr; 1508 return addr;
@@ -1545,21 +1520,6 @@ u64 gk20a_mm_smmu_vaddr_translate(struct gk20a *g, dma_addr_t iova)
1545 return iova; 1520 return iova;
1546} 1521}
1547 1522
1548u64 gk20a_mm_iova_addr(struct gk20a *g, struct scatterlist *sgl,
1549 u32 flags)
1550{
1551 if (!device_is_iommuable(dev_from_gk20a(g)))
1552 return sg_phys(sgl);
1553
1554 if (sg_dma_address(sgl) == 0)
1555 return sg_phys(sgl);
1556
1557 if (sg_dma_address(sgl) == DMA_ERROR_CODE)
1558 return 0;
1559
1560 return gk20a_mm_smmu_vaddr_translate(g, sg_dma_address(sgl));
1561}
1562
1563/* for gk20a the "video memory" apertures here are misnomers. */ 1523/* for gk20a the "video memory" apertures here are misnomers. */
1564static inline u32 big_valid_pde0_bits(struct gk20a *g, 1524static inline u32 big_valid_pde0_bits(struct gk20a *g,
1565 struct nvgpu_gmmu_pd *pd, u64 addr) 1525 struct nvgpu_gmmu_pd *pd, u64 addr)
@@ -2071,7 +2031,7 @@ u64 gk20a_mm_inst_block_addr(struct gk20a *g, struct nvgpu_mem *inst_block)
2071 if (g->mm.has_physical_mode) 2031 if (g->mm.has_physical_mode)
2072 addr = gk20a_mem_phys(inst_block); 2032 addr = gk20a_mem_phys(inst_block);
2073 else 2033 else
2074 addr = nvgpu_mem_get_base_addr(g, inst_block, 0); 2034 addr = nvgpu_mem_get_addr(g, inst_block);
2075 2035
2076 return addr; 2036 return addr;
2077} 2037}
@@ -2194,7 +2154,7 @@ static int gk20a_init_ce_vm(struct mm_gk20a *mm)
2194void gk20a_mm_init_pdb(struct gk20a *g, struct nvgpu_mem *inst_block, 2154void gk20a_mm_init_pdb(struct gk20a *g, struct nvgpu_mem *inst_block,
2195 struct vm_gk20a *vm) 2155 struct vm_gk20a *vm)
2196{ 2156{
2197 u64 pdb_addr = nvgpu_mem_get_base_addr(g, vm->pdb.mem, 0); 2157 u64 pdb_addr = nvgpu_mem_get_addr(g, vm->pdb.mem);
2198 u32 pdb_addr_lo = u64_lo32(pdb_addr >> ram_in_base_shift_v()); 2158 u32 pdb_addr_lo = u64_lo32(pdb_addr >> ram_in_base_shift_v());
2199 u32 pdb_addr_hi = u64_hi32(pdb_addr); 2159 u32 pdb_addr_hi = u64_hi32(pdb_addr);
2200 2160
@@ -2465,6 +2425,11 @@ u32 gk20a_mm_get_physical_addr_bits(struct gk20a *g)
2465 return 34; 2425 return 34;
2466} 2426}
2467 2427
2428u64 gk20a_mm_gpu_phys_addr(struct gk20a *g, u64 phys, u32 flags)
2429{
2430 return phys;
2431}
2432
2468const struct gk20a_mmu_level *gk20a_mm_get_mmu_levels(struct gk20a *g, 2433const struct gk20a_mmu_level *gk20a_mm_get_mmu_levels(struct gk20a *g,
2469 u32 big_page_size) 2434 u32 big_page_size)
2470{ 2435{
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
index c56b28bb..93baa943 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
@@ -345,11 +345,8 @@ void gk20a_mm_dump_vm(struct vm_gk20a *vm,
345 345
346int gk20a_mm_suspend(struct gk20a *g); 346int gk20a_mm_suspend(struct gk20a *g);
347 347
348u64 gk20a_mm_iova_addr(struct gk20a *g, struct scatterlist *sgl, 348u64 gk20a_mm_gpu_phys_addr(struct gk20a *g, u64 phys, u32 flags);
349 u32 flags);
350u64 gk20a_mm_smmu_vaddr_translate(struct gk20a *g, dma_addr_t iova); 349u64 gk20a_mm_smmu_vaddr_translate(struct gk20a *g, dma_addr_t iova);
351u64 nvgpu_mem_get_base_addr(struct gk20a *g, struct nvgpu_mem *mem,
352 u32 flags);
353 350
354void gk20a_mm_ltc_isr(struct gk20a *g); 351void gk20a_mm_ltc_isr(struct gk20a *g);
355 352