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