diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/as_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/as_gk20a.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/as_gk20a.c b/drivers/gpu/nvgpu/gk20a/as_gk20a.c index d832b792..038fa4c8 100644 --- a/drivers/gpu/nvgpu/gk20a/as_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/as_gk20a.c | |||
@@ -199,14 +199,21 @@ static int gk20a_as_ioctl_get_va_regions( | |||
199 | 199 | ||
200 | for (i = 0; i < write_entries; ++i) { | 200 | for (i = 0; i < write_entries; ++i) { |
201 | struct nvgpu_as_va_region region; | 201 | struct nvgpu_as_va_region region; |
202 | u32 base, limit; | ||
202 | 203 | ||
203 | memset(®ion, 0, sizeof(struct nvgpu_as_va_region)); | 204 | memset(®ion, 0, sizeof(struct nvgpu_as_va_region)); |
204 | 205 | ||
206 | if (!vm->vma[i].constraint.enable) { | ||
207 | base = vm->vma[i].base; | ||
208 | limit = vm->vma[i].limit; | ||
209 | } else { | ||
210 | base = vm->vma[i].constraint.base; | ||
211 | limit = vm->vma[i].constraint.limit; | ||
212 | } | ||
213 | |||
205 | region.page_size = vm->gmmu_page_sizes[i]; | 214 | region.page_size = vm->gmmu_page_sizes[i]; |
206 | region.offset = vm->vma[i].base; | 215 | region.offset = (u64)base * region.page_size; |
207 | /* No __aeabi_uldivmod() on some platforms... */ | 216 | region.pages = limit - base; /* NOTE: limit is exclusive */ |
208 | region.pages = (vm->vma[i].end - vm->vma[i].start) >> | ||
209 | ilog2(region.page_size); | ||
210 | 217 | ||
211 | if (copy_to_user(user_region_ptr + i, ®ion, sizeof(region))) | 218 | if (copy_to_user(user_region_ptr + i, ®ion, sizeof(region))) |
212 | return -EFAULT; | 219 | return -EFAULT; |