diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b')
-rw-r--r-- | drivers/gpu/nvgpu/gp10b/mm_gp10b.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/mm_gp10b.c b/drivers/gpu/nvgpu/gp10b/mm_gp10b.c index bb52aeb0..8cefbd3e 100644 --- a/drivers/gpu/nvgpu/gp10b/mm_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/mm_gp10b.c | |||
@@ -328,9 +328,11 @@ static void update_gmmu_pte_locked(struct vm_gk20a *vm, | |||
328 | * big pages or small pages. | 328 | * big pages or small pages. |
329 | */ | 329 | */ |
330 | static enum gmmu_pgsz_gk20a gp10b_get_pde0_pgsz(struct gk20a *g, | 330 | static enum gmmu_pgsz_gk20a gp10b_get_pde0_pgsz(struct gk20a *g, |
331 | const struct gk20a_mmu_level *l, | ||
331 | struct nvgpu_gmmu_pd *pd, u32 pd_idx) | 332 | struct nvgpu_gmmu_pd *pd, u32 pd_idx) |
332 | { | 333 | { |
333 | u32 pde_base = pd->mem_offs / sizeof(u32); | 334 | u32 pde_base = pd->mem_offs / sizeof(u32); |
335 | u32 pde_offset = pde_base + pd_offset_from_index(l, pd_idx); | ||
334 | u32 pde_v[GP10B_PDE0_ENTRY_SIZE >> 2]; | 336 | u32 pde_v[GP10B_PDE0_ENTRY_SIZE >> 2]; |
335 | u32 i; | 337 | u32 i; |
336 | enum gmmu_pgsz_gk20a pgsz = gmmu_nr_page_sizes; | 338 | enum gmmu_pgsz_gk20a pgsz = gmmu_nr_page_sizes; |
@@ -340,18 +342,17 @@ static enum gmmu_pgsz_gk20a gp10b_get_pde0_pgsz(struct gk20a *g, | |||
340 | 342 | ||
341 | nvgpu_mem_begin(g, pd->mem); | 343 | nvgpu_mem_begin(g, pd->mem); |
342 | for (i = 0; i < GP10B_PDE0_ENTRY_SIZE >> 2; i++) | 344 | for (i = 0; i < GP10B_PDE0_ENTRY_SIZE >> 2; i++) |
343 | pde_v[i] = nvgpu_mem_rd32(g, pd->mem, pde_base + i); | 345 | pde_v[i] = nvgpu_mem_rd32(g, pd->mem, pde_offset + i); |
344 | nvgpu_mem_end(g, pd->mem); | 346 | nvgpu_mem_end(g, pd->mem); |
345 | 347 | ||
346 | /* | 348 | /* |
347 | * Check if the aperture AND address are set | 349 | * Check if the aperture AND address are set |
348 | */ | 350 | */ |
349 | if (pde_v[2] & (gmmu_new_dual_pde_aperture_small_sys_mem_ncoh_f() || | 351 | if (pde_v[2] & (gmmu_new_dual_pde_aperture_small_sys_mem_ncoh_f() | |
350 | gmmu_new_dual_pde_aperture_small_video_memory_f())) { | 352 | gmmu_new_dual_pde_aperture_small_video_memory_f())) { |
351 | u64 addr = ((u64) (pde_v[2] & | 353 | u64 addr = (((u64) pde_v[3] << 32) | (u64) (pde_v[2] & |
352 | gmmu_new_dual_pde_address_small_sys_f(~0)) << | 354 | gmmu_new_dual_pde_address_small_sys_f(~0))) << |
353 | gmmu_new_dual_pde_address_shift_v()) | | 355 | gmmu_new_dual_pde_address_shift_v(); |
354 | ((u64) pde_v[3] << 32); | ||
355 | 356 | ||
356 | if (addr) | 357 | if (addr) |
357 | pgsz = gmmu_page_size_small; | 358 | pgsz = gmmu_page_size_small; |
@@ -359,10 +360,10 @@ static enum gmmu_pgsz_gk20a gp10b_get_pde0_pgsz(struct gk20a *g, | |||
359 | 360 | ||
360 | if (pde_v[0] & (gmmu_new_dual_pde_aperture_big_sys_mem_ncoh_f() | | 361 | if (pde_v[0] & (gmmu_new_dual_pde_aperture_big_sys_mem_ncoh_f() | |
361 | gmmu_new_dual_pde_aperture_big_video_memory_f())) { | 362 | gmmu_new_dual_pde_aperture_big_video_memory_f())) { |
362 | u64 addr = ((u64) (pde_v[0] & | 363 | u64 addr = (((u64) pde_v[1] << 32) | (u64) (pde_v[0] & |
363 | gmmu_new_dual_pde_address_big_sys_f(~0)) << | 364 | gmmu_new_dual_pde_address_big_sys_f(~0))) << |
364 | gmmu_new_dual_pde_address_big_shift_v()) | | 365 | gmmu_new_dual_pde_address_big_shift_v(); |
365 | ((u64) pde_v[1] << 32); | 366 | |
366 | if (addr) { | 367 | if (addr) { |
367 | /* | 368 | /* |
368 | * If small is set that means that somehow MM allowed | 369 | * If small is set that means that somehow MM allowed |
@@ -374,8 +375,8 @@ static enum gmmu_pgsz_gk20a gp10b_get_pde0_pgsz(struct gk20a *g, | |||
374 | "both small and big apertures enabled"); | 375 | "both small and big apertures enabled"); |
375 | return gmmu_nr_page_sizes; | 376 | return gmmu_nr_page_sizes; |
376 | } | 377 | } |
378 | pgsz = gmmu_page_size_big; | ||
377 | } | 379 | } |
378 | pgsz = gmmu_page_size_big; | ||
379 | } | 380 | } |
380 | 381 | ||
381 | return pgsz; | 382 | return pgsz; |