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