xref: /openbmc/linux/drivers/gpu/drm/nouveau/nouveau_uvmm.c (revision c005e2f62f8421b13b9a31adb9db7281f1a19e68)
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(&reg->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(&reg->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(&reg);
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(&reg->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(&reg->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(&reg->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