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