mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 10:34:43 +03:00
gpu: nvgpu: gp10b: Fix PDE/PTE address handling
We were dropping the part of address that span word bounary. The register generator does not know how to real with multi-word fields, to edit things in manually. Bug 1646531 Change-Id: I3ef06d6dfcb0a499ed45456d165fe60c91492250 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/747468
This commit is contained in:
committed by
Deepak Nibade
parent
2907e24e8b
commit
94a7c5ff2c
@@ -72,7 +72,7 @@ static inline u32 gmmu_new_pde_aperture_video_memory_f(void)
|
||||
}
|
||||
static inline u32 gmmu_new_pde_address_sys_f(u32 v)
|
||||
{
|
||||
return (v & 0xffffff) << 8;
|
||||
return (v & 0xfffffff) << 8;
|
||||
}
|
||||
static inline u32 gmmu_new_pde_address_sys_w(void)
|
||||
{
|
||||
@@ -164,7 +164,7 @@ static inline u32 gmmu_new_dual_pde_vol_big_false_f(void)
|
||||
}
|
||||
static inline u32 gmmu_new_dual_pde_address_small_sys_f(u32 v)
|
||||
{
|
||||
return (v & 0xffffff) << 8;
|
||||
return (v & 0xfffffff) << 8;
|
||||
}
|
||||
static inline u32 gmmu_new_dual_pde_address_small_sys_w(void)
|
||||
{
|
||||
@@ -200,7 +200,7 @@ static inline u32 gmmu_new_pte_valid_false_f(void)
|
||||
}
|
||||
static inline u32 gmmu_new_pte_address_sys_f(u32 v)
|
||||
{
|
||||
return (v & 0xffffff) << 8;
|
||||
return (v & 0xfffffff) << 8;
|
||||
}
|
||||
static inline u32 gmmu_new_pte_address_sys_w(void)
|
||||
{
|
||||
|
||||
@@ -171,7 +171,7 @@ static int update_gmmu_pde3_locked(struct vm_gk20a *vm,
|
||||
pde_v[0] |= gmmu_new_pde_aperture_video_memory_f();
|
||||
pde_v[0] |= gmmu_new_pde_address_sys_f(u64_lo32(pte_addr));
|
||||
pde_v[0] |= gmmu_new_pde_vol_true_f();
|
||||
|
||||
pde_v[1] |= pte_addr >> 24;
|
||||
pde = pde3_from_index(parent, i);
|
||||
|
||||
gk20a_mem_wr32(pde, 0, pde_v[0]);
|
||||
@@ -222,12 +222,14 @@ static int update_gmmu_pde0_locked(struct vm_gk20a *vm,
|
||||
pde_v[2] |= gmmu_new_dual_pde_address_small_sys_f(pte_addr_small);
|
||||
pde_v[2] |= gmmu_new_dual_pde_aperture_small_video_memory_f();
|
||||
pde_v[2] |= gmmu_new_dual_pde_vol_small_true_f();
|
||||
pde_v[3] |= pte_addr_small >> 24;
|
||||
}
|
||||
|
||||
if (big_valid) {
|
||||
pde_v[0] |= gmmu_new_dual_pde_address_big_sys_f(pte_addr_big);
|
||||
pde_v[0] |= gmmu_new_dual_pde_vol_big_true_f();
|
||||
pde_v[0] |= gmmu_new_dual_pde_aperture_big_video_memory_f();
|
||||
pde_v[1] |= pte_addr_big >> 28;
|
||||
}
|
||||
|
||||
pde = pde0_from_index(pte, i);
|
||||
@@ -269,7 +271,8 @@ static int update_gmmu_pte_locked(struct vm_gk20a *vm,
|
||||
gmmu_new_pte_address_sys_f(*iova
|
||||
>> gmmu_new_pte_address_shift_v());
|
||||
|
||||
pte_w[1] = gmmu_new_pte_kind_f(kind_v) |
|
||||
pte_w[1] = *iova >> (24 + gmmu_new_pte_address_shift_v()) |
|
||||
gmmu_new_pte_kind_f(kind_v) |
|
||||
gmmu_new_pte_comptagline_f(*ctag / ctag_granularity);
|
||||
|
||||
if (rw_flag == gk20a_mem_flag_read_only)
|
||||
|
||||
Reference in New Issue
Block a user