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