.. | .. |
---|
67 | 67 | nvkm_vmm_pte_func mem; |
---|
68 | 68 | nvkm_vmm_pte_func dma; |
---|
69 | 69 | nvkm_vmm_pte_func sgl; |
---|
| 70 | + |
---|
| 71 | + nvkm_vmm_pte_func pfn; |
---|
| 72 | + bool (*pfn_clear)(struct nvkm_vmm *, struct nvkm_mmu_pt *, u32 ptei, u32 ptes); |
---|
| 73 | + nvkm_vmm_pxe_func pfn_unmap; |
---|
70 | 74 | }; |
---|
71 | 75 | |
---|
72 | 76 | extern const struct nvkm_vmm_desc_func gf100_vmm_pgd; |
---|
.. | .. |
---|
141 | 145 | struct nvkm_vmm_map *); |
---|
142 | 146 | void (*flush)(struct nvkm_vmm *, int depth); |
---|
143 | 147 | |
---|
| 148 | + int (*mthd)(struct nvkm_vmm *, struct nvkm_client *, |
---|
| 149 | + u32 mthd, void *argv, u32 argc); |
---|
| 150 | + |
---|
| 151 | + void (*invalidate_pdb)(struct nvkm_vmm *, u64 addr); |
---|
| 152 | + |
---|
144 | 153 | u64 page_block; |
---|
145 | 154 | const struct nvkm_vmm_page page[]; |
---|
146 | 155 | }; |
---|
.. | .. |
---|
151 | 160 | }; |
---|
152 | 161 | |
---|
153 | 162 | int nvkm_vmm_new_(const struct nvkm_vmm_func *, struct nvkm_mmu *, |
---|
154 | | - u32 pd_header, u64 addr, u64 size, struct lock_class_key *, |
---|
155 | | - const char *name, struct nvkm_vmm **); |
---|
156 | | -int nvkm_vmm_ctor(const struct nvkm_vmm_func *, struct nvkm_mmu *, |
---|
157 | | - u32 pd_header, u64 addr, u64 size, struct lock_class_key *, |
---|
158 | | - const char *name, struct nvkm_vmm *); |
---|
| 163 | + u32 pd_header, bool managed, u64 addr, u64 size, |
---|
| 164 | + struct lock_class_key *, const char *name, |
---|
| 165 | + struct nvkm_vmm **); |
---|
159 | 166 | struct nvkm_vma *nvkm_vmm_node_search(struct nvkm_vmm *, u64 addr); |
---|
| 167 | +struct nvkm_vma *nvkm_vmm_node_split(struct nvkm_vmm *, struct nvkm_vma *, |
---|
| 168 | + u64 addr, u64 size); |
---|
160 | 169 | int nvkm_vmm_get_locked(struct nvkm_vmm *, bool getref, bool mapref, |
---|
161 | 170 | bool sparse, u8 page, u8 align, u64 size, |
---|
162 | 171 | struct nvkm_vma **pvma); |
---|
163 | 172 | void nvkm_vmm_put_locked(struct nvkm_vmm *, struct nvkm_vma *); |
---|
164 | | -void nvkm_vmm_unmap_locked(struct nvkm_vmm *, struct nvkm_vma *); |
---|
165 | | -void nvkm_vmm_unmap_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma); |
---|
| 173 | +void nvkm_vmm_unmap_locked(struct nvkm_vmm *, struct nvkm_vma *, bool pfn); |
---|
| 174 | +void nvkm_vmm_unmap_region(struct nvkm_vmm *, struct nvkm_vma *); |
---|
| 175 | + |
---|
| 176 | +#define NVKM_VMM_PFN_ADDR 0xfffffffffffff000ULL |
---|
| 177 | +#define NVKM_VMM_PFN_ADDR_SHIFT 12 |
---|
| 178 | +#define NVKM_VMM_PFN_APER 0x00000000000000f0ULL |
---|
| 179 | +#define NVKM_VMM_PFN_HOST 0x0000000000000000ULL |
---|
| 180 | +#define NVKM_VMM_PFN_VRAM 0x0000000000000010ULL |
---|
| 181 | +#define NVKM_VMM_PFN_W 0x0000000000000002ULL |
---|
| 182 | +#define NVKM_VMM_PFN_V 0x0000000000000001ULL |
---|
| 183 | +#define NVKM_VMM_PFN_NONE 0x0000000000000000ULL |
---|
| 184 | + |
---|
| 185 | +int nvkm_vmm_pfn_map(struct nvkm_vmm *, u8 page, u64 addr, u64 size, u64 *pfn); |
---|
| 186 | +int nvkm_vmm_pfn_unmap(struct nvkm_vmm *, u64 addr, u64 size); |
---|
166 | 187 | |
---|
167 | 188 | struct nvkm_vma *nvkm_vma_tail(struct nvkm_vma *, u64 tail); |
---|
168 | | -void nvkm_vmm_node_insert(struct nvkm_vmm *, struct nvkm_vma *); |
---|
169 | 189 | |
---|
170 | 190 | int nv04_vmm_new_(const struct nvkm_vmm_func *, struct nvkm_mmu *, u32, |
---|
171 | | - u64, u64, void *, u32, struct lock_class_key *, |
---|
| 191 | + bool, u64, u64, void *, u32, struct lock_class_key *, |
---|
172 | 192 | const char *, struct nvkm_vmm **); |
---|
173 | 193 | int nv04_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *); |
---|
174 | 194 | |
---|
.. | .. |
---|
178 | 198 | void nv50_vmm_flush(struct nvkm_vmm *, int); |
---|
179 | 199 | |
---|
180 | 200 | int gf100_vmm_new_(const struct nvkm_vmm_func *, const struct nvkm_vmm_func *, |
---|
181 | | - struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 201 | + struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
182 | 202 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
183 | 203 | int gf100_vmm_join_(struct nvkm_vmm *, struct nvkm_memory *, u64 base); |
---|
184 | 204 | int gf100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *); |
---|
185 | 205 | void gf100_vmm_part(struct nvkm_vmm *, struct nvkm_memory *); |
---|
186 | 206 | int gf100_vmm_aper(enum nvkm_memory_target); |
---|
187 | 207 | int gf100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *); |
---|
188 | | -void gf100_vmm_flush_(struct nvkm_vmm *, int); |
---|
189 | 208 | void gf100_vmm_flush(struct nvkm_vmm *, int); |
---|
| 209 | +void gf100_vmm_invalidate(struct nvkm_vmm *, u32 type); |
---|
| 210 | +void gf100_vmm_invalidate_pdb(struct nvkm_vmm *, u64 addr); |
---|
190 | 211 | |
---|
191 | 212 | int gk20a_vmm_aper(enum nvkm_memory_target); |
---|
192 | 213 | |
---|
193 | 214 | int gm200_vmm_new_(const struct nvkm_vmm_func *, const struct nvkm_vmm_func *, |
---|
194 | | - struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 215 | + struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
195 | 216 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
196 | 217 | int gm200_vmm_join_(struct nvkm_vmm *, struct nvkm_memory *, u64 base); |
---|
197 | 218 | int gm200_vmm_join(struct nvkm_vmm *, struct nvkm_memory *); |
---|
198 | 219 | |
---|
| 220 | +int gp100_vmm_new_(const struct nvkm_vmm_func *, |
---|
| 221 | + struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
| 222 | + struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
199 | 223 | int gp100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *); |
---|
200 | 224 | int gp100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *); |
---|
201 | 225 | void gp100_vmm_flush(struct nvkm_vmm *, int); |
---|
| 226 | +int gp100_vmm_mthd(struct nvkm_vmm *, struct nvkm_client *, u32, void *, u32); |
---|
| 227 | +void gp100_vmm_invalidate_pdb(struct nvkm_vmm *, u64 addr); |
---|
202 | 228 | |
---|
203 | | -int nv04_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 229 | +int gv100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *); |
---|
| 230 | + |
---|
| 231 | +int nv04_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
204 | 232 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
205 | | -int nv41_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 233 | +int nv41_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
206 | 234 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
207 | | -int nv44_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 235 | +int nv44_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
208 | 236 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
209 | | -int nv50_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 237 | +int nv50_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
210 | 238 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
211 | | -int mcp77_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 239 | +int mcp77_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
212 | 240 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
213 | | -int g84_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 241 | +int g84_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
214 | 242 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
215 | | -int gf100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 243 | +int gf100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
216 | 244 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
217 | | -int gk104_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 245 | +int gk104_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
218 | 246 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
219 | | -int gk20a_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 247 | +int gk20a_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
220 | 248 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
---|
221 | | -int gm200_vmm_new_fixed(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 249 | +int gm200_vmm_new_fixed(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
222 | 250 | struct lock_class_key *, const char *, |
---|
223 | 251 | struct nvkm_vmm **); |
---|
224 | | -int gm200_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 252 | +int gm200_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
225 | 253 | struct lock_class_key *, const char *, |
---|
226 | 254 | struct nvkm_vmm **); |
---|
227 | | -int gm20b_vmm_new_fixed(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 255 | +int gm20b_vmm_new_fixed(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
228 | 256 | struct lock_class_key *, const char *, |
---|
229 | 257 | struct nvkm_vmm **); |
---|
230 | | -int gm20b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 258 | +int gm20b_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
231 | 259 | struct lock_class_key *, const char *, |
---|
232 | 260 | struct nvkm_vmm **); |
---|
233 | | -int gp100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 261 | +int gp100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
234 | 262 | struct lock_class_key *, const char *, |
---|
235 | 263 | struct nvkm_vmm **); |
---|
236 | | -int gp10b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 264 | +int gp10b_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
237 | 265 | struct lock_class_key *, const char *, |
---|
238 | 266 | struct nvkm_vmm **); |
---|
239 | | -int gv100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
---|
| 267 | +int gv100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
| 268 | + struct lock_class_key *, const char *, |
---|
| 269 | + struct nvkm_vmm **); |
---|
| 270 | +int tu102_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
---|
240 | 271 | struct lock_class_key *, const char *, |
---|
241 | 272 | struct nvkm_vmm **); |
---|
242 | 273 | |
---|
.. | .. |
---|
270 | 301 | FILL(VMM, PT, PTEI, _ptes, MAP, _addr); \ |
---|
271 | 302 | PTEI += _ptes; \ |
---|
272 | 303 | PTEN -= _ptes; \ |
---|
273 | | - }; \ |
---|
| 304 | + } \ |
---|
274 | 305 | nvkm_done((PT)->memory); \ |
---|
275 | 306 | } while(0) |
---|
276 | 307 | |
---|