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