142594600SBen Skeggs #ifndef __NVKM_MMU_H__ 242594600SBen Skeggs #define __NVKM_MMU_H__ 35ce3bf3cSBen Skeggs #include <core/subdev.h> 45ce3bf3cSBen Skeggs #include <core/mm.h> 542594600SBen Skeggs struct nvkm_device; 642594600SBen Skeggs struct nvkm_mem; 75ce3bf3cSBen Skeggs 842594600SBen Skeggs struct nvkm_vm_pgt { 942594600SBen Skeggs struct nvkm_gpuobj *obj[2]; 105ce3bf3cSBen Skeggs u32 refcount[2]; 115ce3bf3cSBen Skeggs }; 125ce3bf3cSBen Skeggs 1342594600SBen Skeggs struct nvkm_vm_pgd { 145ce3bf3cSBen Skeggs struct list_head head; 1542594600SBen Skeggs struct nvkm_gpuobj *obj; 165ce3bf3cSBen Skeggs }; 175ce3bf3cSBen Skeggs 1842594600SBen Skeggs struct nvkm_vma { 195ce3bf3cSBen Skeggs struct list_head head; 205ce3bf3cSBen Skeggs int refcount; 2142594600SBen Skeggs struct nvkm_vm *vm; 2242594600SBen Skeggs struct nvkm_mm_node *node; 235ce3bf3cSBen Skeggs u64 offset; 245ce3bf3cSBen Skeggs u32 access; 255ce3bf3cSBen Skeggs }; 265ce3bf3cSBen Skeggs 2742594600SBen Skeggs struct nvkm_vm { 2842594600SBen Skeggs struct nvkm_mmu *mmu; 291de68568SBen Skeggs 301de68568SBen Skeggs struct mutex mutex; 3142594600SBen Skeggs struct nvkm_mm mm; 325ce3bf3cSBen Skeggs struct kref refcount; 335ce3bf3cSBen Skeggs 345ce3bf3cSBen Skeggs struct list_head pgd_list; 355ce3bf3cSBen Skeggs atomic_t engref[NVDEV_SUBDEV_NR]; 365ce3bf3cSBen Skeggs 3742594600SBen Skeggs struct nvkm_vm_pgt *pgt; 385ce3bf3cSBen Skeggs u32 fpde; 395ce3bf3cSBen Skeggs u32 lpde; 405ce3bf3cSBen Skeggs }; 415ce3bf3cSBen Skeggs 4242594600SBen Skeggs struct nvkm_mmu { 431f5bffcaSBen Skeggs struct nvkm_subdev subdev; 445ce3bf3cSBen Skeggs 455ce3bf3cSBen Skeggs u64 limit; 465ce3bf3cSBen Skeggs u8 dma_bits; 475ce3bf3cSBen Skeggs u32 pgt_bits; 485ce3bf3cSBen Skeggs u8 spg_shift; 495ce3bf3cSBen Skeggs u8 lpg_shift; 505ce3bf3cSBen Skeggs 5142594600SBen Skeggs int (*create)(struct nvkm_mmu *, u64 offset, u64 length, 521de68568SBen Skeggs u64 mm_offset, struct lock_class_key *, 531de68568SBen Skeggs struct nvkm_vm **); 545ce3bf3cSBen Skeggs 5542594600SBen Skeggs void (*map_pgt)(struct nvkm_gpuobj *pgd, u32 pde, 5642594600SBen Skeggs struct nvkm_gpuobj *pgt[2]); 5742594600SBen Skeggs void (*map)(struct nvkm_vma *, struct nvkm_gpuobj *, 5842594600SBen Skeggs struct nvkm_mem *, u32 pte, u32 cnt, 595ce3bf3cSBen Skeggs u64 phys, u64 delta); 6042594600SBen Skeggs void (*map_sg)(struct nvkm_vma *, struct nvkm_gpuobj *, 6142594600SBen Skeggs struct nvkm_mem *, u32 pte, u32 cnt, dma_addr_t *); 6242594600SBen Skeggs void (*unmap)(struct nvkm_gpuobj *pgt, u32 pte, u32 cnt); 6342594600SBen Skeggs void (*flush)(struct nvkm_vm *); 645ce3bf3cSBen Skeggs }; 655ce3bf3cSBen Skeggs 6642594600SBen Skeggs static inline struct nvkm_mmu * 6742594600SBen Skeggs nvkm_mmu(void *obj) 685ce3bf3cSBen Skeggs { 6942594600SBen Skeggs return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_MMU); 705ce3bf3cSBen Skeggs } 715ce3bf3cSBen Skeggs 7242594600SBen Skeggs #define nvkm_mmu_create(p,e,o,i,f,d) \ 7342594600SBen Skeggs nvkm_subdev_create((p), (e), (o), 0, (i), (f), (d)) 7442594600SBen Skeggs #define nvkm_mmu_destroy(p) \ 751f5bffcaSBen Skeggs nvkm_subdev_destroy(&(p)->subdev) 7642594600SBen Skeggs #define nvkm_mmu_init(p) \ 773a8c3400SBen Skeggs nvkm_subdev_init_old(&(p)->subdev) 7842594600SBen Skeggs #define nvkm_mmu_fini(p,s) \ 793a8c3400SBen Skeggs nvkm_subdev_fini_old(&(p)->subdev, (s)) 805ce3bf3cSBen Skeggs 8142594600SBen Skeggs #define _nvkm_mmu_dtor _nvkm_subdev_dtor 8242594600SBen Skeggs #define _nvkm_mmu_init _nvkm_subdev_init 8342594600SBen Skeggs #define _nvkm_mmu_fini _nvkm_subdev_fini 845ce3bf3cSBen Skeggs 8542594600SBen Skeggs extern struct nvkm_oclass nv04_mmu_oclass; 8642594600SBen Skeggs extern struct nvkm_oclass nv41_mmu_oclass; 8742594600SBen Skeggs extern struct nvkm_oclass nv44_mmu_oclass; 8842594600SBen Skeggs extern struct nvkm_oclass nv50_mmu_oclass; 8942594600SBen Skeggs extern struct nvkm_oclass gf100_mmu_oclass; 905ce3bf3cSBen Skeggs 911de68568SBen Skeggs int nv04_vm_create(struct nvkm_mmu *, u64, u64, u64, struct lock_class_key *, 9242594600SBen Skeggs struct nvkm_vm **); 9342594600SBen Skeggs void nv04_mmu_dtor(struct nvkm_object *); 945ce3bf3cSBen Skeggs 9542594600SBen Skeggs int nvkm_vm_create(struct nvkm_mmu *, u64 offset, u64 length, u64 mm_offset, 961de68568SBen Skeggs u32 block, struct lock_class_key *, struct nvkm_vm **); 9742594600SBen Skeggs int nvkm_vm_new(struct nvkm_device *, u64 offset, u64 length, u64 mm_offset, 981de68568SBen Skeggs struct lock_class_key *, struct nvkm_vm **); 9942594600SBen Skeggs int nvkm_vm_ref(struct nvkm_vm *, struct nvkm_vm **, struct nvkm_gpuobj *pgd); 100d8e83994SBen Skeggs int nvkm_vm_boot(struct nvkm_vm *, u64 size); 10142594600SBen Skeggs int nvkm_vm_get(struct nvkm_vm *, u64 size, u32 page_shift, u32 access, 10242594600SBen Skeggs struct nvkm_vma *); 10342594600SBen Skeggs void nvkm_vm_put(struct nvkm_vma *); 10442594600SBen Skeggs void nvkm_vm_map(struct nvkm_vma *, struct nvkm_mem *); 10542594600SBen Skeggs void nvkm_vm_map_at(struct nvkm_vma *, u64 offset, struct nvkm_mem *); 10642594600SBen Skeggs void nvkm_vm_unmap(struct nvkm_vma *); 10742594600SBen Skeggs void nvkm_vm_unmap_at(struct nvkm_vma *, u64 offset, u64 length); 1085ce3bf3cSBen Skeggs #endif 109