1 // SPDX-License-Identifier: MIT
2
3 /*
4 * Locking:
5 *
6 * The uvmm mutex protects any operations on the GPU VA space provided by the
7 * DRM GPU VA manager.
8 *
9 * The GEMs dma_resv lock protects the GEMs GPUVA list, hence link/unlink of a
10 * mapping to it's backing GEM must be performed under this lock.
11 *
12 * Actual map/unmap operations within the fence signalling critical path are
13 * protected by installing DMA fences to the corresponding GEMs DMA
14 * reservations, such that concurrent BO moves, which itself walk the GEMs GPUVA
15 * list in order to map/unmap it's entries, can't occur concurrently.
16 *
17 * Accessing the DRM_GPUVA_INVALIDATED flag doesn't need any separate
18 * protection, since there are no accesses other than from BO move callbacks
19 * and from the fence signalling critical path, which are already protected by
20 * the corresponding GEMs DMA reservation fence.
21 */
22
23 #include "nouveau_drv.h"
24 #include "nouveau_gem.h"
25 #include "nouveau_mem.h"
26 #include "nouveau_uvmm.h"
27
28 #include <nvif/vmm.h>
29 #include <nvif/mem.h>
30
31 #include <nvif/class.h>
32 #include <nvif/if000c.h>
33 #include <nvif/if900d.h>
34
35 #define NOUVEAU_VA_SPACE_BITS 47 /* FIXME */
36 #define NOUVEAU_VA_SPACE_START 0x0
37 #define NOUVEAU_VA_SPACE_END (1ULL << NOUVEAU_VA_SPACE_BITS)
38
39 #define list_last_op(_ops) list_last_entry(_ops, struct bind_job_op, entry)
40 #define list_prev_op(_op) list_prev_entry(_op, entry)
41 #define list_for_each_op(_op, _ops) list_for_each_entry(_op, _ops, entry)
42 #define list_for_each_op_from_reverse(_op, _ops) \
43 list_for_each_entry_from_reverse(_op, _ops, entry)
44 #define list_for_each_op_safe(_op, _n, _ops) list_for_each_entry_safe(_op, _n, _ops, entry)
45
46 enum vm_bind_op {
47 OP_MAP = DRM_NOUVEAU_VM_BIND_OP_MAP,
48 OP_UNMAP = DRM_NOUVEAU_VM_BIND_OP_UNMAP,
49 OP_MAP_SPARSE,
50 OP_UNMAP_SPARSE,
51 };
52
53 struct nouveau_uvma_prealloc {
54 struct nouveau_uvma *map;
55 struct nouveau_uvma *prev;
56 struct nouveau_uvma *next;
57 };
58
59 struct bind_job_op {
60 struct list_head entry;
61
62 enum vm_bind_op op;
63 u32 flags;
64
65 struct drm_gpuvm_bo *vm_bo;
66
67 struct {
68 u64 addr;
69 u64 range;
70 } va;
71
72 struct {
73 u32 handle;
74 u64 offset;
75 struct drm_gem_object *obj;
76 } gem;
77
78 struct nouveau_uvma_region *reg;
79 struct nouveau_uvma_prealloc new;
80 struct drm_gpuva_ops *ops;
81 };
82
83 struct uvmm_map_args {
84 struct nouveau_uvma_region *region;
85 u64 addr;
86 u64 range;
87 u8 kind;
88 };
89
90 static int
nouveau_uvmm_vmm_sparse_ref(struct nouveau_uvmm * uvmm,u64 addr,u64 range)91 nouveau_uvmm_vmm_sparse_ref(struct nouveau_uvmm *uvmm,
92 u64 addr, u64 range)
93 {
94 struct nvif_vmm *vmm = &uvmm->vmm.vmm;
95
96 return nvif_vmm_raw_sparse(vmm, addr, range, true);
97 }
98
99 static int
nouveau_uvmm_vmm_sparse_unref(struct nouveau_uvmm * uvmm,u64 addr,u64 range)100 nouveau_uvmm_vmm_sparse_unref(struct nouveau_uvmm *uvmm,
101 u64 addr, u64 range)
102 {
103 struct nvif_vmm *vmm = &uvmm->vmm.vmm;
104
105 return nvif_vmm_raw_sparse(vmm, addr, range, false);
106 }
107
108 static int
nouveau_uvmm_vmm_get(struct nouveau_uvmm * uvmm,u64 addr,u64 range,u8 page_shift)109 nouveau_uvmm_vmm_get(struct nouveau_uvmm *uvmm,
110 u64 addr, u64 range, u8 page_shift)
111 {
112 struct nvif_vmm *vmm = &uvmm->vmm.vmm;
113
114 return nvif_vmm_raw_get(vmm, addr, range, page_shift);
115 }
116
117 static int
nouveau_uvmm_vmm_put(struct nouveau_uvmm * uvmm,u64 addr,u64 range,u8 page_shift)118 nouveau_uvmm_vmm_put(struct nouveau_uvmm *uvmm,
119 u64 addr, u64 range, u8 page_shift)
120 {
121 struct nvif_vmm *vmm = &uvmm->vmm.vmm;
122
123 return nvif_vmm_raw_put(vmm, addr, range, page_shift);
124 }
125
126 static int
nouveau_uvmm_vmm_unmap(struct nouveau_uvmm * uvmm,u64 addr,u64 range,u8 page_shift,bool sparse)127 nouveau_uvmm_vmm_unmap(struct nouveau_uvmm *uvmm,
128 u64 addr, u64 range, u8 page_shift, bool sparse)
129 {
130 struct nvif_vmm *vmm = &uvmm->vmm.vmm;
131
132 return nvif_vmm_raw_unmap(vmm, addr, range, page_shift, sparse);
133 }
134
135 static int
nouveau_uvmm_vmm_map(struct nouveau_uvmm * uvmm,u64 addr,u64 range,u8 page_shift,u64 bo_offset,u8 kind,struct nouveau_mem * mem)136 nouveau_uvmm_vmm_map(struct nouveau_uvmm *uvmm,
137 u64 addr, u64 range, u8 page_shift,
138 u64 bo_offset, u8 kind,
139 struct nouveau_mem *mem)
140 {
141 struct nvif_vmm *vmm = &uvmm->vmm.vmm;
142 union {
143 struct gf100_vmm_map_v0 gf100;
144 } args;
145 u32 argc = 0;
146
147 switch (vmm->object.oclass) {
148 case NVIF_CLASS_VMM_GF100:
149 case NVIF_CLASS_VMM_GM200:
150 case NVIF_CLASS_VMM_GP100:
151 args.gf100.version = 0;
152 if (mem->mem.type & NVIF_MEM_VRAM)
153 args.gf100.vol = 0;
154 else
155 args.gf100.vol = 1;
156 args.gf100.ro = 0;
157 args.gf100.priv = 0;
158 args.gf100.kind = kind;
159 argc = sizeof(args.gf100);
160 break;
161 default:
162 WARN_ON(1);
163 return -ENOSYS;
164 }
165
166 return nvif_vmm_raw_map(vmm, addr, range, page_shift,
167 &args, argc,
168 &mem->mem, bo_offset);
169 }
170
171 static int
nouveau_uvma_region_sparse_unref(struct nouveau_uvma_region * reg)172 nouveau_uvma_region_sparse_unref(struct nouveau_uvma_region *reg)
173 {
174 u64 addr = reg->va.addr;
175 u64 range = reg->va.range;
176
177 return nouveau_uvmm_vmm_sparse_unref(reg->uvmm, addr, range);
178 }
179
180 static int
nouveau_uvma_vmm_put(struct nouveau_uvma * uvma)181 nouveau_uvma_vmm_put(struct nouveau_uvma *uvma)
182 {
183 u64 addr = uvma->va.va.addr;
184 u64 range = uvma->va.va.range;
185 u8 page_shift = uvma->page_shift;
186
187 return nouveau_uvmm_vmm_put(to_uvmm(uvma), addr, range, page_shift);
188 }
189
190 static int
nouveau_uvma_map(struct nouveau_uvma * uvma,struct nouveau_mem * mem)191 nouveau_uvma_map(struct nouveau_uvma *uvma,
192 struct nouveau_mem *mem)
193 {
194 u64 addr = uvma->va.va.addr;
195 u64 offset = uvma->va.gem.offset;
196 u64 range = uvma->va.va.range;
197 u8 page_shift = uvma->page_shift;
198
199 return nouveau_uvmm_vmm_map(to_uvmm(uvma), addr, range,
200 page_shift, offset, uvma->kind,
201 mem);
202 }
203
204 static int
nouveau_uvma_unmap(struct nouveau_uvma * uvma)205 nouveau_uvma_unmap(struct nouveau_uvma *uvma)
206 {
207 u64 addr = uvma->va.va.addr;
208 u64 range = uvma->va.va.range;
209 u8 page_shift = uvma->page_shift;
210 bool sparse = !!uvma->region;
211
212 if (drm_gpuva_invalidated(&uvma->va))
213 return 0;
214
215 return nouveau_uvmm_vmm_unmap(to_uvmm(uvma), addr, range, page_shift, sparse);
216 }
217
218 static int
nouveau_uvma_alloc(struct nouveau_uvma ** puvma)219 nouveau_uvma_alloc(struct nouveau_uvma **puvma)
220 {
221 *puvma = kzalloc_obj(**puvma);
222 if (!*puvma)
223 return -ENOMEM;
224
225 return 0;
226 }
227
228 static void
nouveau_uvma_free(struct nouveau_uvma * uvma)229 nouveau_uvma_free(struct nouveau_uvma *uvma)
230 {
231 kfree(uvma);
232 }
233
234 static void
nouveau_uvma_gem_get(struct nouveau_uvma * uvma)235 nouveau_uvma_gem_get(struct nouveau_uvma *uvma)
236 {
237 drm_gem_object_get(uvma->va.gem.obj);
238 }
239
240 static void
nouveau_uvma_gem_put(struct nouveau_uvma * uvma)241 nouveau_uvma_gem_put(struct nouveau_uvma *uvma)
242 {
243 drm_gem_object_put(uvma->va.gem.obj);
244 }
245
246 static int
nouveau_uvma_region_alloc(struct nouveau_uvma_region ** preg)247 nouveau_uvma_region_alloc(struct nouveau_uvma_region **preg)
248 {
249 *preg = kzalloc_obj(**preg);
250 if (!*preg)
251 return -ENOMEM;
252
253 kref_init(&(*preg)->kref);
254
255 return 0;
256 }
257
258 static void
nouveau_uvma_region_free(struct kref * kref)259 nouveau_uvma_region_free(struct kref *kref)
260 {
261 struct nouveau_uvma_region *reg =
262 container_of(kref, struct nouveau_uvma_region, kref);
263
264 kfree(reg);
265 }
266
267 static void
nouveau_uvma_region_get(struct nouveau_uvma_region * reg)268 nouveau_uvma_region_get(struct nouveau_uvma_region *reg)
269 {
270 kref_get(®->kref);
271 }
272
273 static void
nouveau_uvma_region_put(struct nouveau_uvma_region * reg)274 nouveau_uvma_region_put(struct nouveau_uvma_region *reg)
275 {
276 kref_put(®->kref, nouveau_uvma_region_free);
277 }
278
279 static int
__nouveau_uvma_region_insert(struct nouveau_uvmm * uvmm,struct nouveau_uvma_region * reg)280 __nouveau_uvma_region_insert(struct nouveau_uvmm *uvmm,
281 struct nouveau_uvma_region *reg)
282 {
283 u64 addr = reg->va.addr;
284 u64 range = reg->va.range;
285 u64 last = addr + range - 1;
286 MA_STATE(mas, &uvmm->region_mt, addr, addr);
287
288 if (unlikely(mas_walk(&mas)))
289 return -EEXIST;
290
291 if (unlikely(mas.last < last))
292 return -EEXIST;
293
294 mas.index = addr;
295 mas.last = last;
296
297 mas_store_gfp(&mas, reg, GFP_KERNEL);
298
299 reg->uvmm = uvmm;
300
301 return 0;
302 }
303
304 static int
nouveau_uvma_region_insert(struct nouveau_uvmm * uvmm,struct nouveau_uvma_region * reg,u64 addr,u64 range)305 nouveau_uvma_region_insert(struct nouveau_uvmm *uvmm,
306 struct nouveau_uvma_region *reg,
307 u64 addr, u64 range)
308 {
309 int ret;
310
311 reg->uvmm = uvmm;
312 reg->va.addr = addr;
313 reg->va.range = range;
314
315 ret = __nouveau_uvma_region_insert(uvmm, reg);
316 if (ret)
317 return ret;
318
319 return 0;
320 }
321
322 static void
nouveau_uvma_region_remove(struct nouveau_uvma_region * reg)323 nouveau_uvma_region_remove(struct nouveau_uvma_region *reg)
324 {
325 struct nouveau_uvmm *uvmm = reg->uvmm;
326 MA_STATE(mas, &uvmm->region_mt, reg->va.addr, 0);
327
328 mas_erase(&mas);
329 }
330
331 static int
nouveau_uvma_region_create(struct nouveau_uvmm * uvmm,u64 addr,u64 range)332 nouveau_uvma_region_create(struct nouveau_uvmm *uvmm,
333 u64 addr, u64 range)
334 {
335 struct nouveau_uvma_region *reg;
336 int ret;
337
338 if (!drm_gpuvm_interval_empty(&uvmm->base, addr, range))
339 return -ENOSPC;
340
341 ret = nouveau_uvma_region_alloc(®);
342 if (ret)
343 return ret;
344
345 ret = nouveau_uvma_region_insert(uvmm, reg, addr, range);
346 if (ret)
347 goto err_free_region;
348
349 ret = nouveau_uvmm_vmm_sparse_ref(uvmm, addr, range);
350 if (ret)
351 goto err_region_remove;
352
353 return 0;
354
355 err_region_remove:
356 nouveau_uvma_region_remove(reg);
357 err_free_region:
358 nouveau_uvma_region_put(reg);
359 return ret;
360 }
361
362 static struct nouveau_uvma_region *
nouveau_uvma_region_find_first(struct nouveau_uvmm * uvmm,u64 addr,u64 range)363 nouveau_uvma_region_find_first(struct nouveau_uvmm *uvmm,
364 u64 addr, u64 range)
365 {
366 MA_STATE(mas, &uvmm->region_mt, addr, 0);
367
368 return mas_find(&mas, addr + range - 1);
369 }
370
371 static struct nouveau_uvma_region *
nouveau_uvma_region_find(struct nouveau_uvmm * uvmm,u64 addr,u64 range)372 nouveau_uvma_region_find(struct nouveau_uvmm *uvmm,
373 u64 addr, u64 range)
374 {
375 struct nouveau_uvma_region *reg;
376
377 reg = nouveau_uvma_region_find_first(uvmm, addr, range);
378 if (!reg)
379 return NULL;
380
381 if (reg->va.addr != addr ||
382 reg->va.range != range)
383 return NULL;
384
385 return reg;
386 }
387
388 static bool
nouveau_uvma_region_empty(struct nouveau_uvma_region * reg)389 nouveau_uvma_region_empty(struct nouveau_uvma_region *reg)
390 {
391 struct nouveau_uvmm *uvmm = reg->uvmm;
392
393 return drm_gpuvm_interval_empty(&uvmm->base,
394 reg->va.addr,
395 reg->va.range);
396 }
397
398 static int
__nouveau_uvma_region_destroy(struct nouveau_uvma_region * reg)399 __nouveau_uvma_region_destroy(struct nouveau_uvma_region *reg)
400 {
401 struct nouveau_uvmm *uvmm = reg->uvmm;
402 u64 addr = reg->va.addr;
403 u64 range = reg->va.range;
404
405 if (!nouveau_uvma_region_empty(reg))
406 return -EBUSY;
407
408 nouveau_uvma_region_remove(reg);
409 nouveau_uvmm_vmm_sparse_unref(uvmm, addr, range);
410 nouveau_uvma_region_put(reg);
411
412 return 0;
413 }
414
415 static int
nouveau_uvma_region_destroy(struct nouveau_uvmm * uvmm,u64 addr,u64 range)416 nouveau_uvma_region_destroy(struct nouveau_uvmm *uvmm,
417 u64 addr, u64 range)
418 {
419 struct nouveau_uvma_region *reg;
420
421 reg = nouveau_uvma_region_find(uvmm, addr, range);
422 if (!reg)
423 return -ENOENT;
424
425 return __nouveau_uvma_region_destroy(reg);
426 }
427
428 static void
nouveau_uvma_region_dirty(struct nouveau_uvma_region * reg)429 nouveau_uvma_region_dirty(struct nouveau_uvma_region *reg)
430 {
431
432 init_completion(®->complete);
433 reg->dirty = true;
434 }
435
436 static void
nouveau_uvma_region_complete(struct nouveau_uvma_region * reg)437 nouveau_uvma_region_complete(struct nouveau_uvma_region *reg)
438 {
439 complete_all(®->complete);
440 }
441
442 static void
op_map_prepare_unwind(struct nouveau_uvma * uvma)443 op_map_prepare_unwind(struct nouveau_uvma *uvma)
444 {
445 struct drm_gpuva *va = &uvma->va;
446 nouveau_uvma_gem_put(uvma);
447 drm_gpuva_remove(va);
448 nouveau_uvma_free(uvma);
449 }
450
451 static void
op_unmap_prepare_unwind(struct drm_gpuva * va)452 op_unmap_prepare_unwind(struct drm_gpuva *va)
453 {
454 drm_gpuva_insert(va->vm, va);
455 }
456
457 static bool
op_map_aligned_to_page_shift(const struct drm_gpuva_op_map * op,u8 page_shift)458 op_map_aligned_to_page_shift(const struct drm_gpuva_op_map *op, u8 page_shift)
459 {
460 u64 non_page_bits = (1ULL << page_shift) - 1;
461
462 return (op->va.addr & non_page_bits) == 0 &&
463 (op->va.range & non_page_bits) == 0 &&
464 (op->gem.offset & non_page_bits) == 0;
465 }
466
467 static u8
select_page_shift(struct nouveau_uvmm * uvmm,struct drm_gpuva_op_map * op)468 select_page_shift(struct nouveau_uvmm *uvmm, struct drm_gpuva_op_map *op)
469 {
470 struct nouveau_bo *nvbo = nouveau_gem_object(op->gem.obj);
471
472 /* nouveau_bo_fixup_align() guarantees that the page size will be aligned
473 * for most cases, but it can't handle cases where userspace allocates with
474 * a size and then binds with a smaller granularity. So in order to avoid
475 * breaking old userspace, we need to ensure that the VA is actually
476 * aligned before using it, and if it isn't, then we downgrade to the first
477 * granularity that will fit, which is optimal from a correctness and
478 * performance perspective.
479 */
480 if (op_map_aligned_to_page_shift(op, nvbo->page))
481 return nvbo->page;
482
483 struct nouveau_mem *mem = nouveau_mem(nvbo->bo.resource);
484 struct nvif_vmm *vmm = &uvmm->vmm.vmm;
485 int i;
486
487 /* If the given granularity doesn't fit, let's find one that will fit. */
488 for (i = 0; i < vmm->page_nr; i++) {
489 /* Ignore anything that is bigger or identical to the BO preference. */
490 if (vmm->page[i].shift >= nvbo->page)
491 continue;
492
493 /* Skip incompatible domains. */
494 if ((mem->mem.type & NVIF_MEM_VRAM) && !vmm->page[i].vram)
495 continue;
496 if ((mem->mem.type & NVIF_MEM_HOST) &&
497 (!vmm->page[i].host || vmm->page[i].shift > PAGE_SHIFT))
498 continue;
499
500 /* If it fits, return the proposed shift. */
501 if (op_map_aligned_to_page_shift(op, vmm->page[i].shift))
502 return vmm->page[i].shift;
503 }
504
505 /* If we get here then nothing can reconcile the requirements. This should never
506 * happen.
507 */
508 drm_WARN_ONCE(op->gem.obj->dev, 1, "Could not find an appropriate page size.\n");
509
510 return PAGE_SHIFT;
511 }
512
513 static void
nouveau_uvmm_sm_prepare_unwind(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops,struct drm_gpuva_op * last,struct uvmm_map_args * args)514 nouveau_uvmm_sm_prepare_unwind(struct nouveau_uvmm *uvmm,
515 struct nouveau_uvma_prealloc *new,
516 struct drm_gpuva_ops *ops,
517 struct drm_gpuva_op *last,
518 struct uvmm_map_args *args)
519 {
520 struct drm_gpuva_op *op = last;
521 u64 vmm_get_start = args ? args->addr : 0;
522 u64 vmm_get_end = args ? args->addr + args->range : 0;
523
524 /* Unwind GPUVA space. */
525 drm_gpuva_for_each_op_from_reverse(op, ops) {
526 switch (op->op) {
527 case DRM_GPUVA_OP_MAP:
528 op_map_prepare_unwind(new->map);
529 break;
530 case DRM_GPUVA_OP_REMAP: {
531 struct drm_gpuva_op_remap *r = &op->remap;
532 struct drm_gpuva *va = r->unmap->va;
533
534 if (r->next)
535 op_map_prepare_unwind(new->next);
536
537 if (r->prev)
538 op_map_prepare_unwind(new->prev);
539
540 op_unmap_prepare_unwind(va);
541 break;
542 }
543 case DRM_GPUVA_OP_UNMAP:
544 op_unmap_prepare_unwind(op->unmap.va);
545 break;
546 default:
547 break;
548 }
549 }
550
551 /* Unmap operation don't allocate page tables, hence skip the following
552 * page table unwind.
553 */
554 if (!args)
555 return;
556
557 drm_gpuva_for_each_op(op, ops) {
558 switch (op->op) {
559 case DRM_GPUVA_OP_MAP: {
560 u64 vmm_get_range = vmm_get_end - vmm_get_start;
561
562 if (vmm_get_range)
563 nouveau_uvmm_vmm_put(uvmm, vmm_get_start,
564 vmm_get_range,
565 select_page_shift(uvmm, &op->map));
566 break;
567 }
568 case DRM_GPUVA_OP_REMAP: {
569 struct drm_gpuva_op_remap *r = &op->remap;
570 struct drm_gpuva *va = r->unmap->va;
571 u64 ustart = va->va.addr;
572 u64 urange = va->va.range;
573 u64 uend = ustart + urange;
574
575 if (r->prev)
576 vmm_get_start = uend;
577
578 if (r->next)
579 vmm_get_end = ustart;
580
581 if (r->prev && r->next)
582 vmm_get_start = vmm_get_end = 0;
583
584 break;
585 }
586 case DRM_GPUVA_OP_UNMAP: {
587 struct drm_gpuva_op_unmap *u = &op->unmap;
588 struct drm_gpuva *va = u->va;
589 u64 ustart = va->va.addr;
590 u64 urange = va->va.range;
591 u64 uend = ustart + urange;
592 u8 page_shift = uvma_from_va(va)->page_shift;
593
594 /* Nothing to do for mappings we merge with. */
595 if (uend == vmm_get_start ||
596 ustart == vmm_get_end)
597 break;
598
599 if (ustart > vmm_get_start) {
600 u64 vmm_get_range = ustart - vmm_get_start;
601
602 nouveau_uvmm_vmm_put(uvmm, vmm_get_start,
603 vmm_get_range,
604 page_shift);
605 }
606 vmm_get_start = uend;
607 break;
608 }
609 default:
610 break;
611 }
612
613 if (op == last)
614 break;
615 }
616 }
617
618 static void
nouveau_uvmm_sm_map_prepare_unwind(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops,u64 addr,u64 range)619 nouveau_uvmm_sm_map_prepare_unwind(struct nouveau_uvmm *uvmm,
620 struct nouveau_uvma_prealloc *new,
621 struct drm_gpuva_ops *ops,
622 u64 addr, u64 range)
623 {
624 struct drm_gpuva_op *last = drm_gpuva_last_op(ops);
625 struct uvmm_map_args args = {
626 .addr = addr,
627 .range = range,
628 };
629
630 nouveau_uvmm_sm_prepare_unwind(uvmm, new, ops, last, &args);
631 }
632
633 static void
nouveau_uvmm_sm_unmap_prepare_unwind(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops)634 nouveau_uvmm_sm_unmap_prepare_unwind(struct nouveau_uvmm *uvmm,
635 struct nouveau_uvma_prealloc *new,
636 struct drm_gpuva_ops *ops)
637 {
638 struct drm_gpuva_op *last = drm_gpuva_last_op(ops);
639
640 nouveau_uvmm_sm_prepare_unwind(uvmm, new, ops, last, NULL);
641 }
642
643 static int
op_map_prepare(struct nouveau_uvmm * uvmm,struct nouveau_uvma ** puvma,struct drm_gpuva_op_map * op,struct uvmm_map_args * args)644 op_map_prepare(struct nouveau_uvmm *uvmm,
645 struct nouveau_uvma **puvma,
646 struct drm_gpuva_op_map *op,
647 struct uvmm_map_args *args)
648 {
649 struct nouveau_uvma *uvma;
650 int ret;
651
652 ret = nouveau_uvma_alloc(&uvma);
653 if (ret)
654 return ret;
655
656 uvma->region = args->region;
657 uvma->kind = args->kind;
658 uvma->page_shift = select_page_shift(uvmm, op);
659
660 drm_gpuva_map(&uvmm->base, &uvma->va, op);
661
662 /* Keep a reference until this uvma is destroyed. */
663 nouveau_uvma_gem_get(uvma);
664
665 *puvma = uvma;
666 return 0;
667 }
668
669 static void
op_unmap_prepare(struct drm_gpuva_op_unmap * u)670 op_unmap_prepare(struct drm_gpuva_op_unmap *u)
671 {
672 drm_gpuva_unmap(u);
673 }
674
675 /*
676 * Note: @args should not be NULL when calling for a map operation.
677 */
678 static int
nouveau_uvmm_sm_prepare(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops,struct uvmm_map_args * args)679 nouveau_uvmm_sm_prepare(struct nouveau_uvmm *uvmm,
680 struct nouveau_uvma_prealloc *new,
681 struct drm_gpuva_ops *ops,
682 struct uvmm_map_args *args)
683 {
684 struct drm_gpuva_op *op;
685 u64 vmm_get_start = args ? args->addr : 0;
686 u64 vmm_get_end = args ? args->addr + args->range : 0;
687 int ret;
688
689 drm_gpuva_for_each_op(op, ops) {
690 switch (op->op) {
691 case DRM_GPUVA_OP_MAP: {
692 u64 vmm_get_range = vmm_get_end - vmm_get_start;
693
694 ret = op_map_prepare(uvmm, &new->map, &op->map, args);
695 if (ret)
696 goto unwind;
697
698 if (vmm_get_range) {
699 ret = nouveau_uvmm_vmm_get(uvmm, vmm_get_start,
700 vmm_get_range,
701 new->map->page_shift);
702 if (ret) {
703 op_map_prepare_unwind(new->map);
704 goto unwind;
705 }
706 }
707
708 break;
709 }
710 case DRM_GPUVA_OP_REMAP: {
711 struct drm_gpuva_op_remap *r = &op->remap;
712 struct drm_gpuva *va = r->unmap->va;
713 struct uvmm_map_args remap_args = {
714 .kind = uvma_from_va(va)->kind,
715 .region = uvma_from_va(va)->region,
716 };
717 u64 ustart = va->va.addr;
718 u64 urange = va->va.range;
719 u64 uend = ustart + urange;
720
721 op_unmap_prepare(r->unmap);
722
723 if (r->prev) {
724 ret = op_map_prepare(uvmm, &new->prev, r->prev,
725 &remap_args);
726 if (ret)
727 goto unwind;
728
729 if (args)
730 vmm_get_start = uend;
731 }
732
733 if (r->next) {
734 ret = op_map_prepare(uvmm, &new->next, r->next,
735 &remap_args);
736 if (ret) {
737 if (r->prev)
738 op_map_prepare_unwind(new->prev);
739 goto unwind;
740 }
741
742 if (args)
743 vmm_get_end = ustart;
744 }
745
746 if (args && (r->prev && r->next))
747 vmm_get_start = vmm_get_end = 0;
748
749 break;
750 }
751 case DRM_GPUVA_OP_UNMAP: {
752 struct drm_gpuva_op_unmap *u = &op->unmap;
753 struct drm_gpuva *va = u->va;
754 u64 ustart = va->va.addr;
755 u64 urange = va->va.range;
756 u64 uend = ustart + urange;
757 u8 page_shift = uvma_from_va(va)->page_shift;
758
759 op_unmap_prepare(u);
760
761 if (!args)
762 break;
763
764 /* Nothing to do for mappings we merge with. */
765 if (uend == vmm_get_start ||
766 ustart == vmm_get_end)
767 break;
768
769 if (ustart > vmm_get_start) {
770 u64 vmm_get_range = ustart - vmm_get_start;
771
772 ret = nouveau_uvmm_vmm_get(uvmm, vmm_get_start,
773 vmm_get_range, page_shift);
774 if (ret) {
775 op_unmap_prepare_unwind(va);
776 goto unwind;
777 }
778 }
779 vmm_get_start = uend;
780
781 break;
782 }
783 default:
784 ret = -EINVAL;
785 goto unwind;
786 }
787 }
788
789 return 0;
790
791 unwind:
792 if (op != drm_gpuva_first_op(ops))
793 nouveau_uvmm_sm_prepare_unwind(uvmm, new, ops,
794 drm_gpuva_prev_op(op),
795 args);
796 return ret;
797 }
798
799 static int
nouveau_uvmm_sm_map_prepare(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct nouveau_uvma_region * region,struct drm_gpuva_ops * ops,u64 addr,u64 range,u8 kind)800 nouveau_uvmm_sm_map_prepare(struct nouveau_uvmm *uvmm,
801 struct nouveau_uvma_prealloc *new,
802 struct nouveau_uvma_region *region,
803 struct drm_gpuva_ops *ops,
804 u64 addr, u64 range, u8 kind)
805 {
806 struct uvmm_map_args args = {
807 .region = region,
808 .addr = addr,
809 .range = range,
810 .kind = kind,
811 };
812
813 return nouveau_uvmm_sm_prepare(uvmm, new, ops, &args);
814 }
815
816 static int
nouveau_uvmm_sm_unmap_prepare(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops)817 nouveau_uvmm_sm_unmap_prepare(struct nouveau_uvmm *uvmm,
818 struct nouveau_uvma_prealloc *new,
819 struct drm_gpuva_ops *ops)
820 {
821 return nouveau_uvmm_sm_prepare(uvmm, new, ops, NULL);
822 }
823
824 static struct drm_gem_object *
op_gem_obj(struct drm_gpuva_op * op)825 op_gem_obj(struct drm_gpuva_op *op)
826 {
827 switch (op->op) {
828 case DRM_GPUVA_OP_MAP:
829 return op->map.gem.obj;
830 case DRM_GPUVA_OP_REMAP:
831 /* Actually, we're looking for the GEMs backing remap.prev and
832 * remap.next, but since this is a remap they're identical to
833 * the GEM backing the unmapped GPUVA.
834 */
835 return op->remap.unmap->va->gem.obj;
836 case DRM_GPUVA_OP_UNMAP:
837 return op->unmap.va->gem.obj;
838 default:
839 WARN(1, "Unknown operation.\n");
840 return NULL;
841 }
842 }
843
844 static void
op_map(struct nouveau_uvma * uvma)845 op_map(struct nouveau_uvma *uvma)
846 {
847 struct nouveau_bo *nvbo = nouveau_gem_object(uvma->va.gem.obj);
848
849 nouveau_uvma_map(uvma, nouveau_mem(nvbo->bo.resource));
850 }
851
852 static void
op_unmap(struct drm_gpuva_op_unmap * u)853 op_unmap(struct drm_gpuva_op_unmap *u)
854 {
855 struct drm_gpuva *va = u->va;
856 struct nouveau_uvma *uvma = uvma_from_va(va);
857
858 /* nouveau_uvma_unmap() does not unmap if backing BO is evicted. */
859 if (!u->keep)
860 nouveau_uvma_unmap(uvma);
861 }
862
863 static void
op_unmap_range(struct drm_gpuva_op_unmap * u,u64 addr,u64 range)864 op_unmap_range(struct drm_gpuva_op_unmap *u,
865 u64 addr, u64 range)
866 {
867 struct nouveau_uvma *uvma = uvma_from_va(u->va);
868 u8 page_shift = uvma->page_shift;
869 bool sparse = !!uvma->region;
870
871 if (!drm_gpuva_invalidated(u->va))
872 nouveau_uvmm_vmm_unmap(to_uvmm(uvma), addr, range, page_shift, sparse);
873 }
874
875 static void
op_remap(struct drm_gpuva_op_remap * r,struct nouveau_uvma_prealloc * new)876 op_remap(struct drm_gpuva_op_remap *r,
877 struct nouveau_uvma_prealloc *new)
878 {
879 struct drm_gpuva_op_unmap *u = r->unmap;
880 struct nouveau_uvma *uvma = uvma_from_va(u->va);
881 u64 addr = uvma->va.va.addr;
882 u64 end = uvma->va.va.addr + uvma->va.va.range;
883
884 if (r->prev)
885 addr = r->prev->va.addr + r->prev->va.range;
886
887 if (r->next)
888 end = r->next->va.addr;
889
890 op_unmap_range(u, addr, end - addr);
891 }
892
893 static int
nouveau_uvmm_sm(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops)894 nouveau_uvmm_sm(struct nouveau_uvmm *uvmm,
895 struct nouveau_uvma_prealloc *new,
896 struct drm_gpuva_ops *ops)
897 {
898 struct drm_gpuva_op *op;
899
900 drm_gpuva_for_each_op(op, ops) {
901 switch (op->op) {
902 case DRM_GPUVA_OP_MAP:
903 op_map(new->map);
904 break;
905 case DRM_GPUVA_OP_REMAP:
906 op_remap(&op->remap, new);
907 break;
908 case DRM_GPUVA_OP_UNMAP:
909 op_unmap(&op->unmap);
910 break;
911 default:
912 break;
913 }
914 }
915
916 return 0;
917 }
918
919 static int
nouveau_uvmm_sm_map(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops)920 nouveau_uvmm_sm_map(struct nouveau_uvmm *uvmm,
921 struct nouveau_uvma_prealloc *new,
922 struct drm_gpuva_ops *ops)
923 {
924 return nouveau_uvmm_sm(uvmm, new, ops);
925 }
926
927 static int
nouveau_uvmm_sm_unmap(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops)928 nouveau_uvmm_sm_unmap(struct nouveau_uvmm *uvmm,
929 struct nouveau_uvma_prealloc *new,
930 struct drm_gpuva_ops *ops)
931 {
932 return nouveau_uvmm_sm(uvmm, new, ops);
933 }
934
935 static void
nouveau_uvmm_sm_cleanup(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops,bool unmap)936 nouveau_uvmm_sm_cleanup(struct nouveau_uvmm *uvmm,
937 struct nouveau_uvma_prealloc *new,
938 struct drm_gpuva_ops *ops, bool unmap)
939 {
940 struct drm_gpuva_op *op;
941
942 drm_gpuva_for_each_op(op, ops) {
943 switch (op->op) {
944 case DRM_GPUVA_OP_MAP:
945 break;
946 case DRM_GPUVA_OP_REMAP: {
947 struct drm_gpuva_op_remap *r = &op->remap;
948 struct drm_gpuva_op_map *p = r->prev;
949 struct drm_gpuva_op_map *n = r->next;
950 struct drm_gpuva *va = r->unmap->va;
951 struct nouveau_uvma *uvma = uvma_from_va(va);
952 u8 page_shift = uvma->page_shift;
953
954 if (unmap) {
955 u64 addr = va->va.addr;
956 u64 end = addr + va->va.range;
957
958 if (p)
959 addr = p->va.addr + p->va.range;
960
961 if (n)
962 end = n->va.addr;
963
964 nouveau_uvmm_vmm_put(uvmm, addr, end - addr, page_shift);
965 }
966
967 nouveau_uvma_gem_put(uvma);
968 nouveau_uvma_free(uvma);
969 break;
970 }
971 case DRM_GPUVA_OP_UNMAP: {
972 struct drm_gpuva_op_unmap *u = &op->unmap;
973 struct drm_gpuva *va = u->va;
974 struct nouveau_uvma *uvma = uvma_from_va(va);
975
976 if (unmap)
977 nouveau_uvma_vmm_put(uvma);
978
979 nouveau_uvma_gem_put(uvma);
980 nouveau_uvma_free(uvma);
981 break;
982 }
983 default:
984 break;
985 }
986 }
987 }
988
989 static void
nouveau_uvmm_sm_map_cleanup(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops)990 nouveau_uvmm_sm_map_cleanup(struct nouveau_uvmm *uvmm,
991 struct nouveau_uvma_prealloc *new,
992 struct drm_gpuva_ops *ops)
993 {
994 nouveau_uvmm_sm_cleanup(uvmm, new, ops, false);
995 }
996
997 static void
nouveau_uvmm_sm_unmap_cleanup(struct nouveau_uvmm * uvmm,struct nouveau_uvma_prealloc * new,struct drm_gpuva_ops * ops)998 nouveau_uvmm_sm_unmap_cleanup(struct nouveau_uvmm *uvmm,
999 struct nouveau_uvma_prealloc *new,
1000 struct drm_gpuva_ops *ops)
1001 {
1002 nouveau_uvmm_sm_cleanup(uvmm, new, ops, true);
1003 }
1004
1005 static int
nouveau_uvmm_validate_range(struct nouveau_uvmm * uvmm,u64 addr,u64 range)1006 nouveau_uvmm_validate_range(struct nouveau_uvmm *uvmm, u64 addr, u64 range)
1007 {
1008 if (addr & ~PAGE_MASK)
1009 return -EINVAL;
1010
1011 if (range & ~PAGE_MASK)
1012 return -EINVAL;
1013
1014 if (!drm_gpuvm_range_valid(&uvmm->base, addr, range))
1015 return -EINVAL;
1016
1017 return 0;
1018 }
1019
1020 static int
nouveau_uvmm_bind_job_alloc(struct nouveau_uvmm_bind_job ** pjob)1021 nouveau_uvmm_bind_job_alloc(struct nouveau_uvmm_bind_job **pjob)
1022 {
1023 *pjob = kzalloc_obj(**pjob);
1024 if (!*pjob)
1025 return -ENOMEM;
1026
1027 kref_init(&(*pjob)->kref);
1028
1029 return 0;
1030 }
1031
1032 static void
nouveau_uvmm_bind_job_free(struct kref * kref)1033 nouveau_uvmm_bind_job_free(struct kref *kref)
1034 {
1035 struct nouveau_uvmm_bind_job *job =
1036 container_of(kref, struct nouveau_uvmm_bind_job, kref);
1037 struct bind_job_op *op, *next;
1038
1039 list_for_each_op_safe(op, next, &job->ops) {
1040 list_del(&op->entry);
1041 kfree(op);
1042 }
1043
1044 nouveau_job_free(&job->base);
1045 kfree(job);
1046 }
1047
1048 static void
nouveau_uvmm_bind_job_get(struct nouveau_uvmm_bind_job * job)1049 nouveau_uvmm_bind_job_get(struct nouveau_uvmm_bind_job *job)
1050 {
1051 kref_get(&job->kref);
1052 }
1053
1054 static void
nouveau_uvmm_bind_job_put(struct nouveau_uvmm_bind_job * job)1055 nouveau_uvmm_bind_job_put(struct nouveau_uvmm_bind_job *job)
1056 {
1057 kref_put(&job->kref, nouveau_uvmm_bind_job_free);
1058 }
1059
1060 static int
bind_validate_op(struct nouveau_job * job,struct bind_job_op * op)1061 bind_validate_op(struct nouveau_job *job,
1062 struct bind_job_op *op)
1063 {
1064 struct nouveau_uvmm *uvmm = nouveau_cli_uvmm(job->cli);
1065 struct drm_gem_object *obj = op->gem.obj;
1066
1067 if (op->op == OP_MAP) {
1068 if (op->gem.offset & ~PAGE_MASK)
1069 return -EINVAL;
1070
1071 if (obj->size <= op->gem.offset)
1072 return -EINVAL;
1073
1074 if (op->va.range > (obj->size - op->gem.offset))
1075 return -EINVAL;
1076 }
1077
1078 return nouveau_uvmm_validate_range(uvmm, op->va.addr, op->va.range);
1079 }
1080
1081 static void
bind_validate_map_sparse(struct nouveau_job * job,u64 addr,u64 range)1082 bind_validate_map_sparse(struct nouveau_job *job, u64 addr, u64 range)
1083 {
1084 struct nouveau_sched *sched = job->sched;
1085 struct nouveau_job *__job;
1086 struct bind_job_op *op;
1087 u64 end = addr + range;
1088
1089 again:
1090 spin_lock(&sched->job.list.lock);
1091 list_for_each_entry(__job, &sched->job.list.head, entry) {
1092 struct nouveau_uvmm_bind_job *bind_job = to_uvmm_bind_job(__job);
1093
1094 list_for_each_op(op, &bind_job->ops) {
1095 if (op->op == OP_UNMAP) {
1096 u64 op_addr = op->va.addr;
1097 u64 op_end = op_addr + op->va.range;
1098
1099 if (!(end <= op_addr || addr >= op_end)) {
1100 nouveau_uvmm_bind_job_get(bind_job);
1101 spin_unlock(&sched->job.list.lock);
1102 wait_for_completion(&bind_job->complete);
1103 nouveau_uvmm_bind_job_put(bind_job);
1104 goto again;
1105 }
1106 }
1107 }
1108 }
1109 spin_unlock(&sched->job.list.lock);
1110 }
1111
1112 static int
bind_validate_map_common(struct nouveau_job * job,u64 addr,u64 range,bool sparse)1113 bind_validate_map_common(struct nouveau_job *job, u64 addr, u64 range,
1114 bool sparse)
1115 {
1116 struct nouveau_uvmm *uvmm = nouveau_cli_uvmm(job->cli);
1117 struct nouveau_uvma_region *reg;
1118 u64 reg_addr, reg_end;
1119 u64 end = addr + range;
1120
1121 again:
1122 nouveau_uvmm_lock(uvmm);
1123 reg = nouveau_uvma_region_find_first(uvmm, addr, range);
1124 if (!reg) {
1125 nouveau_uvmm_unlock(uvmm);
1126 return 0;
1127 }
1128
1129 /* Generally, job submits are serialized, hence only
1130 * dirty regions can be modified concurrently.
1131 */
1132 if (reg->dirty) {
1133 nouveau_uvma_region_get(reg);
1134 nouveau_uvmm_unlock(uvmm);
1135 wait_for_completion(®->complete);
1136 nouveau_uvma_region_put(reg);
1137 goto again;
1138 }
1139 nouveau_uvmm_unlock(uvmm);
1140
1141 if (sparse)
1142 return -ENOSPC;
1143
1144 reg_addr = reg->va.addr;
1145 reg_end = reg_addr + reg->va.range;
1146
1147 /* Make sure the mapping is either outside of a
1148 * region or fully enclosed by a region.
1149 */
1150 if (reg_addr > addr || reg_end < end)
1151 return -ENOSPC;
1152
1153 return 0;
1154 }
1155
1156 static int
bind_validate_region(struct nouveau_job * job)1157 bind_validate_region(struct nouveau_job *job)
1158 {
1159 struct nouveau_uvmm_bind_job *bind_job = to_uvmm_bind_job(job);
1160 struct bind_job_op *op;
1161 int ret;
1162
1163 list_for_each_op(op, &bind_job->ops) {
1164 u64 op_addr = op->va.addr;
1165 u64 op_range = op->va.range;
1166 bool sparse = false;
1167
1168 switch (op->op) {
1169 case OP_MAP_SPARSE:
1170 sparse = true;
1171 bind_validate_map_sparse(job, op_addr, op_range);
1172 fallthrough;
1173 case OP_MAP:
1174 ret = bind_validate_map_common(job, op_addr, op_range,
1175 sparse);
1176 if (ret)
1177 return ret;
1178 break;
1179 default:
1180 break;
1181 }
1182 }
1183
1184 return 0;
1185 }
1186
1187 static void
bind_link_gpuvas(struct bind_job_op * bop)1188 bind_link_gpuvas(struct bind_job_op *bop)
1189 {
1190 struct nouveau_uvma_prealloc *new = &bop->new;
1191 struct drm_gpuvm_bo *vm_bo = bop->vm_bo;
1192 struct drm_gpuva_ops *ops = bop->ops;
1193 struct drm_gpuva_op *op;
1194
1195 drm_gpuva_for_each_op(op, ops) {
1196 switch (op->op) {
1197 case DRM_GPUVA_OP_MAP:
1198 drm_gpuva_link(&new->map->va, vm_bo);
1199 break;
1200 case DRM_GPUVA_OP_REMAP: {
1201 struct drm_gpuva *va = op->remap.unmap->va;
1202
1203 if (op->remap.prev)
1204 drm_gpuva_link(&new->prev->va, va->vm_bo);
1205 if (op->remap.next)
1206 drm_gpuva_link(&new->next->va, va->vm_bo);
1207 drm_gpuva_unlink(va);
1208 break;
1209 }
1210 case DRM_GPUVA_OP_UNMAP:
1211 drm_gpuva_unlink(op->unmap.va);
1212 break;
1213 default:
1214 break;
1215 }
1216 }
1217 }
1218
1219 static int
bind_lock_validate(struct nouveau_job * job,struct drm_exec * exec,unsigned int num_fences)1220 bind_lock_validate(struct nouveau_job *job, struct drm_exec *exec,
1221 unsigned int num_fences)
1222 {
1223 struct nouveau_uvmm_bind_job *bind_job = to_uvmm_bind_job(job);
1224 struct bind_job_op *op;
1225 int ret;
1226
1227 list_for_each_op(op, &bind_job->ops) {
1228 struct drm_gpuva_op *va_op;
1229
1230 if (!op->ops)
1231 continue;
1232
1233 drm_gpuva_for_each_op(va_op, op->ops) {
1234 struct drm_gem_object *obj = op_gem_obj(va_op);
1235
1236 if (unlikely(!obj))
1237 continue;
1238
1239 ret = drm_exec_prepare_obj(exec, obj, num_fences);
1240 if (ret)
1241 return ret;
1242
1243 /* Don't validate GEMs backing mappings we're about to
1244 * unmap, it's not worth the effort.
1245 */
1246 if (va_op->op == DRM_GPUVA_OP_UNMAP)
1247 continue;
1248
1249 ret = nouveau_bo_validate(nouveau_gem_object(obj),
1250 true, false);
1251 if (ret)
1252 return ret;
1253 }
1254 }
1255
1256 return 0;
1257 }
1258
1259 static int
nouveau_uvmm_bind_job_submit(struct nouveau_job * job,struct drm_gpuvm_exec * vme)1260 nouveau_uvmm_bind_job_submit(struct nouveau_job *job,
1261 struct drm_gpuvm_exec *vme)
1262 {
1263 struct nouveau_uvmm *uvmm = nouveau_cli_uvmm(job->cli);
1264 struct nouveau_uvmm_bind_job *bind_job = to_uvmm_bind_job(job);
1265 struct drm_exec *exec = &vme->exec;
1266 struct bind_job_op *op;
1267 int ret;
1268
1269 list_for_each_op(op, &bind_job->ops) {
1270 if (op->op == OP_MAP) {
1271 struct drm_gem_object *obj = op->gem.obj =
1272 drm_gem_object_lookup(job->file_priv,
1273 op->gem.handle);
1274 if (!obj)
1275 return -ENOENT;
1276
1277 dma_resv_lock(obj->resv, NULL);
1278 op->vm_bo = drm_gpuvm_bo_obtain_locked(&uvmm->base, obj);
1279 dma_resv_unlock(obj->resv);
1280 if (IS_ERR(op->vm_bo))
1281 return PTR_ERR(op->vm_bo);
1282
1283 drm_gpuvm_bo_extobj_add(op->vm_bo);
1284 }
1285
1286 ret = bind_validate_op(job, op);
1287 if (ret)
1288 return ret;
1289 }
1290
1291 /* If a sparse region or mapping overlaps a dirty region, we need to
1292 * wait for the region to complete the unbind process. This is due to
1293 * how page table management is currently implemented. A future
1294 * implementation might change this.
1295 */
1296 ret = bind_validate_region(job);
1297 if (ret)
1298 return ret;
1299
1300 /* Once we start modifying the GPU VA space we need to keep holding the
1301 * uvmm lock until we can't fail anymore. This is due to the set of GPU
1302 * VA space changes must appear atomically and we need to be able to
1303 * unwind all GPU VA space changes on failure.
1304 */
1305 nouveau_uvmm_lock(uvmm);
1306
1307 list_for_each_op(op, &bind_job->ops) {
1308 switch (op->op) {
1309 case OP_MAP_SPARSE:
1310 ret = nouveau_uvma_region_create(uvmm,
1311 op->va.addr,
1312 op->va.range);
1313 if (ret)
1314 goto unwind_continue;
1315
1316 break;
1317 case OP_UNMAP_SPARSE:
1318 op->reg = nouveau_uvma_region_find(uvmm, op->va.addr,
1319 op->va.range);
1320 if (!op->reg || op->reg->dirty) {
1321 ret = -ENOENT;
1322 goto unwind_continue;
1323 }
1324
1325 op->ops = drm_gpuvm_sm_unmap_ops_create(&uvmm->base,
1326 op->va.addr,
1327 op->va.range);
1328 if (IS_ERR(op->ops)) {
1329 ret = PTR_ERR(op->ops);
1330 goto unwind_continue;
1331 }
1332
1333 ret = nouveau_uvmm_sm_unmap_prepare(uvmm, &op->new,
1334 op->ops);
1335 if (ret) {
1336 drm_gpuva_ops_free(&uvmm->base, op->ops);
1337 op->ops = NULL;
1338 op->reg = NULL;
1339 goto unwind_continue;
1340 }
1341
1342 nouveau_uvma_region_dirty(op->reg);
1343
1344 break;
1345 case OP_MAP: {
1346 struct nouveau_uvma_region *reg;
1347 struct drm_gpuvm_map_req map_req = {
1348 .map.va.addr = op->va.addr,
1349 .map.va.range = op->va.range,
1350 .map.gem.obj = op->gem.obj,
1351 .map.gem.offset = op->gem.offset,
1352 };
1353
1354 reg = nouveau_uvma_region_find_first(uvmm,
1355 op->va.addr,
1356 op->va.range);
1357 if (reg) {
1358 u64 reg_addr = reg->va.addr;
1359 u64 reg_end = reg_addr + reg->va.range;
1360 u64 op_addr = op->va.addr;
1361 u64 op_end = op_addr + op->va.range;
1362
1363 if (unlikely(reg->dirty)) {
1364 ret = -EINVAL;
1365 goto unwind_continue;
1366 }
1367
1368 /* Make sure the mapping is either outside of a
1369 * region or fully enclosed by a region.
1370 */
1371 if (reg_addr > op_addr || reg_end < op_end) {
1372 ret = -ENOSPC;
1373 goto unwind_continue;
1374 }
1375 }
1376
1377 op->ops = drm_gpuvm_sm_map_ops_create(&uvmm->base,
1378 &map_req);
1379 if (IS_ERR(op->ops)) {
1380 ret = PTR_ERR(op->ops);
1381 goto unwind_continue;
1382 }
1383
1384 ret = nouveau_uvmm_sm_map_prepare(uvmm, &op->new,
1385 reg, op->ops,
1386 op->va.addr,
1387 op->va.range,
1388 op->flags & 0xff);
1389 if (ret) {
1390 drm_gpuva_ops_free(&uvmm->base, op->ops);
1391 op->ops = NULL;
1392 goto unwind_continue;
1393 }
1394
1395 break;
1396 }
1397 case OP_UNMAP:
1398 op->ops = drm_gpuvm_sm_unmap_ops_create(&uvmm->base,
1399 op->va.addr,
1400 op->va.range);
1401 if (IS_ERR(op->ops)) {
1402 ret = PTR_ERR(op->ops);
1403 goto unwind_continue;
1404 }
1405
1406 ret = nouveau_uvmm_sm_unmap_prepare(uvmm, &op->new,
1407 op->ops);
1408 if (ret) {
1409 drm_gpuva_ops_free(&uvmm->base, op->ops);
1410 op->ops = NULL;
1411 goto unwind_continue;
1412 }
1413
1414 break;
1415 default:
1416 ret = -EINVAL;
1417 goto unwind_continue;
1418 }
1419 }
1420
1421 drm_exec_init(exec, vme->flags, 0);
1422 drm_exec_until_all_locked(exec) {
1423 ret = bind_lock_validate(job, exec, vme->num_fences);
1424 drm_exec_retry_on_contention(exec);
1425 if (ret) {
1426 op = list_last_op(&bind_job->ops);
1427 goto unwind;
1428 }
1429 }
1430
1431 /* Link and unlink GPUVAs while holding the dma_resv lock.
1432 *
1433 * As long as we validate() all GEMs and add fences to all GEMs DMA
1434 * reservations backing map and remap operations we can be sure there
1435 * won't be any concurrent (in)validations during job execution, hence
1436 * we're safe to check drm_gpuva_invalidated() within the fence
1437 * signalling critical path without holding a separate lock.
1438 *
1439 * GPUVAs about to be unmapped are safe as well, since they're unlinked
1440 * already.
1441 *
1442 * GEMs from map and remap operations must be validated before linking
1443 * their corresponding mappings to prevent the actual PT update to
1444 * happen right away in validate() rather than asynchronously as
1445 * intended.
1446 *
1447 * Note that after linking and unlinking the GPUVAs in this loop this
1448 * function cannot fail anymore, hence there is no need for an unwind
1449 * path.
1450 */
1451 list_for_each_op(op, &bind_job->ops) {
1452 switch (op->op) {
1453 case OP_UNMAP_SPARSE:
1454 case OP_MAP:
1455 case OP_UNMAP:
1456 bind_link_gpuvas(op);
1457 break;
1458 default:
1459 break;
1460 }
1461 }
1462 nouveau_uvmm_unlock(uvmm);
1463
1464 return 0;
1465
1466 unwind_continue:
1467 op = list_prev_op(op);
1468 unwind:
1469 list_for_each_op_from_reverse(op, &bind_job->ops) {
1470 switch (op->op) {
1471 case OP_MAP_SPARSE:
1472 nouveau_uvma_region_destroy(uvmm, op->va.addr,
1473 op->va.range);
1474 break;
1475 case OP_UNMAP_SPARSE:
1476 __nouveau_uvma_region_insert(uvmm, op->reg);
1477 nouveau_uvmm_sm_unmap_prepare_unwind(uvmm, &op->new,
1478 op->ops);
1479 break;
1480 case OP_MAP:
1481 nouveau_uvmm_sm_map_prepare_unwind(uvmm, &op->new,
1482 op->ops,
1483 op->va.addr,
1484 op->va.range);
1485 break;
1486 case OP_UNMAP:
1487 nouveau_uvmm_sm_unmap_prepare_unwind(uvmm, &op->new,
1488 op->ops);
1489 break;
1490 }
1491
1492 drm_gpuva_ops_free(&uvmm->base, op->ops);
1493 op->ops = NULL;
1494 op->reg = NULL;
1495 }
1496
1497 nouveau_uvmm_unlock(uvmm);
1498 drm_gpuvm_exec_unlock(vme);
1499 return ret;
1500 }
1501
1502 static void
nouveau_uvmm_bind_job_armed_submit(struct nouveau_job * job,struct drm_gpuvm_exec * vme)1503 nouveau_uvmm_bind_job_armed_submit(struct nouveau_job *job,
1504 struct drm_gpuvm_exec *vme)
1505 {
1506 drm_gpuvm_exec_resv_add_fence(vme, job->done_fence,
1507 job->resv_usage, job->resv_usage);
1508 drm_gpuvm_exec_unlock(vme);
1509 }
1510
1511 static struct dma_fence *
nouveau_uvmm_bind_job_run(struct nouveau_job * job)1512 nouveau_uvmm_bind_job_run(struct nouveau_job *job)
1513 {
1514 struct nouveau_uvmm_bind_job *bind_job = to_uvmm_bind_job(job);
1515 struct nouveau_uvmm *uvmm = nouveau_cli_uvmm(job->cli);
1516 struct bind_job_op *op;
1517 int ret = 0;
1518
1519 list_for_each_op(op, &bind_job->ops) {
1520 switch (op->op) {
1521 case OP_MAP_SPARSE:
1522 /* noop */
1523 break;
1524 case OP_MAP:
1525 ret = nouveau_uvmm_sm_map(uvmm, &op->new, op->ops);
1526 if (ret)
1527 goto out;
1528 break;
1529 case OP_UNMAP_SPARSE:
1530 fallthrough;
1531 case OP_UNMAP:
1532 ret = nouveau_uvmm_sm_unmap(uvmm, &op->new, op->ops);
1533 if (ret)
1534 goto out;
1535 break;
1536 }
1537 }
1538
1539 out:
1540 if (ret)
1541 NV_PRINTK(err, job->cli, "bind job failed: %d\n", ret);
1542 return ERR_PTR(ret);
1543 }
1544
1545 static void
nouveau_uvmm_bind_job_cleanup(struct nouveau_job * job)1546 nouveau_uvmm_bind_job_cleanup(struct nouveau_job *job)
1547 {
1548 struct nouveau_uvmm_bind_job *bind_job = to_uvmm_bind_job(job);
1549 struct nouveau_uvmm *uvmm = nouveau_cli_uvmm(job->cli);
1550 struct bind_job_op *op;
1551
1552 list_for_each_op(op, &bind_job->ops) {
1553 struct drm_gem_object *obj = op->gem.obj;
1554
1555 /* When nouveau_uvmm_bind_job_submit() fails op->ops and op->reg
1556 * will be NULL, hence skip the cleanup.
1557 */
1558 switch (op->op) {
1559 case OP_MAP_SPARSE:
1560 /* noop */
1561 break;
1562 case OP_UNMAP_SPARSE:
1563 if (!IS_ERR_OR_NULL(op->ops))
1564 nouveau_uvmm_sm_unmap_cleanup(uvmm, &op->new,
1565 op->ops);
1566
1567 if (op->reg) {
1568 nouveau_uvma_region_sparse_unref(op->reg);
1569 nouveau_uvmm_lock(uvmm);
1570 nouveau_uvma_region_remove(op->reg);
1571 nouveau_uvmm_unlock(uvmm);
1572 nouveau_uvma_region_complete(op->reg);
1573 nouveau_uvma_region_put(op->reg);
1574 }
1575
1576 break;
1577 case OP_MAP:
1578 if (!IS_ERR_OR_NULL(op->ops))
1579 nouveau_uvmm_sm_map_cleanup(uvmm, &op->new,
1580 op->ops);
1581 break;
1582 case OP_UNMAP:
1583 if (!IS_ERR_OR_NULL(op->ops))
1584 nouveau_uvmm_sm_unmap_cleanup(uvmm, &op->new,
1585 op->ops);
1586 break;
1587 }
1588
1589 if (!IS_ERR_OR_NULL(op->ops))
1590 drm_gpuva_ops_free(&uvmm->base, op->ops);
1591
1592 if (!IS_ERR_OR_NULL(op->vm_bo)) {
1593 dma_resv_lock(obj->resv, NULL);
1594 drm_gpuvm_bo_put(op->vm_bo);
1595 dma_resv_unlock(obj->resv);
1596 }
1597
1598 if (obj)
1599 drm_gem_object_put(obj);
1600 }
1601
1602 nouveau_job_done(job);
1603 complete_all(&bind_job->complete);
1604
1605 nouveau_uvmm_bind_job_put(bind_job);
1606 }
1607
1608 static const struct nouveau_job_ops nouveau_bind_job_ops = {
1609 .submit = nouveau_uvmm_bind_job_submit,
1610 .armed_submit = nouveau_uvmm_bind_job_armed_submit,
1611 .run = nouveau_uvmm_bind_job_run,
1612 .free = nouveau_uvmm_bind_job_cleanup,
1613 };
1614
1615 static int
bind_job_op_from_uop(struct bind_job_op ** pop,struct drm_nouveau_vm_bind_op * uop)1616 bind_job_op_from_uop(struct bind_job_op **pop,
1617 struct drm_nouveau_vm_bind_op *uop)
1618 {
1619 struct bind_job_op *op;
1620
1621 op = *pop = kzalloc_obj(*op);
1622 if (!op)
1623 return -ENOMEM;
1624
1625 switch (uop->op) {
1626 case OP_MAP:
1627 op->op = uop->flags & DRM_NOUVEAU_VM_BIND_SPARSE ?
1628 OP_MAP_SPARSE : OP_MAP;
1629 break;
1630 case OP_UNMAP:
1631 op->op = uop->flags & DRM_NOUVEAU_VM_BIND_SPARSE ?
1632 OP_UNMAP_SPARSE : OP_UNMAP;
1633 break;
1634 default:
1635 op->op = uop->op;
1636 break;
1637 }
1638
1639 op->flags = uop->flags;
1640 op->va.addr = uop->addr;
1641 op->va.range = uop->range;
1642 op->gem.handle = uop->handle;
1643 op->gem.offset = uop->bo_offset;
1644
1645 return 0;
1646 }
1647
1648 static void
bind_job_ops_free(struct list_head * ops)1649 bind_job_ops_free(struct list_head *ops)
1650 {
1651 struct bind_job_op *op, *next;
1652
1653 list_for_each_op_safe(op, next, ops) {
1654 list_del(&op->entry);
1655 kfree(op);
1656 }
1657 }
1658
1659 static int
nouveau_uvmm_bind_job_init(struct nouveau_uvmm_bind_job ** pjob,struct nouveau_uvmm_bind_job_args * __args)1660 nouveau_uvmm_bind_job_init(struct nouveau_uvmm_bind_job **pjob,
1661 struct nouveau_uvmm_bind_job_args *__args)
1662 {
1663 struct nouveau_uvmm_bind_job *job;
1664 struct nouveau_job_args args = {};
1665 struct bind_job_op *op;
1666 int i, ret;
1667
1668 ret = nouveau_uvmm_bind_job_alloc(&job);
1669 if (ret)
1670 return ret;
1671
1672 INIT_LIST_HEAD(&job->ops);
1673
1674 for (i = 0; i < __args->op.count; i++) {
1675 ret = bind_job_op_from_uop(&op, &__args->op.s[i]);
1676 if (ret)
1677 goto err_free;
1678
1679 list_add_tail(&op->entry, &job->ops);
1680 }
1681
1682 init_completion(&job->complete);
1683
1684 args.file_priv = __args->file_priv;
1685
1686 args.sched = __args->sched;
1687 args.credits = 1;
1688
1689 args.in_sync.count = __args->in_sync.count;
1690 args.in_sync.s = __args->in_sync.s;
1691
1692 args.out_sync.count = __args->out_sync.count;
1693 args.out_sync.s = __args->out_sync.s;
1694
1695 args.sync = !(__args->flags & DRM_NOUVEAU_VM_BIND_RUN_ASYNC);
1696 args.ops = &nouveau_bind_job_ops;
1697 args.resv_usage = DMA_RESV_USAGE_BOOKKEEP;
1698
1699 ret = nouveau_job_init(&job->base, &args);
1700 if (ret)
1701 goto err_free;
1702
1703 *pjob = job;
1704 return 0;
1705
1706 err_free:
1707 bind_job_ops_free(&job->ops);
1708 kfree(job);
1709 *pjob = NULL;
1710
1711 return ret;
1712 }
1713
1714 static int
nouveau_uvmm_vm_bind(struct nouveau_uvmm_bind_job_args * args)1715 nouveau_uvmm_vm_bind(struct nouveau_uvmm_bind_job_args *args)
1716 {
1717 struct nouveau_uvmm_bind_job *job;
1718 int ret;
1719
1720 ret = nouveau_uvmm_bind_job_init(&job, args);
1721 if (ret)
1722 return ret;
1723
1724 ret = nouveau_job_submit(&job->base);
1725 if (ret)
1726 goto err_job_fini;
1727
1728 return 0;
1729
1730 err_job_fini:
1731 nouveau_job_fini(&job->base);
1732 return ret;
1733 }
1734
1735 static int
nouveau_uvmm_vm_bind_ucopy(struct nouveau_uvmm_bind_job_args * args,struct drm_nouveau_vm_bind * req)1736 nouveau_uvmm_vm_bind_ucopy(struct nouveau_uvmm_bind_job_args *args,
1737 struct drm_nouveau_vm_bind *req)
1738 {
1739 struct drm_nouveau_sync **s;
1740 u32 inc = req->wait_count;
1741 u64 ins = req->wait_ptr;
1742 u32 outc = req->sig_count;
1743 u64 outs = req->sig_ptr;
1744 u32 opc = req->op_count;
1745 u64 ops = req->op_ptr;
1746 int ret;
1747
1748 args->flags = req->flags;
1749
1750 if (opc) {
1751 args->op.count = opc;
1752 args->op.s = u_memcpya(ops, opc,
1753 sizeof(*args->op.s));
1754 if (IS_ERR(args->op.s))
1755 return PTR_ERR(args->op.s);
1756 }
1757
1758 if (inc) {
1759 s = &args->in_sync.s;
1760
1761 args->in_sync.count = inc;
1762 *s = u_memcpya(ins, inc, sizeof(**s));
1763 if (IS_ERR(*s)) {
1764 ret = PTR_ERR(*s);
1765 goto err_free_ops;
1766 }
1767 }
1768
1769 if (outc) {
1770 s = &args->out_sync.s;
1771
1772 args->out_sync.count = outc;
1773 *s = u_memcpya(outs, outc, sizeof(**s));
1774 if (IS_ERR(*s)) {
1775 ret = PTR_ERR(*s);
1776 goto err_free_ins;
1777 }
1778 }
1779
1780 return 0;
1781
1782 err_free_ops:
1783 u_free(args->op.s);
1784 err_free_ins:
1785 u_free(args->in_sync.s);
1786 return ret;
1787 }
1788
1789 static void
nouveau_uvmm_vm_bind_ufree(struct nouveau_uvmm_bind_job_args * args)1790 nouveau_uvmm_vm_bind_ufree(struct nouveau_uvmm_bind_job_args *args)
1791 {
1792 u_free(args->op.s);
1793 u_free(args->in_sync.s);
1794 u_free(args->out_sync.s);
1795 }
1796
1797 int
nouveau_uvmm_ioctl_vm_bind(struct drm_device * dev,void * data,struct drm_file * file_priv)1798 nouveau_uvmm_ioctl_vm_bind(struct drm_device *dev,
1799 void *data,
1800 struct drm_file *file_priv)
1801 {
1802 struct nouveau_cli *cli = nouveau_cli(file_priv);
1803 struct nouveau_uvmm_bind_job_args args = {};
1804 struct drm_nouveau_vm_bind *req = data;
1805 int ret = 0;
1806
1807 if (unlikely(!nouveau_cli_uvmm_locked(cli)))
1808 return -ENOSYS;
1809
1810 ret = nouveau_uvmm_vm_bind_ucopy(&args, req);
1811 if (ret)
1812 return ret;
1813
1814 args.sched = cli->sched;
1815 args.file_priv = file_priv;
1816
1817 ret = nouveau_uvmm_vm_bind(&args);
1818 if (ret)
1819 goto out_free_args;
1820
1821 out_free_args:
1822 nouveau_uvmm_vm_bind_ufree(&args);
1823 return ret;
1824 }
1825
1826 void
nouveau_uvmm_bo_map_all(struct nouveau_bo * nvbo,struct nouveau_mem * mem)1827 nouveau_uvmm_bo_map_all(struct nouveau_bo *nvbo, struct nouveau_mem *mem)
1828 {
1829 struct drm_gem_object *obj = &nvbo->bo.base;
1830 struct drm_gpuvm_bo *vm_bo;
1831 struct drm_gpuva *va;
1832
1833 dma_resv_assert_held(obj->resv);
1834
1835 drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
1836 drm_gpuvm_bo_for_each_va(va, vm_bo) {
1837 struct nouveau_uvma *uvma = uvma_from_va(va);
1838
1839 nouveau_uvma_map(uvma, mem);
1840 drm_gpuva_invalidate(va, false);
1841 }
1842 }
1843 }
1844
1845 void
nouveau_uvmm_bo_unmap_all(struct nouveau_bo * nvbo)1846 nouveau_uvmm_bo_unmap_all(struct nouveau_bo *nvbo)
1847 {
1848 struct drm_gem_object *obj = &nvbo->bo.base;
1849 struct drm_gpuvm_bo *vm_bo;
1850 struct drm_gpuva *va;
1851
1852 dma_resv_assert_held(obj->resv);
1853
1854 drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
1855 drm_gpuvm_bo_for_each_va(va, vm_bo) {
1856 struct nouveau_uvma *uvma = uvma_from_va(va);
1857
1858 nouveau_uvma_unmap(uvma);
1859 drm_gpuva_invalidate(va, true);
1860 }
1861 }
1862 }
1863
1864 static void
nouveau_uvmm_free(struct drm_gpuvm * gpuvm)1865 nouveau_uvmm_free(struct drm_gpuvm *gpuvm)
1866 {
1867 struct nouveau_uvmm *uvmm = uvmm_from_gpuvm(gpuvm);
1868
1869 kfree(uvmm);
1870 }
1871
1872 static int
nouveau_uvmm_bo_validate(struct drm_gpuvm_bo * vm_bo,struct drm_exec * exec)1873 nouveau_uvmm_bo_validate(struct drm_gpuvm_bo *vm_bo, struct drm_exec *exec)
1874 {
1875 struct nouveau_bo *nvbo = nouveau_gem_object(vm_bo->obj);
1876
1877 nouveau_bo_placement_set(nvbo, nvbo->valid_domains, 0);
1878 return nouveau_bo_validate(nvbo, true, false);
1879 }
1880
1881 static const struct drm_gpuvm_ops gpuvm_ops = {
1882 .vm_free = nouveau_uvmm_free,
1883 .vm_bo_validate = nouveau_uvmm_bo_validate,
1884 };
1885
1886 int
nouveau_uvmm_ioctl_vm_init(struct drm_device * dev,void * data,struct drm_file * file_priv)1887 nouveau_uvmm_ioctl_vm_init(struct drm_device *dev,
1888 void *data,
1889 struct drm_file *file_priv)
1890 {
1891 struct nouveau_uvmm *uvmm;
1892 struct nouveau_cli *cli = nouveau_cli(file_priv);
1893 struct drm_device *drm = cli->drm->dev;
1894 struct drm_gem_object *r_obj;
1895 struct drm_nouveau_vm_init *init = data;
1896 u64 kernel_managed_end;
1897 int ret;
1898
1899 if (check_add_overflow(init->kernel_managed_addr,
1900 init->kernel_managed_size,
1901 &kernel_managed_end))
1902 return -EINVAL;
1903
1904 if (kernel_managed_end > NOUVEAU_VA_SPACE_END)
1905 return -EINVAL;
1906
1907 mutex_lock(&cli->mutex);
1908
1909 if (unlikely(cli->uvmm.disabled)) {
1910 ret = -ENOSYS;
1911 goto out_unlock;
1912 }
1913
1914 uvmm = kzalloc_obj(*uvmm);
1915 if (!uvmm) {
1916 ret = -ENOMEM;
1917 goto out_unlock;
1918 }
1919
1920 r_obj = drm_gpuvm_resv_object_alloc(drm);
1921 if (!r_obj) {
1922 kfree(uvmm);
1923 ret = -ENOMEM;
1924 goto out_unlock;
1925 }
1926
1927 mutex_init(&uvmm->mutex);
1928 mt_init_flags(&uvmm->region_mt, MT_FLAGS_LOCK_EXTERN);
1929 mt_set_external_lock(&uvmm->region_mt, &uvmm->mutex);
1930
1931 drm_gpuvm_init(&uvmm->base, cli->name, 0, drm, r_obj,
1932 NOUVEAU_VA_SPACE_START,
1933 NOUVEAU_VA_SPACE_END,
1934 init->kernel_managed_addr,
1935 init->kernel_managed_size,
1936 &gpuvm_ops);
1937 /* GPUVM takes care from here on. */
1938 drm_gem_object_put(r_obj);
1939
1940 ret = nvif_vmm_ctor(&cli->mmu, "uvmm",
1941 cli->vmm.vmm.object.oclass, RAW,
1942 init->kernel_managed_addr,
1943 init->kernel_managed_size,
1944 NULL, 0, &uvmm->vmm.vmm);
1945 if (ret)
1946 goto out_gpuvm_fini;
1947
1948 uvmm->vmm.cli = cli;
1949 cli->uvmm.ptr = uvmm;
1950 mutex_unlock(&cli->mutex);
1951
1952 return 0;
1953
1954 out_gpuvm_fini:
1955 drm_gpuvm_put(&uvmm->base);
1956 out_unlock:
1957 mutex_unlock(&cli->mutex);
1958 return ret;
1959 }
1960
1961 void
nouveau_uvmm_fini(struct nouveau_uvmm * uvmm)1962 nouveau_uvmm_fini(struct nouveau_uvmm *uvmm)
1963 {
1964 MA_STATE(mas, &uvmm->region_mt, 0, 0);
1965 struct nouveau_uvma_region *reg;
1966 struct nouveau_cli *cli = uvmm->vmm.cli;
1967 struct drm_gpuva *va, *next;
1968
1969 nouveau_uvmm_lock(uvmm);
1970 drm_gpuvm_for_each_va_safe(va, next, &uvmm->base) {
1971 struct nouveau_uvma *uvma = uvma_from_va(va);
1972 struct drm_gem_object *obj = va->gem.obj;
1973
1974 if (unlikely(va == &uvmm->base.kernel_alloc_node))
1975 continue;
1976
1977 drm_gpuva_remove(va);
1978
1979 dma_resv_lock(obj->resv, NULL);
1980 drm_gpuva_unlink(va);
1981 dma_resv_unlock(obj->resv);
1982
1983 nouveau_uvma_unmap(uvma);
1984 nouveau_uvma_vmm_put(uvma);
1985
1986 nouveau_uvma_gem_put(uvma);
1987 nouveau_uvma_free(uvma);
1988 }
1989
1990 mas_for_each(&mas, reg, ULONG_MAX) {
1991 mas_erase(&mas);
1992 nouveau_uvma_region_sparse_unref(reg);
1993 nouveau_uvma_region_put(reg);
1994 }
1995
1996 WARN(!mtree_empty(&uvmm->region_mt),
1997 "nouveau_uvma_region tree not empty, potentially leaking memory.");
1998 __mt_destroy(&uvmm->region_mt);
1999 nouveau_uvmm_unlock(uvmm);
2000
2001 mutex_lock(&cli->mutex);
2002 nouveau_vmm_fini(&uvmm->vmm);
2003 drm_gpuvm_put(&uvmm->base);
2004 mutex_unlock(&cli->mutex);
2005 }
2006