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 | |
88 | static inline void nouveau_uvmm_lock(struct nouveau_uvmm *uvmm) |
89 | { |
90 | mutex_lock(&uvmm->mutex); |
91 | } |
92 | |
93 | static inline void nouveau_uvmm_unlock(struct nouveau_uvmm *uvmm) |
94 | { |
95 | mutex_unlock(lock: &uvmm->mutex); |
96 | } |
97 | |
98 | #endif |
99 | |