142594600SBen Skeggs #ifndef __NVKM_MMU_H__ 242594600SBen Skeggs #define __NVKM_MMU_H__ 35ce3bf3cSBen Skeggs #include <core/subdev.h> 4eb813999SBen Skeggs #include <core/memory.h> 55ce3bf3cSBen Skeggs #include <core/mm.h> 64246b92cSBen Skeggs struct nvkm_gpuobj; 742594600SBen Skeggs struct nvkm_mem; 85ce3bf3cSBen Skeggs 942594600SBen Skeggs struct nvkm_vm_pgt { 10d0659d32SBen Skeggs struct nvkm_memory *mem[2]; 115ce3bf3cSBen Skeggs u32 refcount[2]; 125ce3bf3cSBen Skeggs }; 135ce3bf3cSBen Skeggs 1442594600SBen Skeggs struct nvkm_vma { 15eb813999SBen Skeggs struct nvkm_memory *memory; 16eb813999SBen Skeggs struct nvkm_tags *tags; 1742594600SBen Skeggs struct nvkm_vm *vm; 1842594600SBen Skeggs struct nvkm_mm_node *node; 199ce523ccSBen Skeggs union { 205ce3bf3cSBen Skeggs u64 offset; 219ce523ccSBen Skeggs u64 addr; 229ce523ccSBen Skeggs }; 235ce3bf3cSBen Skeggs u32 access; 245ce3bf3cSBen Skeggs }; 255ce3bf3cSBen Skeggs 2642594600SBen Skeggs struct nvkm_vm { 27806a7335SBen Skeggs const struct nvkm_vmm_func *func; 2842594600SBen Skeggs struct nvkm_mmu *mmu; 29806a7335SBen Skeggs const char *name; 30eb813999SBen Skeggs u32 debug; 31806a7335SBen Skeggs struct kref kref; 321de68568SBen Skeggs struct mutex mutex; 33806a7335SBen Skeggs 34806a7335SBen Skeggs u64 start; 35806a7335SBen Skeggs u64 limit; 36806a7335SBen Skeggs 37806a7335SBen Skeggs struct nvkm_vmm_pt *pd; 38806a7335SBen Skeggs struct list_head join; 39806a7335SBen Skeggs 4042594600SBen Skeggs struct nvkm_mm mm; 415ce3bf3cSBen Skeggs struct kref refcount; 4242594600SBen Skeggs struct nvkm_vm_pgt *pgt; 435ce3bf3cSBen Skeggs u32 fpde; 445ce3bf3cSBen Skeggs u32 lpde; 455e075fdeSBen Skeggs 465e075fdeSBen Skeggs bool bootstrapped; 47806a7335SBen Skeggs atomic_t engref[NVKM_SUBDEV_NR]; 4803b0ba7bSBen Skeggs 4903b0ba7bSBen Skeggs dma_addr_t null; 5003b0ba7bSBen Skeggs void *nullp; 515ce3bf3cSBen Skeggs }; 525ce3bf3cSBen Skeggs 5342594600SBen Skeggs int nvkm_vm_new(struct nvkm_device *, u64 offset, u64 length, u64 mm_offset, 541de68568SBen Skeggs struct lock_class_key *, struct nvkm_vm **); 55d30af7ceSBen Skeggs int nvkm_vm_ref(struct nvkm_vm *, struct nvkm_vm **, struct nvkm_memory *inst); 56d8e83994SBen Skeggs int nvkm_vm_boot(struct nvkm_vm *, u64 size); 5742594600SBen Skeggs int nvkm_vm_get(struct nvkm_vm *, u64 size, u32 page_shift, u32 access, 5842594600SBen Skeggs struct nvkm_vma *); 5942594600SBen Skeggs void nvkm_vm_put(struct nvkm_vma *); 6042594600SBen Skeggs void nvkm_vm_map(struct nvkm_vma *, struct nvkm_mem *); 6142594600SBen Skeggs void nvkm_vm_map_at(struct nvkm_vma *, u64 offset, struct nvkm_mem *); 6242594600SBen Skeggs void nvkm_vm_unmap(struct nvkm_vma *); 6342594600SBen Skeggs void nvkm_vm_unmap_at(struct nvkm_vma *, u64 offset, u64 length); 64c9582455SBen Skeggs 65eb813999SBen Skeggs int nvkm_vmm_boot(struct nvkm_vmm *); 66eb813999SBen Skeggs 67eb813999SBen Skeggs struct nvkm_vmm_map { 68eb813999SBen Skeggs struct nvkm_memory *memory; 69eb813999SBen Skeggs u64 offset; 70eb813999SBen Skeggs 71eb813999SBen Skeggs struct nvkm_mm_node *mem; 72eb813999SBen Skeggs struct scatterlist *sgl; 73eb813999SBen Skeggs dma_addr_t *dma; 74eb813999SBen Skeggs u64 off; 75eb813999SBen Skeggs 76eb813999SBen Skeggs const struct nvkm_vmm_page *page; 77eb813999SBen Skeggs 78eb813999SBen Skeggs struct nvkm_tags *tags; 79eb813999SBen Skeggs u64 next; 80eb813999SBen Skeggs u64 type; 81eb813999SBen Skeggs u64 ctag; 82eb813999SBen Skeggs }; 83eb813999SBen Skeggs 84c9582455SBen Skeggs struct nvkm_mmu { 85c9582455SBen Skeggs const struct nvkm_mmu_func *func; 86c9582455SBen Skeggs struct nvkm_subdev subdev; 87c9582455SBen Skeggs 88c9582455SBen Skeggs u64 limit; 89c9582455SBen Skeggs u8 dma_bits; 90c9582455SBen Skeggs u8 lpg_shift; 910b11b30dSBen Skeggs 920b11b30dSBen Skeggs struct nvkm_vmm *vmm; 939a45ddaaSBen Skeggs 949a45ddaaSBen Skeggs struct { 959a45ddaaSBen Skeggs struct mutex mutex; 969a45ddaaSBen Skeggs struct list_head list; 97f1280394SBen Skeggs } ptc, ptp; 98c9582455SBen Skeggs }; 99c9582455SBen Skeggs 100c9582455SBen Skeggs int nv04_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 101c9582455SBen Skeggs int nv41_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 102c9582455SBen Skeggs int nv44_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 103c9582455SBen Skeggs int nv50_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 1040f43715fSBen Skeggs int g84_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 105c9582455SBen Skeggs int gf100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 106db018585SBen Skeggs int gk104_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 107d1f6c8d2SBen Skeggs int gk20a_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 108e1e33c79SBen Skeggs int gm200_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 109cedc4d57SBen Skeggs int gm20b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 110b86a4587SBen Skeggs int gp100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 1116359c982SBen Skeggs int gp10b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 1125ce3bf3cSBen Skeggs #endif 113