]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
42594600 BS |
2 | #ifndef __NVKM_MMU_H__ |
3 | #define __NVKM_MMU_H__ | |
3863c9bc | 4 | #include <core/subdev.h> |
3863c9bc | 5 | |
42594600 | 6 | struct nvkm_vma { |
fd2871af | 7 | struct list_head head; |
f9463a4b BS |
8 | struct rb_node tree; |
9 | u64 addr; | |
10 | u64 size:50; | |
11 | bool mapref:1; /* PTs (de)referenced on (un)map (vs pre-allocated). */ | |
12 | bool sparse:1; /* Unmapped PDEs/PTEs will not trigger MMU faults. */ | |
13 | #define NVKM_VMA_PAGE_NONE 7 | |
14 | u8 page:3; /* Requested page type (index, or NONE for automatic). */ | |
15 | u8 refd:3; /* Current page type (index, or NONE for unreferenced). */ | |
16 | bool used:1; /* Region allocated. */ | |
17 | bool part:1; /* Region was split from an allocated region by map(). */ | |
18 | bool user:1; /* Region user-allocated. */ | |
19 | bool busy:1; /* Region busy (for temporarily preventing user access). */ | |
20 | struct nvkm_memory *memory; /* Memory currently mapped into VMA. */ | |
21 | struct nvkm_tags *tags; /* Compression tag reference. */ | |
a11c3198 BS |
22 | }; |
23 | ||
632b740c | 24 | struct nvkm_vmm { |
806a7335 | 25 | const struct nvkm_vmm_func *func; |
42594600 | 26 | struct nvkm_mmu *mmu; |
806a7335 | 27 | const char *name; |
eb813999 | 28 | u32 debug; |
806a7335 | 29 | struct kref kref; |
1de68568 | 30 | struct mutex mutex; |
a11c3198 | 31 | |
806a7335 BS |
32 | u64 start; |
33 | u64 limit; | |
34 | ||
35 | struct nvkm_vmm_pt *pd; | |
806a7335 BS |
36 | struct list_head join; |
37 | ||
f9463a4b BS |
38 | struct list_head list; |
39 | struct rb_root free; | |
40 | struct rb_root root; | |
5e075fde BS |
41 | |
42 | bool bootstrapped; | |
68f3f702 | 43 | atomic_t engref[NVKM_SUBDEV_NR]; |
a11c3198 | 44 | |
03b0ba7b BS |
45 | dma_addr_t null; |
46 | void *nullp; | |
3863c9bc BS |
47 | }; |
48 | ||
f9463a4b BS |
49 | int nvkm_vmm_new(struct nvkm_device *, u64 addr, u64 size, void *argv, u32 argc, |
50 | struct lock_class_key *, const char *name, struct nvkm_vmm **); | |
51 | struct nvkm_vmm *nvkm_vmm_ref(struct nvkm_vmm *); | |
52 | void nvkm_vmm_unref(struct nvkm_vmm **); | |
eb813999 | 53 | int nvkm_vmm_boot(struct nvkm_vmm *); |
f9463a4b BS |
54 | int nvkm_vmm_join(struct nvkm_vmm *, struct nvkm_memory *inst); |
55 | void nvkm_vmm_part(struct nvkm_vmm *, struct nvkm_memory *inst); | |
56 | int nvkm_vmm_get(struct nvkm_vmm *, u8 page, u64 size, struct nvkm_vma **); | |
57 | void nvkm_vmm_put(struct nvkm_vmm *, struct nvkm_vma **); | |
eb813999 BS |
58 | |
59 | struct nvkm_vmm_map { | |
60 | struct nvkm_memory *memory; | |
61 | u64 offset; | |
62 | ||
63 | struct nvkm_mm_node *mem; | |
64 | struct scatterlist *sgl; | |
65 | dma_addr_t *dma; | |
66 | u64 off; | |
67 | ||
68 | const struct nvkm_vmm_page *page; | |
69 | ||
70 | struct nvkm_tags *tags; | |
71 | u64 next; | |
72 | u64 type; | |
73 | u64 ctag; | |
74 | }; | |
75 | ||
f9463a4b BS |
76 | int nvkm_vmm_map(struct nvkm_vmm *, struct nvkm_vma *, void *argv, u32 argc, |
77 | struct nvkm_vmm_map *); | |
78 | void nvkm_vmm_unmap(struct nvkm_vmm *, struct nvkm_vma *); | |
79 | ||
c83c4097 | 80 | struct nvkm_memory *nvkm_umem_search(struct nvkm_client *, u64); |
f9463a4b | 81 | struct nvkm_vmm *nvkm_uvmm_search(struct nvkm_client *, u64 handle); |
c9582455 BS |
82 | |
83 | struct nvkm_mmu { | |
84 | const struct nvkm_mmu_func *func; | |
85 | struct nvkm_subdev subdev; | |
86 | ||
c9582455 | 87 | u8 dma_bits; |
0b11b30d | 88 | |
51645eb7 BS |
89 | int heap_nr; |
90 | struct { | |
91 | #define NVKM_MEM_VRAM 0x01 | |
92 | #define NVKM_MEM_HOST 0x02 | |
93 | #define NVKM_MEM_COMP 0x04 | |
94 | #define NVKM_MEM_DISP 0x08 | |
95 | u8 type; | |
96 | u64 size; | |
97 | } heap[4]; | |
98 | ||
99 | int type_nr; | |
100 | struct { | |
101 | #define NVKM_MEM_KIND 0x10 | |
102 | #define NVKM_MEM_MAPPABLE 0x20 | |
103 | #define NVKM_MEM_COHERENT 0x40 | |
104 | #define NVKM_MEM_UNCACHED 0x80 | |
105 | u8 type; | |
106 | u8 heap; | |
107 | } type[16]; | |
108 | ||
0b11b30d | 109 | struct nvkm_vmm *vmm; |
9a45ddaa BS |
110 | |
111 | struct { | |
112 | struct mutex mutex; | |
113 | struct list_head list; | |
f1280394 | 114 | } ptc, ptp; |
eea5cf0f BS |
115 | |
116 | struct nvkm_device_oclass user; | |
c9582455 BS |
117 | }; |
118 | ||
119 | int nv04_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); | |
120 | int nv41_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); | |
121 | int nv44_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); | |
122 | int nv50_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); | |
0f43715f | 123 | int g84_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
2ffa64eb | 124 | int mcp77_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
c9582455 | 125 | int gf100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
db018585 | 126 | int gk104_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
d1f6c8d2 | 127 | int gk20a_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
e1e33c79 | 128 | int gm200_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
cedc4d57 | 129 | int gm20b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
b86a4587 | 130 | int gp100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
6359c982 | 131 | int gp10b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
a11c3198 | 132 | #endif |