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