summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2015-04-09 13:28:25 -0400
committerAlexander Van Brunt <avanbrunt@nvidia.com>2015-05-05 16:58:52 -0400
commit852822b2ef9b14113c1ff9fef6f352321b6700db (patch)
tree6834517106b41fe53ea39062b73dfb888587fbf4 /drivers/gpu/nvgpu/gk20a
parent2204f2a524af40d8e5fa0f3d764b61fefa397989 (diff)
gpu: nvgpu: Record size of page table level
Record size of each page table level. The size of level 0 depends on size of the address space, and we generally do not support the whole address space. Change-Id: Iab47505af1a641e193d9e98a2246e522813f221a Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/729730 Reviewed-by: Automatic_Commit_Validation_User Reviewed-on: http://git-master/r/737531 Reviewed-by: Alexander Van Brunt <avanbrunt@nvidia.com> Tested-by: Alexander Van Brunt <avanbrunt@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c9
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.h1
2 files changed, 6 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index bde8afae..4c0a773c 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -1984,9 +1984,10 @@ static int update_gmmu_level_locked(struct vm_gk20a *vm,
1984 pte->entries = 1984 pte->entries =
1985 kzalloc(sizeof(struct gk20a_mm_entry) * 1985 kzalloc(sizeof(struct gk20a_mm_entry) *
1986 num_entries, GFP_KERNEL); 1986 num_entries, GFP_KERNEL);
1987 pte->pgsz = pgsz_idx;
1988 if (!pte->entries) 1987 if (!pte->entries)
1989 return -ENOMEM; 1988 return -ENOMEM;
1989 pte->pgsz = pgsz_idx;
1990 pte->num_entries = num_entries;
1990 } 1991 }
1991 next_pte = pte->entries + pde_i; 1992 next_pte = pte->entries + pde_i;
1992 1993
@@ -2153,17 +2154,16 @@ static void gk20a_vm_free_entries(struct vm_gk20a *vm,
2153 struct gk20a_mm_entry *parent, 2154 struct gk20a_mm_entry *parent,
2154 int level) 2155 int level)
2155{ 2156{
2156 const struct gk20a_mmu_level *l = &vm->mmu_levels[level];
2157 int num_entries = 1 << (l->hi_bit[parent->pgsz] - l->lo_bit[parent->pgsz]);
2158 int i; 2157 int i;
2159 2158
2160 if (parent->entries) 2159 if (parent->entries)
2161 for (i = 0; i < num_entries; i++) 2160 for (i = 0; i < parent->num_entries; i++)
2162 gk20a_vm_free_entries(vm, &parent->entries[i], level+1); 2161 gk20a_vm_free_entries(vm, &parent->entries[i], level+1);
2163 2162
2164 if (parent->size) 2163 if (parent->size)
2165 free_gmmu_pages(vm, parent); 2164 free_gmmu_pages(vm, parent);
2166 kfree(parent->entries); 2165 kfree(parent->entries);
2166 parent->entries = NULL;
2167} 2167}
2168 2168
2169static void gk20a_vm_remove_support_nofree(struct vm_gk20a *vm) 2169static void gk20a_vm_remove_support_nofree(struct vm_gk20a *vm)
@@ -2288,6 +2288,7 @@ int gk20a_init_vm(struct mm_gk20a *mm,
2288 &pde_lo, &pde_hi); 2288 &pde_lo, &pde_hi);
2289 vm->pdb.entries = kzalloc(sizeof(struct gk20a_mm_entry) * 2289 vm->pdb.entries = kzalloc(sizeof(struct gk20a_mm_entry) *
2290 (pde_hi + 1), GFP_KERNEL); 2290 (pde_hi + 1), GFP_KERNEL);
2291 vm->pdb.num_entries = pde_hi + 1;
2291 2292
2292 if (!vm->pdb.entries) 2293 if (!vm->pdb.entries)
2293 return -ENOMEM; 2294 return -ENOMEM;
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
index df9ebec3..f6806309 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
@@ -150,6 +150,7 @@ struct gk20a_mm_entry {
150 size_t size; 150 size_t size;
151 int pgsz; 151 int pgsz;
152 struct gk20a_mm_entry *entries; 152 struct gk20a_mm_entry *entries;
153 int num_entries;
153}; 154};
154 155
155struct priv_cmd_queue { 156struct priv_cmd_queue {