Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[linux-2.6-microblaze.git] / drivers / gpu / drm / nouveau / nouveau_uvmm.h
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(&uvmm->mutex);
96 }
97
98 #endif