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 99