summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/nvgpu/common/mm/vm.c15
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/vm.h14
2 files changed, 27 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/common/mm/vm.c b/drivers/gpu/nvgpu/common/mm/vm.c
index ee9d2e0b..e90437a3 100644
--- a/drivers/gpu/nvgpu/common/mm/vm.c
+++ b/drivers/gpu/nvgpu/common/mm/vm.c
@@ -109,6 +109,11 @@ u64 __nvgpu_vm_alloc_va(struct vm_gk20a *vm, u64 size,
109 109
110 vma = vm->vma[pgsz_idx]; 110 vma = vm->vma[pgsz_idx];
111 111
112 if (vm->guest_managed) {
113 nvgpu_err(g, "Illegal GPU allocation on behalf of guest OS");
114 return 0;
115 }
116
112 if (pgsz_idx >= gmmu_nr_page_sizes) { 117 if (pgsz_idx >= gmmu_nr_page_sizes) {
113 nvgpu_err(g, "(%s) invalid page size requested", vma->name); 118 nvgpu_err(g, "(%s) invalid page size requested", vma->name);
114 return 0; 119 return 0;
@@ -237,7 +242,10 @@ static int nvgpu_init_sema_pool(struct vm_gk20a *vm)
237 return 0; 242 return 0;
238} 243}
239 244
240static int __nvgpu_vm_init(struct mm_gk20a *mm, 245/*
246 * Initialize a preallocated vm
247 */
248int __nvgpu_vm_init(struct mm_gk20a *mm,
241 struct vm_gk20a *vm, 249 struct vm_gk20a *vm,
242 u32 big_page_size, 250 u32 big_page_size,
243 u64 low_hole, 251 u64 low_hole,
@@ -258,6 +266,9 @@ static int __nvgpu_vm_init(struct mm_gk20a *mm,
258 if (WARN_ON(kernel_reserved + low_hole > aperture_size)) 266 if (WARN_ON(kernel_reserved + low_hole > aperture_size))
259 return -ENOMEM; 267 return -ENOMEM;
260 268
269 if (WARN_ON(vm->guest_managed && kernel_reserved != 0))
270 return -EINVAL;
271
261 nvgpu_log_info(g, "Init space for %s: valimit=0x%llx, " 272 nvgpu_log_info(g, "Init space for %s: valimit=0x%llx, "
262 "LP size=0x%x lowhole=0x%llx", 273 "LP size=0x%x lowhole=0x%llx",
263 name, aperture_size, 274 name, aperture_size,
@@ -337,7 +348,7 @@ static int __nvgpu_vm_init(struct mm_gk20a *mm,
337 348
338 if (WARN_ON(user_vma_start > user_vma_limit) || 349 if (WARN_ON(user_vma_start > user_vma_limit) ||
339 WARN_ON(user_lp_vma_start > user_lp_vma_limit) || 350 WARN_ON(user_lp_vma_start > user_lp_vma_limit) ||
340 WARN_ON(kernel_vma_start >= kernel_vma_limit)) { 351 WARN_ON(!vm->guest_managed && kernel_vma_start >= kernel_vma_limit)) {
341 err = -EINVAL; 352 err = -EINVAL;
342 goto clean_up_page_tables; 353 goto clean_up_page_tables;
343 } 354 }
diff --git a/drivers/gpu/nvgpu/include/nvgpu/vm.h b/drivers/gpu/nvgpu/include/nvgpu/vm.h
index e091f181..1689444c 100644
--- a/drivers/gpu/nvgpu/include/nvgpu/vm.h
+++ b/drivers/gpu/nvgpu/include/nvgpu/vm.h
@@ -150,6 +150,7 @@ struct vm_gk20a {
150 150
151 bool big_pages; /* enable large page support */ 151 bool big_pages; /* enable large page support */
152 bool enable_ctag; 152 bool enable_ctag;
153 bool guest_managed; /* whether the vm addr space is managed by guest */
153 154
154 u32 big_page_size; 155 u32 big_page_size;
155 156
@@ -284,6 +285,19 @@ int nvgpu_insert_mapped_buf(struct vm_gk20a *vm,
284void nvgpu_remove_mapped_buf(struct vm_gk20a *vm, 285void nvgpu_remove_mapped_buf(struct vm_gk20a *vm,
285 struct nvgpu_mapped_buf *mapped_buffer); 286 struct nvgpu_mapped_buf *mapped_buffer);
286 287
288/*
289 * Initialize a preallocated vm
290 */
291int __nvgpu_vm_init(struct mm_gk20a *mm,
292 struct vm_gk20a *vm,
293 u32 big_page_size,
294 u64 low_hole,
295 u64 kernel_reserved,
296 u64 aperture_size,
297 bool big_pages,
298 bool userspace_managed,
299 char *name);
300
287struct vm_gk20a *nvgpu_vm_init(struct gk20a *g, 301struct vm_gk20a *nvgpu_vm_init(struct gk20a *g,
288 u32 big_page_size, 302 u32 big_page_size,
289 u64 low_hole, 303 u64 low_hole,