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