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