xref: /linux/drivers/gpu/drm/nouveau/nouveau_uvmm.h (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
1 /* SPDX-License-Identifier: MIT */
2 
3 #ifndef __NOUVEAU_UVMM_H__
4 #define __NOUVEAU_UVMM_H__
5 
6 #include <drm/drm_gpuvm.h>
7 
8 #include "nouveau_drv.h"
9 
10 struct nouveau_uvmm {
11 	struct drm_gpuvm base;
12 	struct nouveau_vmm vmm;
13 	struct maple_tree region_mt;
14 	struct mutex mutex;
15 };
16 
17 struct nouveau_uvma_region {
18 	struct nouveau_uvmm *uvmm;
19 
20 	struct {
21 		u64 addr;
22 		u64 range;
23 	} va;
24 
25 	struct kref kref;
26 
27 	struct completion complete;
28 	bool dirty;
29 };
30 
31 struct nouveau_uvma {
32 	struct drm_gpuva va;
33 
34 	struct nouveau_uvma_region *region;
35 	u8 kind;
36 };
37 
38 #define uvmm_from_gpuvm(x) container_of((x), struct nouveau_uvmm, base)
39 #define uvma_from_va(x) container_of((x), struct nouveau_uvma, va)
40 
41 #define to_uvmm(x) uvmm_from_gpuvm((x)->va.vm)
42 
43 struct nouveau_uvmm_bind_job {
44 	struct nouveau_job base;
45 
46 	struct kref kref;
47 	struct completion complete;
48 
49 	/* struct bind_job_op */
50 	struct list_head ops;
51 };
52 
53 struct nouveau_uvmm_bind_job_args {
54 	struct drm_file *file_priv;
55 	struct nouveau_sched *sched;
56 
57 	unsigned int flags;
58 
59 	struct {
60 		struct drm_nouveau_sync *s;
61 		u32 count;
62 	} in_sync;
63 
64 	struct {
65 		struct drm_nouveau_sync *s;
66 		u32 count;
67 	} out_sync;
68 
69 	struct {
70 		struct drm_nouveau_vm_bind_op *s;
71 		u32 count;
72 	} op;
73 };
74 
75 #define to_uvmm_bind_job(job) container_of((job), struct nouveau_uvmm_bind_job, base)
76 
77 void nouveau_uvmm_fini(struct nouveau_uvmm *uvmm);
78 
79 void nouveau_uvmm_bo_map_all(struct nouveau_bo *nvbov, struct nouveau_mem *mem);
80 void nouveau_uvmm_bo_unmap_all(struct nouveau_bo *nvbo);
81 
82 int nouveau_uvmm_ioctl_vm_init(struct drm_device *dev, void *data,
83 			       struct drm_file *file_priv);
84 
85 int nouveau_uvmm_ioctl_vm_bind(struct drm_device *dev, void *data,
86 			       struct drm_file *file_priv);
87 
nouveau_uvmm_lock(struct nouveau_uvmm * uvmm)88 static inline void nouveau_uvmm_lock(struct nouveau_uvmm *uvmm)
89 {
90 	mutex_lock(&uvmm->mutex);
91 }
92 
nouveau_uvmm_unlock(struct nouveau_uvmm * uvmm)93 static inline void nouveau_uvmm_unlock(struct nouveau_uvmm *uvmm)
94 {
95 	mutex_unlock(&uvmm->mutex);
96 }
97 
98 #endif
99