summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2016-03-31 14:13:42 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-04-15 11:50:34 -0400
commit7d8e2193893454bc8e05543c956fab32b8eed54b (patch)
treeafb73b81611136fd0411e17995532d6d22b0499f /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parent6839341bf8ffafa115cfc0427bba694ee1d131f3 (diff)
gpu: nvgpu: Use sysmem aperture for SoC memory
In Tegra GPU, SoC memory has to be accessed as vidmem. In discrete GPU, it has to be accessed as sysmem. Change-Id: I4efe71b54a9a32f0bf1f02ec4016ed74405a14c5 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/1120468
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 519faeeb..5c3f83a6 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -497,7 +497,9 @@ int gk20a_init_mm_setup_hw(struct gk20a *g)
497 gk20a_dbg_info("bar1 inst block ptr: 0x%08x", (u32)inst_pa); 497 gk20a_dbg_info("bar1 inst block ptr: 0x%08x", (u32)inst_pa);
498 498
499 gk20a_writel(g, bus_bar1_block_r(), 499 gk20a_writel(g, bus_bar1_block_r(),
500 bus_bar1_block_target_vid_mem_f() | 500 (g->mm.vidmem_is_vidmem ?
501 bus_bar1_block_target_sys_mem_ncoh_f() :
502 bus_bar1_block_target_vid_mem_f()) |
501 bus_bar1_block_mode_virtual_f() | 503 bus_bar1_block_mode_virtual_f() |
502 bus_bar1_block_ptr_f(inst_pa)); 504 bus_bar1_block_ptr_f(inst_pa));
503 505
@@ -2271,19 +2273,23 @@ u64 gk20a_mm_iova_addr(struct gk20a *g, struct scatterlist *sgl,
2271} 2273}
2272 2274
2273/* for gk20a the "video memory" apertures here are misnomers. */ 2275/* for gk20a the "video memory" apertures here are misnomers. */
2274static inline u32 big_valid_pde0_bits(u64 pte_addr) 2276static inline u32 big_valid_pde0_bits(struct gk20a *g, u64 pte_addr)
2275{ 2277{
2276 u32 pde0_bits = 2278 u32 pde0_bits =
2277 gmmu_pde_aperture_big_video_memory_f() | 2279 (g->mm.vidmem_is_vidmem ?
2280 gmmu_pde_aperture_big_sys_mem_ncoh_f() :
2281 gmmu_pde_aperture_big_video_memory_f()) |
2278 gmmu_pde_address_big_sys_f( 2282 gmmu_pde_address_big_sys_f(
2279 (u32)(pte_addr >> gmmu_pde_address_shift_v())); 2283 (u32)(pte_addr >> gmmu_pde_address_shift_v()));
2280 return pde0_bits; 2284 return pde0_bits;
2281} 2285}
2282 2286
2283static inline u32 small_valid_pde1_bits(u64 pte_addr) 2287static inline u32 small_valid_pde1_bits(struct gk20a *g, u64 pte_addr)
2284{ 2288{
2285 u32 pde1_bits = 2289 u32 pde1_bits =
2286 gmmu_pde_aperture_small_video_memory_f() | 2290 (g->mm.vidmem_is_vidmem ?
2291 gmmu_pde_aperture_small_sys_mem_ncoh_f() :
2292 gmmu_pde_aperture_small_video_memory_f()) |
2287 gmmu_pde_vol_small_true_f() | /* tbd: why? */ 2293 gmmu_pde_vol_small_true_f() | /* tbd: why? */
2288 gmmu_pde_address_small_sys_f( 2294 gmmu_pde_address_small_sys_f(
2289 (u32)(pte_addr >> gmmu_pde_address_shift_v())); 2295 (u32)(pte_addr >> gmmu_pde_address_shift_v()));
@@ -2325,11 +2331,11 @@ static int update_gmmu_pde_locked(struct vm_gk20a *vm,
2325 pte_addr_big = g->ops.mm.get_iova_addr(g, entry->sgt->sgl, 0); 2331 pte_addr_big = g->ops.mm.get_iova_addr(g, entry->sgt->sgl, 0);
2326 2332
2327 pde_v[0] = gmmu_pde_size_full_f(); 2333 pde_v[0] = gmmu_pde_size_full_f();
2328 pde_v[0] |= big_valid ? big_valid_pde0_bits(pte_addr_big) : 2334 pde_v[0] |= big_valid ? big_valid_pde0_bits(g, pte_addr_big) :
2329 (gmmu_pde_aperture_big_invalid_f()); 2335 (gmmu_pde_aperture_big_invalid_f());
2330 2336
2331 pde_v[1] |= (small_valid ? 2337 pde_v[1] |= (small_valid ?
2332 small_valid_pde1_bits(pte_addr_small) : 2338 small_valid_pde1_bits(g, pte_addr_small) :
2333 (gmmu_pde_aperture_small_invalid_f() | 2339 (gmmu_pde_aperture_small_invalid_f() |
2334 gmmu_pde_vol_small_false_f())) 2340 gmmu_pde_vol_small_false_f()))
2335 | 2341 |
@@ -2374,7 +2380,9 @@ static int update_gmmu_pte_locked(struct vm_gk20a *vm,
2374 if (priv) 2380 if (priv)
2375 pte_w[0] |= gmmu_pte_privilege_true_f(); 2381 pte_w[0] |= gmmu_pte_privilege_true_f();
2376 2382
2377 pte_w[1] = gmmu_pte_aperture_video_memory_f() | 2383 pte_w[1] = (g->mm.vidmem_is_vidmem ?
2384 gmmu_pte_aperture_sys_mem_ncoh_f() :
2385 gmmu_pte_aperture_video_memory_f()) |
2378 gmmu_pte_kind_f(kind_v) | 2386 gmmu_pte_kind_f(kind_v) |
2379 gmmu_pte_comptagline_f((u32)(*ctag >> ctag_shift)); 2387 gmmu_pte_comptagline_f((u32)(*ctag >> ctag_shift));
2380 2388
@@ -3482,7 +3490,9 @@ void gk20a_mm_init_pdb(struct gk20a *g, void *inst_ptr, u64 pdb_addr)
3482 u32 pdb_addr_hi = u64_hi32(pdb_addr); 3490 u32 pdb_addr_hi = u64_hi32(pdb_addr);
3483 3491
3484 gk20a_mem_wr32(inst_ptr, ram_in_page_dir_base_lo_w(), 3492 gk20a_mem_wr32(inst_ptr, ram_in_page_dir_base_lo_w(),
3485 ram_in_page_dir_base_target_vid_mem_f() | 3493 (g->mm.vidmem_is_vidmem ?
3494 ram_in_page_dir_base_target_sys_mem_ncoh_f() :
3495 ram_in_page_dir_base_target_vid_mem_f()) |
3486 ram_in_page_dir_base_vol_true_f() | 3496 ram_in_page_dir_base_vol_true_f() |
3487 ram_in_page_dir_base_lo_f(pdb_addr_lo)); 3497 ram_in_page_dir_base_lo_f(pdb_addr_lo));
3488 3498
@@ -3774,7 +3784,9 @@ void gk20a_mm_tlb_invalidate(struct vm_gk20a *vm)
3774 3784
3775 gk20a_writel(g, fb_mmu_invalidate_pdb_r(), 3785 gk20a_writel(g, fb_mmu_invalidate_pdb_r(),
3776 fb_mmu_invalidate_pdb_addr_f(addr_lo) | 3786 fb_mmu_invalidate_pdb_addr_f(addr_lo) |
3777 fb_mmu_invalidate_pdb_aperture_vid_mem_f()); 3787 (g->mm.vidmem_is_vidmem ?
3788 fb_mmu_invalidate_pdb_aperture_sys_mem_f() :
3789 fb_mmu_invalidate_pdb_aperture_vid_mem_f()));
3778 3790
3779 gk20a_writel(g, fb_mmu_invalidate_r(), 3791 gk20a_writel(g, fb_mmu_invalidate_r(),
3780 fb_mmu_invalidate_all_va_true_f() | 3792 fb_mmu_invalidate_all_va_true_f() |