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