]>
Commit | Line | Data |
---|---|---|
42594600 BS |
1 | #ifndef __NVKM_MMU_H__ |
2 | #define __NVKM_MMU_H__ | |
3863c9bc | 3 | #include <core/subdev.h> |
02a841d4 | 4 | #include <core/mm.h> |
42594600 BS |
5 | struct nvkm_device; |
6 | struct nvkm_mem; | |
a11c3198 | 7 | |
42594600 BS |
8 | struct nvkm_vm_pgt { |
9 | struct nvkm_gpuobj *obj[2]; | |
3ee01281 | 10 | u32 refcount[2]; |
a11c3198 BS |
11 | }; |
12 | ||
42594600 | 13 | struct nvkm_vm_pgd { |
a11c3198 | 14 | struct list_head head; |
42594600 | 15 | struct nvkm_gpuobj *obj; |
a11c3198 | 16 | }; |
3863c9bc | 17 | |
42594600 | 18 | struct nvkm_vma { |
fd2871af | 19 | struct list_head head; |
2fd3db6f | 20 | int refcount; |
42594600 BS |
21 | struct nvkm_vm *vm; |
22 | struct nvkm_mm_node *node; | |
a11c3198 BS |
23 | u64 offset; |
24 | u32 access; | |
25 | }; | |
26 | ||
42594600 BS |
27 | struct nvkm_vm { |
28 | struct nvkm_mmu *mmu; | |
1de68568 BS |
29 | |
30 | struct mutex mutex; | |
42594600 | 31 | struct nvkm_mm mm; |
e0bacd2f | 32 | struct kref refcount; |
a11c3198 BS |
33 | |
34 | struct list_head pgd_list; | |
c3032adb | 35 | atomic_t engref[NVDEV_SUBDEV_NR]; |
a11c3198 | 36 | |
42594600 | 37 | struct nvkm_vm_pgt *pgt; |
a11c3198 BS |
38 | u32 fpde; |
39 | u32 lpde; | |
3863c9bc BS |
40 | }; |
41 | ||
42594600 | 42 | struct nvkm_mmu { |
1f5bffca | 43 | struct nvkm_subdev subdev; |
a11c3198 | 44 | |
ebb945a9 | 45 | u64 limit; |
dc73b45a | 46 | u8 dma_bits; |
a11c3198 BS |
47 | u32 pgt_bits; |
48 | u8 spg_shift; | |
49 | u8 lpg_shift; | |
50 | ||
42594600 | 51 | int (*create)(struct nvkm_mmu *, u64 offset, u64 length, |
1de68568 BS |
52 | u64 mm_offset, struct lock_class_key *, |
53 | struct nvkm_vm **); | |
3863c9bc | 54 | |
42594600 BS |
55 | void (*map_pgt)(struct nvkm_gpuobj *pgd, u32 pde, |
56 | struct nvkm_gpuobj *pgt[2]); | |
57 | void (*map)(struct nvkm_vma *, struct nvkm_gpuobj *, | |
58 | struct nvkm_mem *, u32 pte, u32 cnt, | |
8f7286f8 | 59 | u64 phys, u64 delta); |
42594600 BS |
60 | void (*map_sg)(struct nvkm_vma *, struct nvkm_gpuobj *, |
61 | struct nvkm_mem *, u32 pte, u32 cnt, dma_addr_t *); | |
62 | void (*unmap)(struct nvkm_gpuobj *pgt, u32 pte, u32 cnt); | |
63 | void (*flush)(struct nvkm_vm *); | |
a11c3198 BS |
64 | }; |
65 | ||
42594600 BS |
66 | static inline struct nvkm_mmu * |
67 | nvkm_mmu(void *obj) | |
3863c9bc | 68 | { |
42594600 | 69 | return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_MMU); |
3863c9bc BS |
70 | } |
71 | ||
42594600 BS |
72 | #define nvkm_mmu_create(p,e,o,i,f,d) \ |
73 | nvkm_subdev_create((p), (e), (o), 0, (i), (f), (d)) | |
74 | #define nvkm_mmu_destroy(p) \ | |
1f5bffca | 75 | nvkm_subdev_destroy(&(p)->subdev) |
42594600 | 76 | #define nvkm_mmu_init(p) \ |
3a8c3400 | 77 | nvkm_subdev_init_old(&(p)->subdev) |
42594600 | 78 | #define nvkm_mmu_fini(p,s) \ |
3a8c3400 | 79 | nvkm_subdev_fini_old(&(p)->subdev, (s)) |
42594600 BS |
80 | |
81 | #define _nvkm_mmu_dtor _nvkm_subdev_dtor | |
82 | #define _nvkm_mmu_init _nvkm_subdev_init | |
83 | #define _nvkm_mmu_fini _nvkm_subdev_fini | |
84 | ||
85 | extern struct nvkm_oclass nv04_mmu_oclass; | |
86 | extern struct nvkm_oclass nv41_mmu_oclass; | |
87 | extern struct nvkm_oclass nv44_mmu_oclass; | |
88 | extern struct nvkm_oclass nv50_mmu_oclass; | |
89 | extern struct nvkm_oclass gf100_mmu_oclass; | |
90 | ||
1de68568 | 91 | int nv04_vm_create(struct nvkm_mmu *, u64, u64, u64, struct lock_class_key *, |
42594600 BS |
92 | struct nvkm_vm **); |
93 | void nv04_mmu_dtor(struct nvkm_object *); | |
94 | ||
95 | int nvkm_vm_create(struct nvkm_mmu *, u64 offset, u64 length, u64 mm_offset, | |
1de68568 | 96 | u32 block, struct lock_class_key *, struct nvkm_vm **); |
42594600 | 97 | int nvkm_vm_new(struct nvkm_device *, u64 offset, u64 length, u64 mm_offset, |
1de68568 | 98 | struct lock_class_key *, struct nvkm_vm **); |
42594600 BS |
99 | int nvkm_vm_ref(struct nvkm_vm *, struct nvkm_vm **, struct nvkm_gpuobj *pgd); |
100 | int nvkm_vm_get(struct nvkm_vm *, u64 size, u32 page_shift, u32 access, | |
101 | struct nvkm_vma *); | |
102 | void nvkm_vm_put(struct nvkm_vma *); | |
103 | void nvkm_vm_map(struct nvkm_vma *, struct nvkm_mem *); | |
104 | void nvkm_vm_map_at(struct nvkm_vma *, u64 offset, struct nvkm_mem *); | |
105 | void nvkm_vm_unmap(struct nvkm_vma *); | |
106 | void nvkm_vm_unmap_at(struct nvkm_vma *, u64 offset, u64 length); | |
a11c3198 | 107 | #endif |