]>
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; | |
29 | struct nvkm_mm mm; | |
e0bacd2f | 30 | struct kref refcount; |
a11c3198 BS |
31 | |
32 | struct list_head pgd_list; | |
c3032adb | 33 | atomic_t engref[NVDEV_SUBDEV_NR]; |
a11c3198 | 34 | |
42594600 | 35 | struct nvkm_vm_pgt *pgt; |
a11c3198 BS |
36 | u32 fpde; |
37 | u32 lpde; | |
3863c9bc BS |
38 | }; |
39 | ||
42594600 | 40 | struct nvkm_mmu { |
1f5bffca | 41 | struct nvkm_subdev subdev; |
a11c3198 | 42 | |
ebb945a9 | 43 | u64 limit; |
dc73b45a | 44 | u8 dma_bits; |
a11c3198 BS |
45 | u32 pgt_bits; |
46 | u8 spg_shift; | |
47 | u8 lpg_shift; | |
48 | ||
42594600 BS |
49 | int (*create)(struct nvkm_mmu *, u64 offset, u64 length, |
50 | u64 mm_offset, struct nvkm_vm **); | |
3863c9bc | 51 | |
42594600 BS |
52 | void (*map_pgt)(struct nvkm_gpuobj *pgd, u32 pde, |
53 | struct nvkm_gpuobj *pgt[2]); | |
54 | void (*map)(struct nvkm_vma *, struct nvkm_gpuobj *, | |
55 | struct nvkm_mem *, u32 pte, u32 cnt, | |
8f7286f8 | 56 | u64 phys, u64 delta); |
42594600 BS |
57 | void (*map_sg)(struct nvkm_vma *, struct nvkm_gpuobj *, |
58 | struct nvkm_mem *, u32 pte, u32 cnt, dma_addr_t *); | |
59 | void (*unmap)(struct nvkm_gpuobj *pgt, u32 pte, u32 cnt); | |
60 | void (*flush)(struct nvkm_vm *); | |
a11c3198 BS |
61 | }; |
62 | ||
42594600 BS |
63 | static inline struct nvkm_mmu * |
64 | nvkm_mmu(void *obj) | |
3863c9bc | 65 | { |
42594600 | 66 | return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_MMU); |
3863c9bc BS |
67 | } |
68 | ||
42594600 BS |
69 | #define nvkm_mmu_create(p,e,o,i,f,d) \ |
70 | nvkm_subdev_create((p), (e), (o), 0, (i), (f), (d)) | |
71 | #define nvkm_mmu_destroy(p) \ | |
1f5bffca | 72 | nvkm_subdev_destroy(&(p)->subdev) |
42594600 | 73 | #define nvkm_mmu_init(p) \ |
3a8c3400 | 74 | nvkm_subdev_init_old(&(p)->subdev) |
42594600 | 75 | #define nvkm_mmu_fini(p,s) \ |
3a8c3400 | 76 | nvkm_subdev_fini_old(&(p)->subdev, (s)) |
42594600 BS |
77 | |
78 | #define _nvkm_mmu_dtor _nvkm_subdev_dtor | |
79 | #define _nvkm_mmu_init _nvkm_subdev_init | |
80 | #define _nvkm_mmu_fini _nvkm_subdev_fini | |
81 | ||
82 | extern struct nvkm_oclass nv04_mmu_oclass; | |
83 | extern struct nvkm_oclass nv41_mmu_oclass; | |
84 | extern struct nvkm_oclass nv44_mmu_oclass; | |
85 | extern struct nvkm_oclass nv50_mmu_oclass; | |
86 | extern struct nvkm_oclass gf100_mmu_oclass; | |
87 | ||
88 | int nv04_vm_create(struct nvkm_mmu *, u64, u64, u64, | |
89 | struct nvkm_vm **); | |
90 | void nv04_mmu_dtor(struct nvkm_object *); | |
91 | ||
92 | int nvkm_vm_create(struct nvkm_mmu *, u64 offset, u64 length, u64 mm_offset, | |
93 | u32 block, struct nvkm_vm **); | |
94 | int nvkm_vm_new(struct nvkm_device *, u64 offset, u64 length, u64 mm_offset, | |
95 | struct nvkm_vm **); | |
96 | int nvkm_vm_ref(struct nvkm_vm *, struct nvkm_vm **, struct nvkm_gpuobj *pgd); | |
97 | int nvkm_vm_get(struct nvkm_vm *, u64 size, u32 page_shift, u32 access, | |
98 | struct nvkm_vma *); | |
99 | void nvkm_vm_put(struct nvkm_vma *); | |
100 | void nvkm_vm_map(struct nvkm_vma *, struct nvkm_mem *); | |
101 | void nvkm_vm_map_at(struct nvkm_vma *, u64 offset, struct nvkm_mem *); | |
102 | void nvkm_vm_unmap(struct nvkm_vma *); | |
103 | void nvkm_vm_unmap_at(struct nvkm_vma *, u64 offset, u64 length); | |
a11c3198 | 104 | #endif |