xref: /linux/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c (revision fab183d632628381b466a41479489541ac0e29a0)
1 /*
2  * Copyright 2017 Red Hat Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  */
22 #define NVKM_VMM_LEVELS_MAX 6
23 #include "vmm.h"
24 
25 #include <subdev/fb.h>
26 
27 static void
nvkm_vmm_pt_del(struct nvkm_vmm_pt ** ppgt)28 nvkm_vmm_pt_del(struct nvkm_vmm_pt **ppgt)
29 {
30 	struct nvkm_vmm_pt *pgt = *ppgt;
31 	if (pgt) {
32 		kvfree(pgt->pde);
33 		kfree(pgt);
34 		*ppgt = NULL;
35 	}
36 }
37 
38 
39 static struct nvkm_vmm_pt *
nvkm_vmm_pt_new(const struct nvkm_vmm_desc * desc,bool sparse,const struct nvkm_vmm_page * page)40 nvkm_vmm_pt_new(const struct nvkm_vmm_desc *desc, bool sparse,
41 		const struct nvkm_vmm_page *page)
42 {
43 	const u32 pten = 1 << desc->bits;
44 	struct nvkm_vmm_pt *pgt;
45 	u32 lpte = 0;
46 
47 	if (desc->type > PGT) {
48 		if (desc->type == SPT) {
49 			const struct nvkm_vmm_desc *pair = page[-1].desc;
50 			lpte = pten >> (desc->bits - pair->bits);
51 		} else {
52 			lpte = pten;
53 		}
54 	}
55 
56 	pgt = kzalloc_flex(*pgt, pte, lpte);
57 	if (!pgt)
58 		return NULL;
59 	pgt->page = page ? page->shift : 0;
60 	pgt->sparse = sparse;
61 
62 	if (desc->type == PGD) {
63 		pgt->pde = kvzalloc_objs(*pgt->pde, pten);
64 		if (!pgt->pde) {
65 			kfree(pgt);
66 			return NULL;
67 		}
68 	}
69 
70 	return pgt;
71 }
72 
73 struct nvkm_vmm_iter {
74 	const struct nvkm_vmm_page *page;
75 	const struct nvkm_vmm_desc *desc;
76 	struct nvkm_vmm *vmm;
77 	u64 cnt;
78 	u16 max, lvl;
79 	u32 pte[NVKM_VMM_LEVELS_MAX];
80 	struct nvkm_vmm_pt *pt[NVKM_VMM_LEVELS_MAX];
81 	int flush;
82 };
83 
84 #ifdef CONFIG_NOUVEAU_DEBUG_MMU
85 static const char *
nvkm_vmm_desc_type(const struct nvkm_vmm_desc * desc)86 nvkm_vmm_desc_type(const struct nvkm_vmm_desc *desc)
87 {
88 	switch (desc->type) {
89 	case PGD: return "PGD";
90 	case PGT: return "PGT";
91 	case SPT: return "SPT";
92 	case LPT: return "LPT";
93 	default:
94 		return "UNKNOWN";
95 	}
96 }
97 
98 static void
nvkm_vmm_trace(struct nvkm_vmm_iter * it,char * buf)99 nvkm_vmm_trace(struct nvkm_vmm_iter *it, char *buf)
100 {
101 	int lvl;
102 	for (lvl = it->max; lvl >= 0; lvl--) {
103 		if (lvl >= it->lvl)
104 			buf += sprintf(buf,  "%05x:", it->pte[lvl]);
105 		else
106 			buf += sprintf(buf, "xxxxx:");
107 	}
108 }
109 
110 #define TRA(i,f,a...) do {                                                     \
111 	char _buf[NVKM_VMM_LEVELS_MAX * 7];                                    \
112 	struct nvkm_vmm_iter *_it = (i);                                       \
113 	nvkm_vmm_trace(_it, _buf);                                             \
114 	VMM_TRACE(_it->vmm, "%s "f, _buf, ##a);                                \
115 } while(0)
116 #else
117 #define TRA(i,f,a...)
118 #endif
119 
120 static inline void
nvkm_vmm_flush_mark(struct nvkm_vmm_iter * it)121 nvkm_vmm_flush_mark(struct nvkm_vmm_iter *it)
122 {
123 	it->flush = min(it->flush, it->max - it->lvl);
124 }
125 
126 static inline void
nvkm_vmm_flush(struct nvkm_vmm_iter * it)127 nvkm_vmm_flush(struct nvkm_vmm_iter *it)
128 {
129 	if (it->flush != NVKM_VMM_LEVELS_MAX) {
130 		if (it->vmm->func->flush) {
131 			TRA(it, "flush: %d", it->flush);
132 			it->vmm->func->flush(it->vmm, it->flush);
133 		}
134 		it->flush = NVKM_VMM_LEVELS_MAX;
135 	}
136 }
137 
138 static void
nvkm_vmm_unref_pdes(struct nvkm_vmm_iter * it)139 nvkm_vmm_unref_pdes(struct nvkm_vmm_iter *it)
140 {
141 	const struct nvkm_vmm_desc *desc = it->desc;
142 	const int type = desc[it->lvl].type == SPT;
143 	struct nvkm_vmm_pt *pgd = it->pt[it->lvl + 1];
144 	struct nvkm_vmm_pt *pgt = it->pt[it->lvl];
145 	struct nvkm_mmu_pt *pt = pgt->pt[type];
146 	struct nvkm_vmm *vmm = it->vmm;
147 	u32 pdei = it->pte[it->lvl + 1];
148 
149 	/* Recurse up the tree, unreferencing/destroying unneeded PDs. */
150 	it->lvl++;
151 	if (--pgd->refs[0]) {
152 		const struct nvkm_vmm_desc_func *func = desc[it->lvl].func;
153 		/* PD has other valid PDEs, so we need a proper update. */
154 		TRA(it, "PDE unmap %s", nvkm_vmm_desc_type(&desc[it->lvl - 1]));
155 		pgt->pt[type] = NULL;
156 		if (!pgt->refs[!type]) {
157 			/* PDE no longer required. */
158 			if (pgd->pt[0]) {
159 				if (pgt->sparse) {
160 					func->sparse(vmm, pgd->pt[0], pdei, 1);
161 					pgd->pde[pdei] = NVKM_VMM_PDE_SPARSE;
162 				} else {
163 					func->unmap(vmm, pgd->pt[0], pdei, 1);
164 					pgd->pde[pdei] = NULL;
165 				}
166 			} else {
167 				/* Special handling for Tesla-class GPUs,
168 				 * where there's no central PD, but each
169 				 * instance has its own embedded PD.
170 				 */
171 				func->pde(vmm, pgd, pdei);
172 				pgd->pde[pdei] = NULL;
173 			}
174 		} else {
175 			/* PDE was pointing at dual-PTs and we're removing
176 			 * one of them, leaving the other in place.
177 			 */
178 			func->pde(vmm, pgd, pdei);
179 		}
180 
181 		/* GPU may have cached the PTs, flush before freeing. */
182 		nvkm_vmm_flush_mark(it);
183 		nvkm_vmm_flush(it);
184 	} else {
185 		/* PD has no valid PDEs left, so we can just destroy it. */
186 		nvkm_vmm_unref_pdes(it);
187 	}
188 
189 	/* Destroy PD/PT. */
190 	TRA(it, "PDE free %s", nvkm_vmm_desc_type(&desc[it->lvl - 1]));
191 	nvkm_mmu_ptc_put(vmm->mmu, vmm->bootstrapped, &pt);
192 	if (!pgt->refs[!type])
193 		nvkm_vmm_pt_del(&pgt);
194 	it->lvl--;
195 }
196 
197 static void
nvkm_vmm_unref_sptes(struct nvkm_vmm_iter * it,struct nvkm_vmm_pt * pgt,const struct nvkm_vmm_desc * desc,u32 ptei,u32 ptes)198 nvkm_vmm_unref_sptes(struct nvkm_vmm_iter *it, struct nvkm_vmm_pt *pgt,
199 		     const struct nvkm_vmm_desc *desc, u32 ptei, u32 ptes)
200 {
201 	const struct nvkm_vmm_desc *pair = it->page[-1].desc;
202 	const u32 sptb = desc->bits - pair->bits;
203 	const u32 sptn = 1 << sptb;
204 	struct nvkm_vmm *vmm = it->vmm;
205 	u32 spti = ptei & (sptn - 1), lpti, pteb;
206 
207 	/* Determine how many SPTEs are being touched under each LPTE,
208 	 * and drop reference counts.
209 	 */
210 	for (lpti = ptei >> sptb; ptes; spti = 0, lpti++) {
211 		const u32 pten = min(sptn - spti, ptes);
212 		pgt->pte[lpti].s.sptes -= pten;
213 		ptes -= pten;
214 	}
215 
216 	/* We're done here if there's no corresponding LPT. */
217 	if (!pgt->refs[0])
218 		return;
219 
220 	for (ptei = pteb = ptei >> sptb; ptei < lpti; pteb = ptei) {
221 		/* Skip over any LPTEs that still have valid SPTEs. */
222 		if (pgt->pte[pteb].s.sptes) {
223 			for (ptes = 1, ptei++; ptei < lpti; ptes++, ptei++) {
224 				if (!(pgt->pte[ptei].s.sptes))
225 					break;
226 			}
227 			continue;
228 		}
229 
230 		/* As there's no more non-UNMAPPED SPTEs left in the range
231 		 * covered by a number of LPTEs, the LPTEs once again take
232 		 * control over their address range.
233 		 *
234 		 * Transition each LPTE individually as each may have a
235 		 * different target state (sparse, invalid, or valid).
236 		 */
237 		for (ptei++; ptei < lpti; ptei++) {
238 			if (pgt->pte[ptei].s.sptes)
239 				break;
240 		}
241 
242 		while (pteb < ptei) {
243 			pgt->pte[pteb].s.spte_valid = false;
244 			if (pgt->pte[pteb].s.sparse) {
245 				TRA(it, "LPTE %05x: U -> S", pteb);
246 				pair->func->sparse(vmm, pgt->pt[0], pteb, 1);
247 			} else if (!pgt->pte[pteb].s.lpte_valid) {
248 				if (pair->func->invalid) {
249 					TRA(it, "LPTE %05x: U -> I", pteb);
250 					pair->func->invalid(vmm, pgt->pt[0], pteb, 1);
251 				}
252 			}
253 			pteb++;
254 		}
255 	}
256 }
257 
258 static bool
nvkm_vmm_unref_ptes(struct nvkm_vmm_iter * it,bool pfn,u32 ptei,u32 ptes)259 nvkm_vmm_unref_ptes(struct nvkm_vmm_iter *it, bool pfn, u32 ptei, u32 ptes)
260 {
261 	const struct nvkm_vmm_desc *desc = it->desc;
262 	const int type = desc->type == SPT;
263 	struct nvkm_vmm_pt *pgt = it->pt[0];
264 	bool dma;
265 
266 	if (pfn) {
267 		/* Need to clear PTE valid bits before we dma_unmap_page(). */
268 		dma = desc->func->pfn_clear(it->vmm, pgt->pt[type], ptei, ptes);
269 		if (dma) {
270 			/* GPU may have cached the PT, flush before unmap. */
271 			nvkm_vmm_flush_mark(it);
272 			nvkm_vmm_flush(it);
273 			desc->func->pfn_unmap(it->vmm, pgt->pt[type], ptei, ptes);
274 		}
275 	}
276 
277 	/* Drop PTE references. */
278 	pgt->refs[type] -= ptes;
279 
280 	/* Dual-PTs need special handling, unless PDE becoming invalid. */
281 	if (desc->type == SPT && (pgt->refs[0] || pgt->refs[1]))
282 		nvkm_vmm_unref_sptes(it, pgt, desc, ptei, ptes);
283 
284 	if (desc->type == LPT && (pgt->refs[0] || pgt->refs[1])) {
285 		for (u32 lpti = ptei; ptes; lpti++) {
286 			pgt->pte[lpti].s.lptes--;
287 			if (pgt->pte[lpti].s.lptes == 0)
288 				pgt->pte[lpti].s.lpte_valid = false;
289 			ptes--;
290 		}
291 	}
292 
293 	/* PT no longer needed? Destroy it. */
294 	if (!pgt->refs[type]) {
295 		it->lvl++;
296 		TRA(it, "%s empty", nvkm_vmm_desc_type(desc));
297 		it->lvl--;
298 		nvkm_vmm_unref_pdes(it);
299 		return false; /* PTE writes for unmap() not necessary. */
300 	}
301 
302 	return true;
303 }
304 
305 static void
nvkm_vmm_ref_sptes(struct nvkm_vmm_iter * it,struct nvkm_vmm_pt * pgt,const struct nvkm_vmm_desc * desc,u32 ptei,u32 ptes)306 nvkm_vmm_ref_sptes(struct nvkm_vmm_iter *it, struct nvkm_vmm_pt *pgt,
307 		   const struct nvkm_vmm_desc *desc, u32 ptei, u32 ptes)
308 {
309 	const struct nvkm_vmm_desc *pair = it->page[-1].desc;
310 	const u32 sptb = desc->bits - pair->bits;
311 	const u32 sptn = 1 << sptb;
312 	struct nvkm_vmm *vmm = it->vmm;
313 	u32 spti = ptei & (sptn - 1), lpti, pteb;
314 
315 	/* Determine how many SPTEs are being touched under each LPTE,
316 	 * and increase reference counts.
317 	 */
318 	for (lpti = ptei >> sptb; ptes; spti = 0, lpti++) {
319 		const u32 pten = min(sptn - spti, ptes);
320 		pgt->pte[lpti].s.sptes += pten;
321 		ptes -= pten;
322 	}
323 
324 	/* We're done here if there's no corresponding LPT. */
325 	if (!pgt->refs[0])
326 		return;
327 
328 	for (ptei = pteb = ptei >> sptb; ptei < lpti; pteb = ptei) {
329 		/* Skip over any LPTEs that already have valid SPTEs. */
330 		if (pgt->pte[pteb].s.spte_valid) {
331 			for (ptes = 1, ptei++; ptei < lpti; ptes++, ptei++) {
332 				if (!pgt->pte[ptei].s.spte_valid)
333 					break;
334 			}
335 			continue;
336 		}
337 
338 		/* As there are now non-UNMAPPED SPTEs in the range covered
339 		 * by a number of LPTEs, we need to transfer control of the
340 		 * address range to the SPTEs.
341 		 *
342 		 * Determine how many LPTEs need to transition state.
343 		 */
344 		pgt->pte[ptei].s.spte_valid = true;
345 		pgt->pte[ptei].s.lpte_valid = false;
346 		for (ptes = 1, ptei++; ptei < lpti; ptes++, ptei++) {
347 			if (pgt->pte[ptei].s.spte_valid)
348 				break;
349 			pgt->pte[ptei].s.spte_valid = true;
350 			pgt->pte[ptei].s.lpte_valid = false;
351 		}
352 
353 		if (pgt->pte[pteb].s.sparse) {
354 			const u32 spti = pteb * sptn;
355 			const u32 sptc = ptes * sptn;
356 			/* The entire LPTE is marked as sparse, we need
357 			 * to make sure that the SPTEs are too.
358 			 */
359 			TRA(it, "SPTE %05x: U -> S %d PTEs", spti, sptc);
360 			desc->func->sparse(vmm, pgt->pt[1], spti, sptc);
361 			/* Sparse LPTEs prevent SPTEs from being accessed. */
362 			TRA(it, "LPTE %05x: S -> U %d PTEs", pteb, ptes);
363 			pair->func->unmap(vmm, pgt->pt[0], pteb, ptes);
364 		} else
365 		if (pair->func->invalid) {
366 			/* MMU supports blocking SPTEs by marking an LPTE
367 			 * as INVALID.  We need to reverse that here.
368 			 */
369 			TRA(it, "LPTE %05x: I -> U %d PTEs", pteb, ptes);
370 			pair->func->unmap(vmm, pgt->pt[0], pteb, ptes);
371 		}
372 	}
373 }
374 
375 static bool
nvkm_vmm_ref_ptes(struct nvkm_vmm_iter * it,bool pfn,u32 ptei,u32 ptes)376 nvkm_vmm_ref_ptes(struct nvkm_vmm_iter *it, bool pfn, u32 ptei, u32 ptes)
377 {
378 	const struct nvkm_vmm_desc *desc = it->desc;
379 	const int type = desc->type == SPT;
380 	struct nvkm_vmm_pt *pgt = it->pt[0];
381 
382 	/* Take PTE references. */
383 	pgt->refs[type] += ptes;
384 
385 	/* Dual-PTs need special handling. */
386 	if (desc->type == SPT)
387 		nvkm_vmm_ref_sptes(it, pgt, desc, ptei, ptes);
388 
389 	if (desc->type == LPT) {
390 		for (u32 lpti = ptei; ptes; lpti++) {
391 			pgt->pte[lpti].s.spte_valid = false;
392 			pgt->pte[lpti].s.lpte_valid = true;
393 			pgt->pte[lpti].s.lptes++;
394 			ptes--;
395 		}
396 	}
397 
398 	return true;
399 }
400 
401 static void
nvkm_vmm_sparse_ptes(const struct nvkm_vmm_desc * desc,struct nvkm_vmm_pt * pgt,u32 ptei,u32 ptes)402 nvkm_vmm_sparse_ptes(const struct nvkm_vmm_desc *desc,
403 		     struct nvkm_vmm_pt *pgt, u32 ptei, u32 ptes)
404 {
405 	if (desc->type == PGD) {
406 		while (ptes--)
407 			pgt->pde[ptei++] = NVKM_VMM_PDE_SPARSE;
408 	} else
409 	if (desc->type == LPT) {
410 		union nvkm_pte_tracker sparse = { .s.sparse = 1 };
411 		memset32(&pgt->pte[ptei].u, sparse.u, ptes);
412 	}
413 }
414 
415 static bool
nvkm_vmm_sparse_unref_ptes(struct nvkm_vmm_iter * it,bool pfn,u32 ptei,u32 ptes)416 nvkm_vmm_sparse_unref_ptes(struct nvkm_vmm_iter *it, bool pfn, u32 ptei, u32 ptes)
417 {
418 	struct nvkm_vmm_pt *pt = it->pt[0];
419 	if (it->desc->type == PGD)
420 		memset(&pt->pde[ptei], 0x00, sizeof(pt->pde[0]) * ptes);
421 	else
422 	if (it->desc->type == LPT)
423 		memset32(&pt->pte[ptei].u, 0x00, ptes);
424 	return nvkm_vmm_unref_ptes(it, pfn, ptei, ptes);
425 }
426 
427 static bool
nvkm_vmm_sparse_ref_ptes(struct nvkm_vmm_iter * it,bool pfn,u32 ptei,u32 ptes)428 nvkm_vmm_sparse_ref_ptes(struct nvkm_vmm_iter *it, bool pfn, u32 ptei, u32 ptes)
429 {
430 	nvkm_vmm_sparse_ptes(it->desc, it->pt[0], ptei, ptes);
431 	return nvkm_vmm_ref_ptes(it, pfn, ptei, ptes);
432 }
433 
434 static bool
nvkm_vmm_ref_hwpt(struct nvkm_vmm_iter * it,struct nvkm_vmm_pt * pgd,u32 pdei)435 nvkm_vmm_ref_hwpt(struct nvkm_vmm_iter *it, struct nvkm_vmm_pt *pgd, u32 pdei)
436 {
437 	const struct nvkm_vmm_desc *desc = &it->desc[it->lvl - 1];
438 	const int type = desc->type == SPT;
439 	struct nvkm_vmm_pt *pgt = pgd->pde[pdei];
440 	const bool zero = !pgt->sparse && !desc->func->invalid;
441 	struct nvkm_vmm *vmm = it->vmm;
442 	struct nvkm_mmu *mmu = vmm->mmu;
443 	struct nvkm_mmu_pt *pt;
444 	u32 pten = 1 << desc->bits;
445 	u32 pteb, ptei, ptes;
446 	u32 size = desc->size * pten;
447 
448 	pgd->refs[0]++;
449 
450 	pgt->pt[type] = nvkm_mmu_ptc_get(mmu, size, desc->align, zero);
451 	if (!pgt->pt[type]) {
452 		it->lvl--;
453 		nvkm_vmm_unref_pdes(it);
454 		return false;
455 	}
456 
457 	if (zero)
458 		goto done;
459 
460 	pt = pgt->pt[type];
461 
462 	if (desc->type == LPT && pgt->refs[1]) {
463 		/* SPT already exists covering the same range as this LPT,
464 		 * which means we need to be careful that any LPTEs which
465 		 * overlap valid SPTEs are unmapped as opposed to invalid
466 		 * or sparse, which would prevent the MMU from looking at
467 		 * the SPTEs on some GPUs.
468 		 */
469 		for (ptei = pteb = 0; ptei < pten; pteb = ptei) {
470 			bool spte = !!pgt->pte[ptei].s.sptes;
471 			for (ptes = 1, ptei++; ptei < pten; ptes++, ptei++) {
472 				bool next = !!pgt->pte[ptei].s.sptes;
473 				if (spte != next)
474 					break;
475 			}
476 
477 			if (!spte) {
478 				if (pgt->sparse)
479 					desc->func->sparse(vmm, pt, pteb, ptes);
480 				else
481 					desc->func->invalid(vmm, pt, pteb, ptes);
482 				memset32(&pgt->pte[pteb].u, 0x00, ptes);
483 			} else {
484 				desc->func->unmap(vmm, pt, pteb, ptes);
485 				while (ptes--)
486 					pgt->pte[pteb++].s.spte_valid = true;
487 			}
488 		}
489 	} else {
490 		if (pgt->sparse) {
491 			nvkm_vmm_sparse_ptes(desc, pgt, 0, pten);
492 			desc->func->sparse(vmm, pt, 0, pten);
493 		} else {
494 			desc->func->invalid(vmm, pt, 0, pten);
495 		}
496 	}
497 
498 done:
499 	TRA(it, "PDE write %s", nvkm_vmm_desc_type(desc));
500 	it->desc[it->lvl].func->pde(it->vmm, pgd, pdei);
501 	nvkm_vmm_flush_mark(it);
502 	return true;
503 }
504 
505 static bool
nvkm_vmm_ref_swpt(struct nvkm_vmm_iter * it,struct nvkm_vmm_pt * pgd,u32 pdei)506 nvkm_vmm_ref_swpt(struct nvkm_vmm_iter *it, struct nvkm_vmm_pt *pgd, u32 pdei)
507 {
508 	const struct nvkm_vmm_desc *desc = &it->desc[it->lvl - 1];
509 	struct nvkm_vmm_pt *pgt = pgd->pde[pdei];
510 
511 	pgt = nvkm_vmm_pt_new(desc, NVKM_VMM_PDE_SPARSED(pgt), it->page);
512 	if (!pgt) {
513 		if (!pgd->refs[0])
514 			nvkm_vmm_unref_pdes(it);
515 		return false;
516 	}
517 
518 	pgd->pde[pdei] = pgt;
519 	return true;
520 }
521 
522 static inline u64
nvkm_vmm_iter(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size,const char * name,bool ref,bool pfn,bool (* REF_PTES)(struct nvkm_vmm_iter *,bool pfn,u32,u32),nvkm_vmm_pte_func MAP_PTES,struct nvkm_vmm_map * map,nvkm_vmm_pxe_func CLR_PTES)523 nvkm_vmm_iter(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
524 	      u64 addr, u64 size, const char *name, bool ref, bool pfn,
525 	      bool (*REF_PTES)(struct nvkm_vmm_iter *, bool pfn, u32, u32),
526 	      nvkm_vmm_pte_func MAP_PTES, struct nvkm_vmm_map *map,
527 	      nvkm_vmm_pxe_func CLR_PTES)
528 {
529 	const struct nvkm_vmm_desc *desc = page->desc;
530 	struct nvkm_vmm_iter it;
531 	u64 bits = addr >> page->shift;
532 
533 	it.page = page;
534 	it.desc = desc;
535 	it.vmm = vmm;
536 	it.cnt = size >> page->shift;
537 	it.flush = NVKM_VMM_LEVELS_MAX;
538 
539 	/* Deconstruct address into PTE indices for each mapping level. */
540 	for (it.lvl = 0; desc[it.lvl].bits; it.lvl++) {
541 		it.pte[it.lvl] = bits & ((1 << desc[it.lvl].bits) - 1);
542 		bits >>= desc[it.lvl].bits;
543 	}
544 	it.max = --it.lvl;
545 	it.pt[it.max] = vmm->pd;
546 
547 	it.lvl = 0;
548 	TRA(&it, "%s: %016llx %016llx %d %lld PTEs", name,
549 	         addr, size, page->shift, it.cnt);
550 	it.lvl = it.max;
551 
552 	/* Depth-first traversal of page tables. */
553 	while (it.cnt) {
554 		struct nvkm_vmm_pt *pgt = it.pt[it.lvl];
555 		const int type = desc->type == SPT;
556 		const u32 pten = 1 << desc->bits;
557 		const u32 ptei = it.pte[0];
558 		const u32 ptes = min_t(u64, it.cnt, pten - ptei);
559 
560 		/* Walk down the tree, finding page tables for each level. */
561 		for (; it.lvl; it.lvl--) {
562 			const u32 pdei = it.pte[it.lvl];
563 			struct nvkm_vmm_pt *pgd = pgt;
564 
565 			/* Software PT. */
566 			if (ref && NVKM_VMM_PDE_INVALID(pgd->pde[pdei])) {
567 				if (!nvkm_vmm_ref_swpt(&it, pgd, pdei))
568 					goto fail;
569 			}
570 			it.pt[it.lvl - 1] = pgt = pgd->pde[pdei];
571 
572 			/* Hardware PT.
573 			 *
574 			 * This is a separate step from above due to GF100 and
575 			 * newer having dual page tables at some levels, which
576 			 * are refcounted independently.
577 			 */
578 			if (ref && !pgt->refs[desc[it.lvl - 1].type == SPT]) {
579 				if (!nvkm_vmm_ref_hwpt(&it, pgd, pdei))
580 					goto fail;
581 			}
582 		}
583 
584 		/* Handle PTE updates. */
585 		if (!REF_PTES || REF_PTES(&it, pfn, ptei, ptes)) {
586 			struct nvkm_mmu_pt *pt = pgt->pt[type];
587 			if (MAP_PTES || CLR_PTES) {
588 				if (MAP_PTES)
589 					MAP_PTES(vmm, pt, ptei, ptes, map);
590 				else
591 					CLR_PTES(vmm, pt, ptei, ptes);
592 				nvkm_vmm_flush_mark(&it);
593 			}
594 		}
595 
596 		/* Walk back up the tree to the next position. */
597 		it.pte[it.lvl] += ptes;
598 		it.cnt -= ptes;
599 		if (it.cnt) {
600 			while (it.pte[it.lvl] == (1 << desc[it.lvl].bits)) {
601 				it.pte[it.lvl++] = 0;
602 				it.pte[it.lvl]++;
603 			}
604 		}
605 	}
606 
607 	nvkm_vmm_flush(&it);
608 	return ~0ULL;
609 
610 fail:
611 	/* Reconstruct the failure address so the caller is able to
612 	 * reverse any partially completed operations.
613 	 */
614 	addr = it.pte[it.max--];
615 	do {
616 		addr  = addr << desc[it.max].bits;
617 		addr |= it.pte[it.max];
618 	} while (it.max--);
619 
620 	return addr << page->shift;
621 }
622 
623 static void
nvkm_vmm_ptes_sparse_put(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size)624 nvkm_vmm_ptes_sparse_put(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
625 			 u64 addr, u64 size)
626 {
627 	nvkm_vmm_iter(vmm, page, addr, size, "sparse unref", false, false,
628 		      nvkm_vmm_sparse_unref_ptes, NULL, NULL,
629 		      page->desc->func->invalid ?
630 		      page->desc->func->invalid : page->desc->func->unmap);
631 }
632 
633 static int
nvkm_vmm_ptes_sparse_get(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size)634 nvkm_vmm_ptes_sparse_get(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
635 			 u64 addr, u64 size)
636 {
637 	if ((page->type & NVKM_VMM_PAGE_SPARSE)) {
638 		u64 fail = nvkm_vmm_iter(vmm, page, addr, size, "sparse ref",
639 					 true, false, nvkm_vmm_sparse_ref_ptes,
640 					 NULL, NULL, page->desc->func->sparse);
641 		if (fail != ~0ULL) {
642 			if ((size = fail - addr))
643 				nvkm_vmm_ptes_sparse_put(vmm, page, addr, size);
644 			return -ENOMEM;
645 		}
646 		return 0;
647 	}
648 	return -EINVAL;
649 }
650 
651 static int
nvkm_vmm_ptes_sparse(struct nvkm_vmm * vmm,u64 addr,u64 size,bool ref)652 nvkm_vmm_ptes_sparse(struct nvkm_vmm *vmm, u64 addr, u64 size, bool ref)
653 {
654 	const struct nvkm_vmm_page *page = vmm->func->page;
655 	int m = 0, i;
656 	u64 start = addr;
657 	u64 block;
658 
659 	while (size) {
660 		/* Limit maximum page size based on remaining size. */
661 		while (size < (1ULL << page[m].shift))
662 			m++;
663 		i = m;
664 
665 		/* Find largest page size suitable for alignment. */
666 		while (!IS_ALIGNED(addr, 1ULL << page[i].shift))
667 			i++;
668 
669 		/* Determine number of PTEs at this page size. */
670 		if (i != m) {
671 			/* Limited to alignment boundary of next page size. */
672 			u64 next = 1ULL << page[i - 1].shift;
673 			u64 part = ALIGN(addr, next) - addr;
674 			if (size - part >= next)
675 				block = (part >> page[i].shift) << page[i].shift;
676 			else
677 				block = (size >> page[i].shift) << page[i].shift;
678 		} else {
679 			block = (size >> page[i].shift) << page[i].shift;
680 		}
681 
682 		/* Perform operation. */
683 		if (ref) {
684 			int ret = nvkm_vmm_ptes_sparse_get(vmm, &page[i], addr, block);
685 			if (ret) {
686 				if ((size = addr - start))
687 					nvkm_vmm_ptes_sparse(vmm, start, size, false);
688 				return ret;
689 			}
690 		} else {
691 			nvkm_vmm_ptes_sparse_put(vmm, &page[i], addr, block);
692 		}
693 
694 		size -= block;
695 		addr += block;
696 	}
697 
698 	return 0;
699 }
700 
701 static void
nvkm_vmm_ptes_unmap(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size,bool sparse,bool pfn)702 nvkm_vmm_ptes_unmap(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
703 		    u64 addr, u64 size, bool sparse, bool pfn)
704 {
705 	const struct nvkm_vmm_desc_func *func = page->desc->func;
706 
707 	mutex_lock(&vmm->mutex.map);
708 	nvkm_vmm_iter(vmm, page, addr, size, "unmap", false, pfn,
709 		      NULL, NULL, NULL,
710 		      sparse ? func->sparse : func->invalid ? func->invalid :
711 							      func->unmap);
712 	mutex_unlock(&vmm->mutex.map);
713 }
714 
715 static void
nvkm_vmm_ptes_map(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size,struct nvkm_vmm_map * map,nvkm_vmm_pte_func func)716 nvkm_vmm_ptes_map(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
717 		  u64 addr, u64 size, struct nvkm_vmm_map *map,
718 		  nvkm_vmm_pte_func func)
719 {
720 	mutex_lock(&vmm->mutex.map);
721 	nvkm_vmm_iter(vmm, page, addr, size, "map", false, false,
722 		      NULL, func, map, NULL);
723 	mutex_unlock(&vmm->mutex.map);
724 }
725 
726 static void
nvkm_vmm_ptes_put_locked(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size)727 nvkm_vmm_ptes_put_locked(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
728 			 u64 addr, u64 size)
729 {
730 	nvkm_vmm_iter(vmm, page, addr, size, "unref", false, false,
731 		      nvkm_vmm_unref_ptes, NULL, NULL, NULL);
732 }
733 
734 static void
nvkm_vmm_ptes_put(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size)735 nvkm_vmm_ptes_put(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
736 		  u64 addr, u64 size)
737 {
738 	mutex_lock(&vmm->mutex.ref);
739 	nvkm_vmm_ptes_put_locked(vmm, page, addr, size);
740 	mutex_unlock(&vmm->mutex.ref);
741 }
742 
743 static int
nvkm_vmm_ptes_get(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size)744 nvkm_vmm_ptes_get(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
745 		  u64 addr, u64 size)
746 {
747 	u64 fail;
748 
749 	mutex_lock(&vmm->mutex.ref);
750 	fail = nvkm_vmm_iter(vmm, page, addr, size, "ref", true, false,
751 			     nvkm_vmm_ref_ptes, NULL, NULL, NULL);
752 	if (fail != ~0ULL) {
753 		if (fail != addr)
754 			nvkm_vmm_ptes_put_locked(vmm, page, addr, fail - addr);
755 		mutex_unlock(&vmm->mutex.ref);
756 		return -ENOMEM;
757 	}
758 	mutex_unlock(&vmm->mutex.ref);
759 	return 0;
760 }
761 
762 static void
__nvkm_vmm_ptes_unmap_put(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size,bool sparse,bool pfn)763 __nvkm_vmm_ptes_unmap_put(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
764 			  u64 addr, u64 size, bool sparse, bool pfn)
765 {
766 	const struct nvkm_vmm_desc_func *func = page->desc->func;
767 
768 	nvkm_vmm_iter(vmm, page, addr, size, "unmap + unref",
769 		      false, pfn, nvkm_vmm_unref_ptes, NULL, NULL,
770 		      sparse ? func->sparse : func->invalid ? func->invalid :
771 							      func->unmap);
772 }
773 
774 static void
nvkm_vmm_ptes_unmap_put(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size,bool sparse,bool pfn)775 nvkm_vmm_ptes_unmap_put(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
776 			u64 addr, u64 size, bool sparse, bool pfn)
777 {
778 	if (vmm->managed.raw) {
779 		nvkm_vmm_ptes_unmap(vmm, page, addr, size, sparse, pfn);
780 		nvkm_vmm_ptes_put(vmm, page, addr, size);
781 	} else {
782 		__nvkm_vmm_ptes_unmap_put(vmm, page, addr, size, sparse, pfn);
783 	}
784 }
785 
786 static int
__nvkm_vmm_ptes_get_map(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size,struct nvkm_vmm_map * map,nvkm_vmm_pte_func func)787 __nvkm_vmm_ptes_get_map(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
788 			u64 addr, u64 size, struct nvkm_vmm_map *map,
789 			nvkm_vmm_pte_func func)
790 {
791 	u64 fail = nvkm_vmm_iter(vmm, page, addr, size, "ref + map", true,
792 				 false, nvkm_vmm_ref_ptes, func, map, NULL);
793 	if (fail != ~0ULL) {
794 		if ((size = fail - addr))
795 			nvkm_vmm_ptes_unmap_put(vmm, page, addr, size, false, false);
796 		return -ENOMEM;
797 	}
798 	return 0;
799 }
800 
801 static int
nvkm_vmm_ptes_get_map(struct nvkm_vmm * vmm,const struct nvkm_vmm_page * page,u64 addr,u64 size,struct nvkm_vmm_map * map,nvkm_vmm_pte_func func)802 nvkm_vmm_ptes_get_map(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
803 		      u64 addr, u64 size, struct nvkm_vmm_map *map,
804 		      nvkm_vmm_pte_func func)
805 {
806 	int ret;
807 
808 	if (vmm->managed.raw) {
809 		ret = nvkm_vmm_ptes_get(vmm, page, addr, size);
810 		if (ret)
811 			return ret;
812 
813 		nvkm_vmm_ptes_map(vmm, page, addr, size, map, func);
814 
815 		return 0;
816 	} else {
817 		return __nvkm_vmm_ptes_get_map(vmm, page, addr, size, map, func);
818 	}
819 }
820 
821 struct nvkm_vma *
nvkm_vma_new(u64 addr,u64 size)822 nvkm_vma_new(u64 addr, u64 size)
823 {
824 	struct nvkm_vma *vma = kzalloc_obj(*vma);
825 	if (vma) {
826 		vma->addr = addr;
827 		vma->size = size;
828 		vma->page = NVKM_VMA_PAGE_NONE;
829 		vma->refd = NVKM_VMA_PAGE_NONE;
830 	}
831 	return vma;
832 }
833 
834 struct nvkm_vma *
nvkm_vma_tail(struct nvkm_vma * vma,u64 tail)835 nvkm_vma_tail(struct nvkm_vma *vma, u64 tail)
836 {
837 	struct nvkm_vma *new;
838 
839 	BUG_ON(vma->size == tail);
840 
841 	if (!(new = nvkm_vma_new(vma->addr + (vma->size - tail), tail)))
842 		return NULL;
843 	vma->size -= tail;
844 
845 	new->mapref = vma->mapref;
846 	new->sparse = vma->sparse;
847 	new->page = vma->page;
848 	new->refd = vma->refd;
849 	new->used = vma->used;
850 	new->part = vma->part;
851 	new->busy = vma->busy;
852 	new->mapped = vma->mapped;
853 	list_add(&new->head, &vma->head);
854 	return new;
855 }
856 
857 static inline void
nvkm_vmm_free_remove(struct nvkm_vmm * vmm,struct nvkm_vma * vma)858 nvkm_vmm_free_remove(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
859 {
860 	rb_erase(&vma->tree, &vmm->free);
861 }
862 
863 static inline void
nvkm_vmm_free_delete(struct nvkm_vmm * vmm,struct nvkm_vma * vma)864 nvkm_vmm_free_delete(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
865 {
866 	nvkm_vmm_free_remove(vmm, vma);
867 	list_del(&vma->head);
868 	kfree(vma);
869 }
870 
871 static void
nvkm_vmm_free_insert(struct nvkm_vmm * vmm,struct nvkm_vma * vma)872 nvkm_vmm_free_insert(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
873 {
874 	struct rb_node **ptr = &vmm->free.rb_node;
875 	struct rb_node *parent = NULL;
876 
877 	while (*ptr) {
878 		struct nvkm_vma *this = rb_entry(*ptr, typeof(*this), tree);
879 		parent = *ptr;
880 		if (vma->size < this->size)
881 			ptr = &parent->rb_left;
882 		else
883 		if (vma->size > this->size)
884 			ptr = &parent->rb_right;
885 		else
886 		if (vma->addr < this->addr)
887 			ptr = &parent->rb_left;
888 		else
889 		if (vma->addr > this->addr)
890 			ptr = &parent->rb_right;
891 		else
892 			BUG();
893 	}
894 
895 	rb_link_node(&vma->tree, parent, ptr);
896 	rb_insert_color(&vma->tree, &vmm->free);
897 }
898 
899 static inline void
nvkm_vmm_node_remove(struct nvkm_vmm * vmm,struct nvkm_vma * vma)900 nvkm_vmm_node_remove(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
901 {
902 	rb_erase(&vma->tree, &vmm->root);
903 }
904 
905 static inline void
nvkm_vmm_node_delete(struct nvkm_vmm * vmm,struct nvkm_vma * vma)906 nvkm_vmm_node_delete(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
907 {
908 	nvkm_vmm_node_remove(vmm, vma);
909 	list_del(&vma->head);
910 	kfree(vma);
911 }
912 
913 static void
nvkm_vmm_node_insert(struct nvkm_vmm * vmm,struct nvkm_vma * vma)914 nvkm_vmm_node_insert(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
915 {
916 	struct rb_node **ptr = &vmm->root.rb_node;
917 	struct rb_node *parent = NULL;
918 
919 	while (*ptr) {
920 		struct nvkm_vma *this = rb_entry(*ptr, typeof(*this), tree);
921 		parent = *ptr;
922 		if (vma->addr < this->addr)
923 			ptr = &parent->rb_left;
924 		else
925 		if (vma->addr > this->addr)
926 			ptr = &parent->rb_right;
927 		else
928 			BUG();
929 	}
930 
931 	rb_link_node(&vma->tree, parent, ptr);
932 	rb_insert_color(&vma->tree, &vmm->root);
933 }
934 
935 struct nvkm_vma *
nvkm_vmm_node_search(struct nvkm_vmm * vmm,u64 addr)936 nvkm_vmm_node_search(struct nvkm_vmm *vmm, u64 addr)
937 {
938 	struct rb_node *node = vmm->root.rb_node;
939 	while (node) {
940 		struct nvkm_vma *vma = rb_entry(node, typeof(*vma), tree);
941 		if (addr < vma->addr)
942 			node = node->rb_left;
943 		else
944 		if (addr >= vma->addr + vma->size)
945 			node = node->rb_right;
946 		else
947 			return vma;
948 	}
949 	return NULL;
950 }
951 
952 #define node(root, dir) (((root)->head.dir == &vmm->list) ? NULL :             \
953 	list_entry((root)->head.dir, struct nvkm_vma, head))
954 
955 static struct nvkm_vma *
nvkm_vmm_node_merge(struct nvkm_vmm * vmm,struct nvkm_vma * prev,struct nvkm_vma * vma,struct nvkm_vma * next,u64 size)956 nvkm_vmm_node_merge(struct nvkm_vmm *vmm, struct nvkm_vma *prev,
957 		    struct nvkm_vma *vma, struct nvkm_vma *next, u64 size)
958 {
959 	if (next) {
960 		if (vma->size == size) {
961 			vma->size += next->size;
962 			nvkm_vmm_node_delete(vmm, next);
963 			if (prev) {
964 				prev->size += vma->size;
965 				nvkm_vmm_node_delete(vmm, vma);
966 				return prev;
967 			}
968 			return vma;
969 		}
970 		BUG_ON(prev);
971 
972 		nvkm_vmm_node_remove(vmm, next);
973 		vma->size -= size;
974 		next->addr -= size;
975 		next->size += size;
976 		nvkm_vmm_node_insert(vmm, next);
977 		return next;
978 	}
979 
980 	if (prev) {
981 		if (vma->size != size) {
982 			nvkm_vmm_node_remove(vmm, vma);
983 			prev->size += size;
984 			vma->addr += size;
985 			vma->size -= size;
986 			nvkm_vmm_node_insert(vmm, vma);
987 		} else {
988 			prev->size += vma->size;
989 			nvkm_vmm_node_delete(vmm, vma);
990 		}
991 		return prev;
992 	}
993 
994 	return vma;
995 }
996 
997 struct nvkm_vma *
nvkm_vmm_node_split(struct nvkm_vmm * vmm,struct nvkm_vma * vma,u64 addr,u64 size)998 nvkm_vmm_node_split(struct nvkm_vmm *vmm,
999 		    struct nvkm_vma *vma, u64 addr, u64 size)
1000 {
1001 	struct nvkm_vma *prev = NULL;
1002 
1003 	if (vma->addr != addr) {
1004 		prev = vma;
1005 		if (!(vma = nvkm_vma_tail(vma, vma->size + vma->addr - addr)))
1006 			return NULL;
1007 		vma->part = true;
1008 		nvkm_vmm_node_insert(vmm, vma);
1009 	}
1010 
1011 	if (vma->size != size) {
1012 		struct nvkm_vma *tmp;
1013 		if (!(tmp = nvkm_vma_tail(vma, vma->size - size))) {
1014 			nvkm_vmm_node_merge(vmm, prev, vma, NULL, vma->size);
1015 			return NULL;
1016 		}
1017 		tmp->part = true;
1018 		nvkm_vmm_node_insert(vmm, tmp);
1019 	}
1020 
1021 	return vma;
1022 }
1023 
1024 static void
nvkm_vma_dump(struct nvkm_vma * vma)1025 nvkm_vma_dump(struct nvkm_vma *vma)
1026 {
1027 	printk(KERN_ERR "%016llx %016llx %c%c%c%c%c%c%c%c %p\n",
1028 	       vma->addr, (u64)vma->size,
1029 	       vma->used ? '-' : 'F',
1030 	       vma->mapref ? 'R' : '-',
1031 	       vma->sparse ? 'S' : '-',
1032 	       vma->page != NVKM_VMA_PAGE_NONE ? '0' + vma->page : '-',
1033 	       vma->refd != NVKM_VMA_PAGE_NONE ? '0' + vma->refd : '-',
1034 	       vma->part ? 'P' : '-',
1035 	       vma->busy ? 'B' : '-',
1036 	       vma->mapped ? 'M' : '-',
1037 	       vma->memory);
1038 }
1039 
1040 static void
nvkm_vmm_dump(struct nvkm_vmm * vmm)1041 nvkm_vmm_dump(struct nvkm_vmm *vmm)
1042 {
1043 	struct nvkm_vma *vma;
1044 	list_for_each_entry(vma, &vmm->list, head) {
1045 		nvkm_vma_dump(vma);
1046 	}
1047 }
1048 
1049 static void
nvkm_vmm_dtor(struct nvkm_vmm * vmm)1050 nvkm_vmm_dtor(struct nvkm_vmm *vmm)
1051 {
1052 	struct nvkm_vma *vma;
1053 	struct rb_node *node;
1054 
1055 	if (vmm->rm.client.gsp)
1056 		r535_mmu_vaspace_del(vmm);
1057 
1058 	if (0)
1059 		nvkm_vmm_dump(vmm);
1060 
1061 	while ((node = rb_first(&vmm->root))) {
1062 		struct nvkm_vma *vma = rb_entry(node, typeof(*vma), tree);
1063 		nvkm_vmm_put(vmm, &vma);
1064 	}
1065 
1066 	if (vmm->bootstrapped) {
1067 		const struct nvkm_vmm_page *page = vmm->func->page;
1068 		const u64 limit = vmm->limit - vmm->start;
1069 
1070 		while (page[1].shift)
1071 			page++;
1072 
1073 		nvkm_mmu_ptc_dump(vmm->mmu);
1074 		nvkm_vmm_ptes_put(vmm, page, vmm->start, limit);
1075 	}
1076 
1077 	vma = list_first_entry(&vmm->list, typeof(*vma), head);
1078 	list_del(&vma->head);
1079 	kfree(vma);
1080 	WARN_ON(!list_empty(&vmm->list));
1081 
1082 	if (vmm->nullp) {
1083 		dma_free_coherent(vmm->mmu->subdev.device->dev, 16 * 1024,
1084 				  vmm->nullp, vmm->null);
1085 	}
1086 
1087 	if (vmm->pd) {
1088 		nvkm_mmu_ptc_put(vmm->mmu, true, &vmm->pd->pt[0]);
1089 		nvkm_vmm_pt_del(&vmm->pd);
1090 	}
1091 }
1092 
1093 static int
nvkm_vmm_ctor_managed(struct nvkm_vmm * vmm,u64 addr,u64 size)1094 nvkm_vmm_ctor_managed(struct nvkm_vmm *vmm, u64 addr, u64 size)
1095 {
1096 	struct nvkm_vma *vma;
1097 	if (!(vma = nvkm_vma_new(addr, size)))
1098 		return -ENOMEM;
1099 	vma->mapref = true;
1100 	vma->sparse = false;
1101 	vma->used = true;
1102 	nvkm_vmm_node_insert(vmm, vma);
1103 	list_add_tail(&vma->head, &vmm->list);
1104 	return 0;
1105 }
1106 
1107 static int
nvkm_vmm_ctor(const struct nvkm_vmm_func * func,struct nvkm_mmu * mmu,u32 pd_header,bool managed,u64 addr,u64 size,struct lock_class_key * key,const char * name,struct nvkm_vmm * vmm)1108 nvkm_vmm_ctor(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
1109 	      u32 pd_header, bool managed, u64 addr, u64 size,
1110 	      struct lock_class_key *key, const char *name,
1111 	      struct nvkm_vmm *vmm)
1112 {
1113 	static struct lock_class_key _key;
1114 	const struct nvkm_vmm_page *page = func->page;
1115 	const struct nvkm_vmm_desc *desc;
1116 	struct nvkm_vma *vma;
1117 	int levels, bits = 0, ret;
1118 
1119 	vmm->func = func;
1120 	vmm->mmu = mmu;
1121 	vmm->name = name;
1122 	vmm->debug = mmu->subdev.debug;
1123 	kref_init(&vmm->kref);
1124 
1125 	__mutex_init(&vmm->mutex.vmm, "&vmm->mutex.vmm", key ? key : &_key);
1126 	mutex_init(&vmm->mutex.ref);
1127 	mutex_init(&vmm->mutex.map);
1128 
1129 	/* Locate the smallest page size supported by the backend, it will
1130 	 * have the deepest nesting of page tables.
1131 	 */
1132 	while (page[1].shift)
1133 		page++;
1134 
1135 	/* Locate the structure that describes the layout of the top-level
1136 	 * page table, and determine the number of valid bits in a virtual
1137 	 * address.
1138 	 */
1139 	for (levels = 0, desc = page->desc; desc->bits; desc++, levels++)
1140 		bits += desc->bits;
1141 	bits += page->shift;
1142 	desc--;
1143 
1144 	if (WARN_ON(levels > NVKM_VMM_LEVELS_MAX))
1145 		return -EINVAL;
1146 
1147 	/* Allocate top-level page table. */
1148 	vmm->pd = nvkm_vmm_pt_new(desc, false, NULL);
1149 	if (!vmm->pd)
1150 		return -ENOMEM;
1151 	vmm->pd->refs[0] = 1;
1152 	INIT_LIST_HEAD(&vmm->join);
1153 
1154 	/* ... and the GPU storage for it, except on Tesla-class GPUs that
1155 	 * have the PD embedded in the instance structure.
1156 	 */
1157 	if (desc->size) {
1158 		const u32 size = pd_header + desc->size * (1 << desc->bits);
1159 		vmm->pd->pt[0] = nvkm_mmu_ptc_get(mmu, size, desc->align, true);
1160 		if (!vmm->pd->pt[0])
1161 			return -ENOMEM;
1162 	}
1163 
1164 	/* Initialise address-space MM. */
1165 	INIT_LIST_HEAD(&vmm->list);
1166 	vmm->free = RB_ROOT;
1167 	vmm->root = RB_ROOT;
1168 
1169 	if (managed) {
1170 		/* Address-space will be managed by the client for the most
1171 		 * part, except for a specified area where NVKM allocations
1172 		 * are allowed to be placed.
1173 		 */
1174 		vmm->start = 0;
1175 		vmm->limit = 1ULL << bits;
1176 		if (addr + size < addr || addr + size > vmm->limit)
1177 			return -EINVAL;
1178 
1179 		/* Client-managed area before the NVKM-managed area. */
1180 		if (addr && (ret = nvkm_vmm_ctor_managed(vmm, 0, addr)))
1181 			return ret;
1182 
1183 		vmm->managed.p.addr = 0;
1184 		vmm->managed.p.size = addr;
1185 
1186 		/* NVKM-managed area. */
1187 		if (size) {
1188 			if (!(vma = nvkm_vma_new(addr, size)))
1189 				return -ENOMEM;
1190 			nvkm_vmm_free_insert(vmm, vma);
1191 			list_add_tail(&vma->head, &vmm->list);
1192 		}
1193 
1194 		/* Client-managed area after the NVKM-managed area. */
1195 		addr = addr + size;
1196 		size = vmm->limit - addr;
1197 		if (size && (ret = nvkm_vmm_ctor_managed(vmm, addr, size)))
1198 			return ret;
1199 
1200 		vmm->managed.n.addr = addr;
1201 		vmm->managed.n.size = size;
1202 	} else {
1203 		/* Address-space fully managed by NVKM, requiring calls to
1204 		 * nvkm_vmm_get()/nvkm_vmm_put() to allocate address-space.
1205 		 */
1206 		vmm->start = addr;
1207 		vmm->limit = size ? (addr + size) : (1ULL << bits);
1208 		if (vmm->start > vmm->limit || vmm->limit > (1ULL << bits))
1209 			return -EINVAL;
1210 
1211 		if (!(vma = nvkm_vma_new(vmm->start, vmm->limit - vmm->start)))
1212 			return -ENOMEM;
1213 
1214 		nvkm_vmm_free_insert(vmm, vma);
1215 		list_add(&vma->head, &vmm->list);
1216 	}
1217 
1218 	return 0;
1219 }
1220 
1221 int
nvkm_vmm_new_(const struct nvkm_vmm_func * func,struct nvkm_mmu * mmu,u32 hdr,bool managed,u64 addr,u64 size,struct lock_class_key * key,const char * name,struct nvkm_vmm ** pvmm)1222 nvkm_vmm_new_(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
1223 	      u32 hdr, bool managed, u64 addr, u64 size,
1224 	      struct lock_class_key *key, const char *name,
1225 	      struct nvkm_vmm **pvmm)
1226 {
1227 	if (!(*pvmm = kzalloc_obj(**pvmm)))
1228 		return -ENOMEM;
1229 	return nvkm_vmm_ctor(func, mmu, hdr, managed, addr, size, key, name, *pvmm);
1230 }
1231 
1232 static struct nvkm_vma *
nvkm_vmm_pfn_split_merge(struct nvkm_vmm * vmm,struct nvkm_vma * vma,u64 addr,u64 size,u8 page,bool map)1233 nvkm_vmm_pfn_split_merge(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
1234 			 u64 addr, u64 size, u8 page, bool map)
1235 {
1236 	struct nvkm_vma *prev = NULL;
1237 	struct nvkm_vma *next = NULL;
1238 
1239 	if (vma->addr == addr && vma->part && (prev = node(vma, prev))) {
1240 		if (prev->memory || prev->mapped != map)
1241 			prev = NULL;
1242 	}
1243 
1244 	if (vma->addr + vma->size == addr + size && (next = node(vma, next))) {
1245 		if (!next->part ||
1246 		    next->memory || next->mapped != map)
1247 			next = NULL;
1248 	}
1249 
1250 	if (prev || next)
1251 		return nvkm_vmm_node_merge(vmm, prev, vma, next, size);
1252 	return nvkm_vmm_node_split(vmm, vma, addr, size);
1253 }
1254 
1255 int
nvkm_vmm_pfn_unmap(struct nvkm_vmm * vmm,u64 addr,u64 size)1256 nvkm_vmm_pfn_unmap(struct nvkm_vmm *vmm, u64 addr, u64 size)
1257 {
1258 	struct nvkm_vma *vma = nvkm_vmm_node_search(vmm, addr);
1259 	struct nvkm_vma *next;
1260 	u64 limit = addr + size;
1261 	u64 start = addr;
1262 
1263 	if (!vma)
1264 		return -EINVAL;
1265 
1266 	do {
1267 		if (!vma->mapped || vma->memory)
1268 			continue;
1269 
1270 		size = min(limit - start, vma->size - (start - vma->addr));
1271 
1272 		nvkm_vmm_ptes_unmap_put(vmm, &vmm->func->page[vma->refd],
1273 					start, size, false, true);
1274 
1275 		next = nvkm_vmm_pfn_split_merge(vmm, vma, start, size, 0, false);
1276 		if (!WARN_ON(!next)) {
1277 			vma = next;
1278 			vma->refd = NVKM_VMA_PAGE_NONE;
1279 			vma->mapped = false;
1280 		}
1281 	} while ((vma = node(vma, next)) && (start = vma->addr) < limit);
1282 
1283 	return 0;
1284 }
1285 
1286 /*TODO:
1287  * - Avoid PT readback (for dma_unmap etc), this might end up being dealt
1288  *   with inside HMM, which would be a lot nicer for us to deal with.
1289  * - Support for systems without a 4KiB page size.
1290  */
1291 int
nvkm_vmm_pfn_map(struct nvkm_vmm * vmm,u8 shift,u64 addr,u64 size,u64 * pfn)1292 nvkm_vmm_pfn_map(struct nvkm_vmm *vmm, u8 shift, u64 addr, u64 size, u64 *pfn)
1293 {
1294 	const struct nvkm_vmm_page *page = vmm->func->page;
1295 	struct nvkm_vma *vma, *tmp;
1296 	u64 limit = addr + size;
1297 	u64 start = addr;
1298 	int pm = size >> shift;
1299 	int pi = 0;
1300 
1301 	/* Only support mapping where the page size of the incoming page
1302 	 * array matches a page size available for direct mapping.
1303 	 */
1304 	while (page->shift && (page->shift != shift ||
1305 	       page->desc->func->pfn == NULL))
1306 		page++;
1307 
1308 	if (!page->shift || !IS_ALIGNED(addr, 1ULL << shift) ||
1309 			    !IS_ALIGNED(size, 1ULL << shift) ||
1310 	    addr + size < addr || addr + size > vmm->limit) {
1311 		VMM_DEBUG(vmm, "paged map %d %d %016llx %016llx\n",
1312 			  shift, page->shift, addr, size);
1313 		return -EINVAL;
1314 	}
1315 
1316 	if (!(vma = nvkm_vmm_node_search(vmm, addr)))
1317 		return -ENOENT;
1318 
1319 	do {
1320 		bool map = !!(pfn[pi] & NVKM_VMM_PFN_V);
1321 		bool mapped = vma->mapped;
1322 		u64 size = limit - start;
1323 		u64 addr = start;
1324 		int pn, ret = 0;
1325 
1326 		/* Narrow the operation window to cover a single action (page
1327 		 * should be mapped or not) within a single VMA.
1328 		 */
1329 		for (pn = 0; pi + pn < pm; pn++) {
1330 			if (map != !!(pfn[pi + pn] & NVKM_VMM_PFN_V))
1331 				break;
1332 		}
1333 		size = min_t(u64, size, pn << page->shift);
1334 		size = min_t(u64, size, vma->size + vma->addr - addr);
1335 
1336 		/* Reject any operation to unmanaged regions, and areas that
1337 		 * have nvkm_memory objects mapped in them already.
1338 		 */
1339 		if (!vma->mapref || vma->memory) {
1340 			ret = -EINVAL;
1341 			goto next;
1342 		}
1343 
1344 		/* In order to both properly refcount GPU page tables, and
1345 		 * prevent "normal" mappings and these direct mappings from
1346 		 * interfering with each other, we need to track contiguous
1347 		 * ranges that have been mapped with this interface.
1348 		 *
1349 		 * Here we attempt to either split an existing VMA so we're
1350 		 * able to flag the region as either unmapped/mapped, or to
1351 		 * merge with adjacent VMAs that are already compatible.
1352 		 *
1353 		 * If the region is already compatible, nothing is required.
1354 		 */
1355 		if (map != mapped) {
1356 			tmp = nvkm_vmm_pfn_split_merge(vmm, vma, addr, size,
1357 						       page -
1358 						       vmm->func->page, map);
1359 			if (WARN_ON(!tmp)) {
1360 				ret = -ENOMEM;
1361 				goto next;
1362 			}
1363 
1364 			if ((tmp->mapped = map))
1365 				tmp->refd = page - vmm->func->page;
1366 			else
1367 				tmp->refd = NVKM_VMA_PAGE_NONE;
1368 			vma = tmp;
1369 		}
1370 
1371 		/* Update HW page tables. */
1372 		if (map) {
1373 			struct nvkm_vmm_map args;
1374 			args.page = page;
1375 			args.pfn = &pfn[pi];
1376 
1377 			if (!mapped) {
1378 				ret = nvkm_vmm_ptes_get_map(vmm, page, addr,
1379 							    size, &args, page->
1380 							    desc->func->pfn);
1381 			} else {
1382 				nvkm_vmm_ptes_map(vmm, page, addr, size, &args,
1383 						  page->desc->func->pfn);
1384 			}
1385 		} else {
1386 			if (mapped) {
1387 				nvkm_vmm_ptes_unmap_put(vmm, page, addr, size,
1388 							false, true);
1389 			}
1390 		}
1391 
1392 next:
1393 		/* Iterate to next operation. */
1394 		if (vma->addr + vma->size == addr + size)
1395 			vma = node(vma, next);
1396 		start += size;
1397 
1398 		if (ret) {
1399 			/* Failure is signalled by clearing the valid bit on
1400 			 * any PFN that couldn't be modified as requested.
1401 			 */
1402 			while (size) {
1403 				pfn[pi++] = NVKM_VMM_PFN_NONE;
1404 				size -= 1 << page->shift;
1405 			}
1406 		} else {
1407 			pi += size >> page->shift;
1408 		}
1409 	} while (vma && start < limit);
1410 
1411 	return 0;
1412 }
1413 
1414 void
nvkm_vmm_unmap_region(struct nvkm_vmm * vmm,struct nvkm_vma * vma)1415 nvkm_vmm_unmap_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
1416 {
1417 	struct nvkm_vma *prev = NULL;
1418 	struct nvkm_vma *next;
1419 
1420 	nvkm_memory_tags_put(vma->memory, vmm->mmu->subdev.device, &vma->tags);
1421 	nvkm_memory_unref(&vma->memory);
1422 	vma->mapped = false;
1423 
1424 	if (vma->part && (prev = node(vma, prev)) && prev->mapped)
1425 		prev = NULL;
1426 	if ((next = node(vma, next)) && (!next->part || next->mapped))
1427 		next = NULL;
1428 	nvkm_vmm_node_merge(vmm, prev, vma, next, vma->size);
1429 }
1430 
1431 void
nvkm_vmm_unmap_locked(struct nvkm_vmm * vmm,struct nvkm_vma * vma,bool pfn)1432 nvkm_vmm_unmap_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma, bool pfn)
1433 {
1434 	const struct nvkm_vmm_page *page = &vmm->func->page[vma->refd];
1435 
1436 	if (vma->mapref) {
1437 		nvkm_vmm_ptes_unmap_put(vmm, page, vma->addr, vma->size, vma->sparse, pfn);
1438 		vma->refd = NVKM_VMA_PAGE_NONE;
1439 	} else {
1440 		nvkm_vmm_ptes_unmap(vmm, page, vma->addr, vma->size, vma->sparse, pfn);
1441 	}
1442 
1443 	nvkm_vmm_unmap_region(vmm, vma);
1444 }
1445 
1446 void
nvkm_vmm_unmap(struct nvkm_vmm * vmm,struct nvkm_vma * vma)1447 nvkm_vmm_unmap(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
1448 {
1449 	if (vma->memory) {
1450 		mutex_lock(&vmm->mutex.vmm);
1451 		nvkm_vmm_unmap_locked(vmm, vma, false);
1452 		mutex_unlock(&vmm->mutex.vmm);
1453 	}
1454 }
1455 
1456 static int
nvkm_vmm_map_valid(struct nvkm_vmm * vmm,struct nvkm_vma * vma,void * argv,u32 argc,struct nvkm_vmm_map * map)1457 nvkm_vmm_map_valid(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
1458 		   void *argv, u32 argc, struct nvkm_vmm_map *map)
1459 {
1460 	switch (nvkm_memory_target(map->memory)) {
1461 	case NVKM_MEM_TARGET_VRAM:
1462 		if (!(map->page->type & NVKM_VMM_PAGE_VRAM)) {
1463 			VMM_DEBUG(vmm, "%d !VRAM", map->page->shift);
1464 			return -EINVAL;
1465 		}
1466 		break;
1467 	case NVKM_MEM_TARGET_HOST:
1468 	case NVKM_MEM_TARGET_NCOH:
1469 		if (!(map->page->type & NVKM_VMM_PAGE_HOST)) {
1470 			VMM_DEBUG(vmm, "%d !HOST", map->page->shift);
1471 			return -EINVAL;
1472 		}
1473 		break;
1474 	default:
1475 		WARN_ON(1);
1476 		return -ENOSYS;
1477 	}
1478 
1479 	if (!IS_ALIGNED(     vma->addr, 1ULL << map->page->shift) ||
1480 	    !IS_ALIGNED((u64)vma->size, 1ULL << map->page->shift) ||
1481 	    !IS_ALIGNED(   map->offset, 1ULL << map->page->shift) ||
1482 	    nvkm_memory_page(map->memory) < map->page->shift) {
1483 		VMM_DEBUG(vmm, "alignment %016llx %016llx %016llx %d %d",
1484 		    vma->addr, (u64)vma->size, map->offset, map->page->shift,
1485 		    nvkm_memory_page(map->memory));
1486 		return -EINVAL;
1487 	}
1488 
1489 	return vmm->func->valid(vmm, argv, argc, map);
1490 }
1491 
1492 static int
nvkm_vmm_map_choose(struct nvkm_vmm * vmm,struct nvkm_vma * vma,void * argv,u32 argc,struct nvkm_vmm_map * map)1493 nvkm_vmm_map_choose(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
1494 		    void *argv, u32 argc, struct nvkm_vmm_map *map)
1495 {
1496 	for (map->page = vmm->func->page; map->page->shift; map->page++) {
1497 		VMM_DEBUG(vmm, "trying %d", map->page->shift);
1498 		if (!nvkm_vmm_map_valid(vmm, vma, argv, argc, map))
1499 			return 0;
1500 	}
1501 	return -EINVAL;
1502 }
1503 
1504 static int
nvkm_vmm_map_locked(struct nvkm_vmm * vmm,struct nvkm_vma * vma,void * argv,u32 argc,struct nvkm_vmm_map * map)1505 nvkm_vmm_map_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
1506 		    void *argv, u32 argc, struct nvkm_vmm_map *map)
1507 {
1508 	nvkm_vmm_pte_func func;
1509 	int ret;
1510 
1511 	map->no_comp = vma->no_comp;
1512 
1513 	/* Make sure we won't overrun the end of the memory object. */
1514 	if (unlikely(nvkm_memory_size(map->memory) < map->offset + vma->size)) {
1515 		VMM_DEBUG(vmm, "overrun %016llx %016llx %016llx",
1516 			  nvkm_memory_size(map->memory),
1517 			  map->offset, (u64)vma->size);
1518 		return -EINVAL;
1519 	}
1520 
1521 	/* Check remaining arguments for validity. */
1522 	if (vma->page == NVKM_VMA_PAGE_NONE &&
1523 	    vma->refd == NVKM_VMA_PAGE_NONE) {
1524 		/* Find the largest page size we can perform the mapping at. */
1525 		const u32 debug = vmm->debug;
1526 		vmm->debug = 0;
1527 		ret = nvkm_vmm_map_choose(vmm, vma, argv, argc, map);
1528 		vmm->debug = debug;
1529 		if (ret) {
1530 			VMM_DEBUG(vmm, "invalid at any page size");
1531 			nvkm_vmm_map_choose(vmm, vma, argv, argc, map);
1532 			return -EINVAL;
1533 		}
1534 	} else {
1535 		/* Page size of the VMA is already pre-determined. */
1536 		if (vma->refd != NVKM_VMA_PAGE_NONE)
1537 			map->page = &vmm->func->page[vma->refd];
1538 		else
1539 			map->page = &vmm->func->page[vma->page];
1540 
1541 		ret = nvkm_vmm_map_valid(vmm, vma, argv, argc, map);
1542 		if (ret) {
1543 			VMM_DEBUG(vmm, "invalid %d\n", ret);
1544 			return ret;
1545 		}
1546 	}
1547 
1548 	/* Deal with the 'offset' argument, and fetch the backend function. */
1549 	map->off = map->offset;
1550 	if (map->mem) {
1551 		for (; map->off; map->mem = map->mem->next) {
1552 			u64 size = (u64)map->mem->length << NVKM_RAM_MM_SHIFT;
1553 			if (size > map->off)
1554 				break;
1555 			map->off -= size;
1556 		}
1557 		func = map->page->desc->func->mem;
1558 	} else
1559 	if (map->sgl) {
1560 		for (; map->off; map->sgl = sg_next(map->sgl)) {
1561 			u64 size = sg_dma_len(map->sgl);
1562 			if (size > map->off)
1563 				break;
1564 			map->off -= size;
1565 		}
1566 		func = map->page->desc->func->sgl;
1567 	} else {
1568 		map->dma += map->offset >> PAGE_SHIFT;
1569 		map->off  = map->offset & PAGE_MASK;
1570 		func = map->page->desc->func->dma;
1571 	}
1572 
1573 	/* Perform the map. */
1574 	if (vma->refd == NVKM_VMA_PAGE_NONE) {
1575 		ret = nvkm_vmm_ptes_get_map(vmm, map->page, vma->addr, vma->size, map, func);
1576 		if (ret)
1577 			return ret;
1578 
1579 		vma->refd = map->page - vmm->func->page;
1580 	} else {
1581 		nvkm_vmm_ptes_map(vmm, map->page, vma->addr, vma->size, map, func);
1582 	}
1583 
1584 	nvkm_memory_tags_put(vma->memory, vmm->mmu->subdev.device, &vma->tags);
1585 	nvkm_memory_unref(&vma->memory);
1586 	vma->memory = nvkm_memory_ref(map->memory);
1587 	vma->mapped = true;
1588 	vma->tags = map->tags;
1589 	return 0;
1590 }
1591 
1592 int
nvkm_vmm_map(struct nvkm_vmm * vmm,struct nvkm_vma * vma,void * argv,u32 argc,struct nvkm_vmm_map * map)1593 nvkm_vmm_map(struct nvkm_vmm *vmm, struct nvkm_vma *vma, void *argv, u32 argc,
1594 	     struct nvkm_vmm_map *map)
1595 {
1596 	int ret;
1597 
1598 	if (nvkm_vmm_in_managed_range(vmm, vma->addr, vma->size) &&
1599 	    vmm->managed.raw)
1600 		return nvkm_vmm_map_locked(vmm, vma, argv, argc, map);
1601 
1602 	mutex_lock(&vmm->mutex.vmm);
1603 	ret = nvkm_vmm_map_locked(vmm, vma, argv, argc, map);
1604 	vma->busy = false;
1605 	mutex_unlock(&vmm->mutex.vmm);
1606 	return ret;
1607 }
1608 
1609 static void
nvkm_vmm_put_region(struct nvkm_vmm * vmm,struct nvkm_vma * vma)1610 nvkm_vmm_put_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
1611 {
1612 	struct nvkm_vma *prev, *next;
1613 
1614 	if ((prev = node(vma, prev)) && !prev->used) {
1615 		vma->addr  = prev->addr;
1616 		vma->size += prev->size;
1617 		nvkm_vmm_free_delete(vmm, prev);
1618 	}
1619 
1620 	if ((next = node(vma, next)) && !next->used) {
1621 		vma->size += next->size;
1622 		nvkm_vmm_free_delete(vmm, next);
1623 	}
1624 
1625 	nvkm_vmm_free_insert(vmm, vma);
1626 }
1627 
1628 void
nvkm_vmm_put_locked(struct nvkm_vmm * vmm,struct nvkm_vma * vma)1629 nvkm_vmm_put_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
1630 {
1631 	const struct nvkm_vmm_page *page = vmm->func->page;
1632 	struct nvkm_vma *next = vma;
1633 
1634 	BUG_ON(vma->part);
1635 
1636 	if (vma->mapref || !vma->sparse) {
1637 		do {
1638 			const bool mem = next->memory != NULL;
1639 			const bool map = next->mapped;
1640 			const u8  refd = next->refd;
1641 			const u64 addr = next->addr;
1642 			u64 size = next->size;
1643 
1644 			/* Merge regions that are in the same state. */
1645 			while ((next = node(next, next)) && next->part &&
1646 			       (next->mapped == map) &&
1647 			       (next->memory != NULL) == mem &&
1648 			       (next->refd == refd))
1649 				size += next->size;
1650 
1651 			if (map) {
1652 				/* Region(s) are mapped, merge the unmap
1653 				 * and dereference into a single walk of
1654 				 * the page tree.
1655 				 */
1656 				nvkm_vmm_ptes_unmap_put(vmm, &page[refd], addr,
1657 							size, vma->sparse,
1658 							!mem);
1659 			} else
1660 			if (refd != NVKM_VMA_PAGE_NONE) {
1661 				/* Drop allocation-time PTE references. */
1662 				nvkm_vmm_ptes_put(vmm, &page[refd], addr, size);
1663 			}
1664 		} while (next && next->part);
1665 	}
1666 
1667 	/* Merge any mapped regions that were split from the initial
1668 	 * address-space allocation back into the allocated VMA, and
1669 	 * release memory/compression resources.
1670 	 */
1671 	next = vma;
1672 	do {
1673 		if (next->mapped)
1674 			nvkm_vmm_unmap_region(vmm, next);
1675 	} while ((next = node(vma, next)) && next->part);
1676 
1677 	if (vma->sparse && !vma->mapref) {
1678 		/* Sparse region that was allocated with a fixed page size,
1679 		 * meaning all relevant PTEs were referenced once when the
1680 		 * region was allocated, and remained that way, regardless
1681 		 * of whether memory was mapped into it afterwards.
1682 		 *
1683 		 * The process of unmapping, unsparsing, and dereferencing
1684 		 * PTEs can be done in a single page tree walk.
1685 		 */
1686 		nvkm_vmm_ptes_sparse_put(vmm, &page[vma->refd], vma->addr, vma->size);
1687 	} else
1688 	if (vma->sparse) {
1689 		/* Sparse region that wasn't allocated with a fixed page size,
1690 		 * PTE references were taken both at allocation time (to make
1691 		 * the GPU see the region as sparse), and when mapping memory
1692 		 * into the region.
1693 		 *
1694 		 * The latter was handled above, and the remaining references
1695 		 * are dealt with here.
1696 		 */
1697 		nvkm_vmm_ptes_sparse(vmm, vma->addr, vma->size, false);
1698 	}
1699 
1700 	/* Remove VMA from the list of allocated nodes. */
1701 	nvkm_vmm_node_remove(vmm, vma);
1702 
1703 	/* Merge VMA back into the free list. */
1704 	vma->page = NVKM_VMA_PAGE_NONE;
1705 	vma->refd = NVKM_VMA_PAGE_NONE;
1706 	vma->used = false;
1707 	nvkm_vmm_put_region(vmm, vma);
1708 }
1709 
1710 void
nvkm_vmm_put(struct nvkm_vmm * vmm,struct nvkm_vma ** pvma)1711 nvkm_vmm_put(struct nvkm_vmm *vmm, struct nvkm_vma **pvma)
1712 {
1713 	struct nvkm_vma *vma = *pvma;
1714 	if (vma) {
1715 		mutex_lock(&vmm->mutex.vmm);
1716 		nvkm_vmm_put_locked(vmm, vma);
1717 		mutex_unlock(&vmm->mutex.vmm);
1718 		*pvma = NULL;
1719 	}
1720 }
1721 
1722 int
nvkm_vmm_get_locked(struct nvkm_vmm * vmm,bool getref,bool mapref,bool sparse,u8 shift,u8 align,u64 size,struct nvkm_vma ** pvma)1723 nvkm_vmm_get_locked(struct nvkm_vmm *vmm, bool getref, bool mapref, bool sparse,
1724 		    u8 shift, u8 align, u64 size, struct nvkm_vma **pvma)
1725 {
1726 	const struct nvkm_vmm_page *page = &vmm->func->page[NVKM_VMA_PAGE_NONE];
1727 	struct rb_node *node = NULL, *temp;
1728 	struct nvkm_vma *vma = NULL, *tmp;
1729 	u64 addr, tail;
1730 	int ret;
1731 
1732 	VMM_TRACE(vmm, "getref %d mapref %d sparse %d "
1733 		       "shift: %d align: %d size: %016llx",
1734 		  getref, mapref, sparse, shift, align, size);
1735 
1736 	/* Zero-sized, or lazily-allocated sparse VMAs, make no sense. */
1737 	if (unlikely(!size || (!getref && !mapref && sparse))) {
1738 		VMM_DEBUG(vmm, "args %016llx %d %d %d",
1739 			  size, getref, mapref, sparse);
1740 		return -EINVAL;
1741 	}
1742 
1743 	/* Tesla-class GPUs can only select page size per-PDE, which means
1744 	 * we're required to know the mapping granularity up-front to find
1745 	 * a suitable region of address-space.
1746 	 *
1747 	 * The same goes if we're requesting up-front allocation of PTES.
1748 	 */
1749 	if (unlikely((getref || vmm->func->page_block) && !shift)) {
1750 		VMM_DEBUG(vmm, "page size required: %d %016llx",
1751 			  getref, vmm->func->page_block);
1752 		return -EINVAL;
1753 	}
1754 
1755 	/* If a specific page size was requested, determine its index and
1756 	 * make sure the requested size is a multiple of the page size.
1757 	 */
1758 	if (shift) {
1759 		for (page = vmm->func->page; page->shift; page++) {
1760 			if (shift == page->shift)
1761 				break;
1762 		}
1763 
1764 		if (!page->shift || !IS_ALIGNED(size, 1ULL << page->shift)) {
1765 			VMM_DEBUG(vmm, "page %d %016llx", shift, size);
1766 			return -EINVAL;
1767 		}
1768 		align = max_t(u8, align, shift);
1769 	} else {
1770 		align = max_t(u8, align, 12);
1771 	}
1772 
1773 	/* Locate smallest block that can possibly satisfy the allocation. */
1774 	temp = vmm->free.rb_node;
1775 	while (temp) {
1776 		struct nvkm_vma *this = rb_entry(temp, typeof(*this), tree);
1777 		if (this->size < size) {
1778 			temp = temp->rb_right;
1779 		} else {
1780 			node = temp;
1781 			temp = temp->rb_left;
1782 		}
1783 	}
1784 
1785 	if (unlikely(!node))
1786 		return -ENOSPC;
1787 
1788 	/* Take into account alignment restrictions, trying larger blocks
1789 	 * in turn until we find a suitable free block.
1790 	 */
1791 	do {
1792 		struct nvkm_vma *this = rb_entry(node, typeof(*this), tree);
1793 		struct nvkm_vma *prev = node(this, prev);
1794 		struct nvkm_vma *next = node(this, next);
1795 		const int p = page - vmm->func->page;
1796 
1797 		addr = this->addr;
1798 		if (vmm->func->page_block && prev && prev->page != p)
1799 			addr = ALIGN(addr, vmm->func->page_block);
1800 		addr = ALIGN(addr, 1ULL << align);
1801 
1802 		tail = this->addr + this->size;
1803 		if (vmm->func->page_block && next && next->page != p)
1804 			tail = ALIGN_DOWN(tail, vmm->func->page_block);
1805 
1806 		if (addr <= tail && tail - addr >= size) {
1807 			nvkm_vmm_free_remove(vmm, this);
1808 			vma = this;
1809 			break;
1810 		}
1811 	} while ((node = rb_next(node)));
1812 
1813 	if (unlikely(!vma))
1814 		return -ENOSPC;
1815 
1816 	/* If the VMA we found isn't already exactly the requested size,
1817 	 * it needs to be split, and the remaining free blocks returned.
1818 	 */
1819 	if (addr != vma->addr) {
1820 		if (!(tmp = nvkm_vma_tail(vma, vma->size + vma->addr - addr))) {
1821 			nvkm_vmm_put_region(vmm, vma);
1822 			return -ENOMEM;
1823 		}
1824 		nvkm_vmm_free_insert(vmm, vma);
1825 		vma = tmp;
1826 	}
1827 
1828 	if (size != vma->size) {
1829 		if (!(tmp = nvkm_vma_tail(vma, vma->size - size))) {
1830 			nvkm_vmm_put_region(vmm, vma);
1831 			return -ENOMEM;
1832 		}
1833 		nvkm_vmm_free_insert(vmm, tmp);
1834 	}
1835 
1836 	/* Pre-allocate page tables and/or setup sparse mappings. */
1837 	if (sparse && getref)
1838 		ret = nvkm_vmm_ptes_sparse_get(vmm, page, vma->addr, vma->size);
1839 	else if (sparse)
1840 		ret = nvkm_vmm_ptes_sparse(vmm, vma->addr, vma->size, true);
1841 	else if (getref)
1842 		ret = nvkm_vmm_ptes_get(vmm, page, vma->addr, vma->size);
1843 	else
1844 		ret = 0;
1845 	if (ret) {
1846 		nvkm_vmm_put_region(vmm, vma);
1847 		return ret;
1848 	}
1849 
1850 	vma->mapref = mapref && !getref;
1851 	vma->sparse = sparse;
1852 	vma->page = page - vmm->func->page;
1853 	vma->refd = getref ? vma->page : NVKM_VMA_PAGE_NONE;
1854 	vma->used = true;
1855 	nvkm_vmm_node_insert(vmm, vma);
1856 	*pvma = vma;
1857 	return 0;
1858 }
1859 
1860 int
nvkm_vmm_get(struct nvkm_vmm * vmm,u8 page,u64 size,struct nvkm_vma ** pvma)1861 nvkm_vmm_get(struct nvkm_vmm *vmm, u8 page, u64 size, struct nvkm_vma **pvma)
1862 {
1863 	int ret;
1864 	mutex_lock(&vmm->mutex.vmm);
1865 	ret = nvkm_vmm_get_locked(vmm, false, true, false, page, 0, size, pvma);
1866 	mutex_unlock(&vmm->mutex.vmm);
1867 	return ret;
1868 }
1869 
1870 void
nvkm_vmm_raw_unmap(struct nvkm_vmm * vmm,u64 addr,u64 size,bool sparse,u8 refd)1871 nvkm_vmm_raw_unmap(struct nvkm_vmm *vmm, u64 addr, u64 size,
1872 		   bool sparse, u8 refd)
1873 {
1874 	const struct nvkm_vmm_page *page = &vmm->func->page[refd];
1875 
1876 	nvkm_vmm_ptes_unmap(vmm, page, addr, size, sparse, false);
1877 }
1878 
1879 void
nvkm_vmm_raw_put(struct nvkm_vmm * vmm,u64 addr,u64 size,u8 refd)1880 nvkm_vmm_raw_put(struct nvkm_vmm *vmm, u64 addr, u64 size, u8 refd)
1881 {
1882 	const struct nvkm_vmm_page *page = vmm->func->page;
1883 
1884 	nvkm_vmm_ptes_put(vmm, &page[refd], addr, size);
1885 }
1886 
1887 int
nvkm_vmm_raw_get(struct nvkm_vmm * vmm,u64 addr,u64 size,u8 refd)1888 nvkm_vmm_raw_get(struct nvkm_vmm *vmm, u64 addr, u64 size, u8 refd)
1889 {
1890 	const struct nvkm_vmm_page *page = vmm->func->page;
1891 
1892 	if (unlikely(!size))
1893 		return -EINVAL;
1894 
1895 	return nvkm_vmm_ptes_get(vmm, &page[refd], addr, size);
1896 }
1897 
1898 int
nvkm_vmm_raw_sparse(struct nvkm_vmm * vmm,u64 addr,u64 size,bool ref)1899 nvkm_vmm_raw_sparse(struct nvkm_vmm *vmm, u64 addr, u64 size, bool ref)
1900 {
1901 	int ret;
1902 
1903 	mutex_lock(&vmm->mutex.ref);
1904 	ret = nvkm_vmm_ptes_sparse(vmm, addr, size, ref);
1905 	mutex_unlock(&vmm->mutex.ref);
1906 
1907 	return ret;
1908 }
1909 
1910 void
nvkm_vmm_part(struct nvkm_vmm * vmm,struct nvkm_memory * inst)1911 nvkm_vmm_part(struct nvkm_vmm *vmm, struct nvkm_memory *inst)
1912 {
1913 	if (inst && vmm && vmm->func->part) {
1914 		mutex_lock(&vmm->mutex.vmm);
1915 		vmm->func->part(vmm, inst);
1916 		mutex_unlock(&vmm->mutex.vmm);
1917 	}
1918 }
1919 
1920 int
nvkm_vmm_join(struct nvkm_vmm * vmm,struct nvkm_memory * inst)1921 nvkm_vmm_join(struct nvkm_vmm *vmm, struct nvkm_memory *inst)
1922 {
1923 	int ret = 0;
1924 	if (vmm->func->join) {
1925 		mutex_lock(&vmm->mutex.vmm);
1926 		ret = vmm->func->join(vmm, inst);
1927 		mutex_unlock(&vmm->mutex.vmm);
1928 	}
1929 	return ret;
1930 }
1931 
1932 static bool
nvkm_vmm_boot_ptes(struct nvkm_vmm_iter * it,bool pfn,u32 ptei,u32 ptes)1933 nvkm_vmm_boot_ptes(struct nvkm_vmm_iter *it, bool pfn, u32 ptei, u32 ptes)
1934 {
1935 	const struct nvkm_vmm_desc *desc = it->desc;
1936 	const int type = desc->type == SPT;
1937 	nvkm_memory_boot(it->pt[0]->pt[type]->memory, it->vmm);
1938 	return false;
1939 }
1940 
1941 int
nvkm_vmm_boot(struct nvkm_vmm * vmm)1942 nvkm_vmm_boot(struct nvkm_vmm *vmm)
1943 {
1944 	const struct nvkm_vmm_page *page = vmm->func->page;
1945 	const u64 limit = vmm->limit - vmm->start;
1946 	int ret;
1947 
1948 	while (page[1].shift)
1949 		page++;
1950 
1951 	ret = nvkm_vmm_ptes_get(vmm, page, vmm->start, limit);
1952 	if (ret)
1953 		return ret;
1954 
1955 	nvkm_vmm_iter(vmm, page, vmm->start, limit, "bootstrap", false, false,
1956 		      nvkm_vmm_boot_ptes, NULL, NULL, NULL);
1957 	vmm->bootstrapped = true;
1958 	return 0;
1959 }
1960 
1961 static void
nvkm_vmm_del(struct kref * kref)1962 nvkm_vmm_del(struct kref *kref)
1963 {
1964 	struct nvkm_vmm *vmm = container_of(kref, typeof(*vmm), kref);
1965 	nvkm_vmm_dtor(vmm);
1966 	kfree(vmm);
1967 }
1968 
1969 void
nvkm_vmm_unref(struct nvkm_vmm ** pvmm)1970 nvkm_vmm_unref(struct nvkm_vmm **pvmm)
1971 {
1972 	struct nvkm_vmm *vmm = *pvmm;
1973 	if (vmm) {
1974 		kref_put(&vmm->kref, nvkm_vmm_del);
1975 		*pvmm = NULL;
1976 	}
1977 }
1978 
1979 struct nvkm_vmm *
nvkm_vmm_ref(struct nvkm_vmm * vmm)1980 nvkm_vmm_ref(struct nvkm_vmm *vmm)
1981 {
1982 	if (vmm)
1983 		kref_get(&vmm->kref);
1984 	return vmm;
1985 }
1986 
1987 int
nvkm_vmm_new(struct nvkm_device * device,u64 addr,u64 size,void * argv,u32 argc,struct lock_class_key * key,const char * name,struct nvkm_vmm ** pvmm)1988 nvkm_vmm_new(struct nvkm_device *device, u64 addr, u64 size, void *argv,
1989 	     u32 argc, struct lock_class_key *key, const char *name,
1990 	     struct nvkm_vmm **pvmm)
1991 {
1992 	struct nvkm_mmu *mmu = device->mmu;
1993 	struct nvkm_vmm *vmm = NULL;
1994 	int ret;
1995 	ret = mmu->func->vmm.ctor(mmu, false, addr, size, argv, argc,
1996 				  key, name, &vmm);
1997 	if (ret)
1998 		nvkm_vmm_unref(&vmm);
1999 	*pvmm = vmm;
2000 	return ret;
2001 }
2002