| /* SPDX-License-Identifier: MIT */ |
| |
| #ifndef __NOUVEAU_UVMM_H__ |
| #define __NOUVEAU_UVMM_H__ |
| |
| #include <drm/drm_gpuvm.h> |
| |
| #include "nouveau_drv.h" |
| |
| struct nouveau_uvmm { |
| struct drm_gpuvm base; |
| struct nouveau_vmm vmm; |
| struct maple_tree region_mt; |
| struct mutex mutex; |
| struct dma_resv resv; |
| |
| u64 kernel_managed_addr; |
| u64 kernel_managed_size; |
| |
| bool disabled; |
| }; |
| |
| struct nouveau_uvma_region { |
| struct nouveau_uvmm *uvmm; |
| |
| struct { |
| u64 addr; |
| u64 range; |
| } va; |
| |
| struct kref kref; |
| |
| struct completion complete; |
| bool dirty; |
| }; |
| |
| struct nouveau_uvma { |
| struct drm_gpuva va; |
| |
| struct nouveau_uvma_region *region; |
| u8 kind; |
| }; |
| |
| #define uvmm_from_gpuvm(x) container_of((x), struct nouveau_uvmm, base) |
| #define uvma_from_va(x) container_of((x), struct nouveau_uvma, va) |
| |
| #define to_uvmm(x) uvmm_from_gpuvm((x)->va.vm) |
| |
| struct nouveau_uvmm_bind_job { |
| struct nouveau_job base; |
| |
| struct kref kref; |
| struct list_head entry; |
| struct work_struct work; |
| struct completion complete; |
| |
| /* struct bind_job_op */ |
| struct list_head ops; |
| }; |
| |
| struct nouveau_uvmm_bind_job_args { |
| struct drm_file *file_priv; |
| struct nouveau_sched_entity *sched_entity; |
| |
| unsigned int flags; |
| |
| struct { |
| struct drm_nouveau_sync *s; |
| u32 count; |
| } in_sync; |
| |
| struct { |
| struct drm_nouveau_sync *s; |
| u32 count; |
| } out_sync; |
| |
| struct { |
| struct drm_nouveau_vm_bind_op *s; |
| u32 count; |
| } op; |
| }; |
| |
| #define to_uvmm_bind_job(job) container_of((job), struct nouveau_uvmm_bind_job, base) |
| |
| int nouveau_uvmm_init(struct nouveau_uvmm *uvmm, struct nouveau_cli *cli, |
| u64 kernel_managed_addr, u64 kernel_managed_size); |
| void nouveau_uvmm_fini(struct nouveau_uvmm *uvmm); |
| |
| void nouveau_uvmm_bo_map_all(struct nouveau_bo *nvbov, struct nouveau_mem *mem); |
| void nouveau_uvmm_bo_unmap_all(struct nouveau_bo *nvbo); |
| |
| int nouveau_uvmm_ioctl_vm_init(struct drm_device *dev, void *data, |
| struct drm_file *file_priv); |
| |
| int nouveau_uvmm_ioctl_vm_bind(struct drm_device *dev, void *data, |
| struct drm_file *file_priv); |
| |
| static inline void nouveau_uvmm_lock(struct nouveau_uvmm *uvmm) |
| { |
| mutex_lock(&uvmm->mutex); |
| } |
| |
| static inline void nouveau_uvmm_unlock(struct nouveau_uvmm *uvmm) |
| { |
| mutex_unlock(&uvmm->mutex); |
| } |
| |
| #endif |