root/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. nvkm_vmm_pt_del
  2. nvkm_vmm_pt_new
  3. nvkm_vmm_desc_type
  4. nvkm_vmm_trace
  5. nvkm_vmm_flush_mark
  6. nvkm_vmm_flush
  7. nvkm_vmm_unref_pdes
  8. nvkm_vmm_unref_sptes
  9. nvkm_vmm_unref_ptes
  10. nvkm_vmm_ref_sptes
  11. nvkm_vmm_ref_ptes
  12. nvkm_vmm_sparse_ptes
  13. nvkm_vmm_sparse_unref_ptes
  14. nvkm_vmm_sparse_ref_ptes
  15. nvkm_vmm_ref_hwpt
  16. nvkm_vmm_ref_swpt
  17. nvkm_vmm_iter
  18. nvkm_vmm_ptes_sparse_put
  19. nvkm_vmm_ptes_sparse_get
  20. nvkm_vmm_ptes_sparse
  21. nvkm_vmm_ptes_unmap_put
  22. nvkm_vmm_ptes_get_map
  23. nvkm_vmm_ptes_unmap
  24. nvkm_vmm_ptes_map
  25. nvkm_vmm_ptes_put
  26. nvkm_vmm_ptes_get
  27. nvkm_vma_new
  28. nvkm_vma_tail
  29. nvkm_vmm_free_remove
  30. nvkm_vmm_free_delete
  31. nvkm_vmm_free_insert
  32. nvkm_vmm_node_remove
  33. nvkm_vmm_node_delete
  34. nvkm_vmm_node_insert
  35. nvkm_vmm_node_search
  36. nvkm_vmm_node_merge
  37. nvkm_vmm_node_split
  38. nvkm_vma_dump
  39. nvkm_vmm_dump
  40. nvkm_vmm_dtor
  41. nvkm_vmm_ctor_managed
  42. nvkm_vmm_ctor
  43. nvkm_vmm_new_
  44. nvkm_vmm_pfn_split_merge
  45. nvkm_vmm_pfn_unmap
  46. nvkm_vmm_pfn_map
  47. nvkm_vmm_unmap_region
  48. nvkm_vmm_unmap_locked
  49. nvkm_vmm_unmap
  50. nvkm_vmm_map_valid
  51. nvkm_vmm_map_choose
  52. nvkm_vmm_map_locked
  53. nvkm_vmm_map
  54. nvkm_vmm_put_region
  55. nvkm_vmm_put_locked
  56. nvkm_vmm_put
  57. nvkm_vmm_get_locked
  58. nvkm_vmm_get
  59. nvkm_vmm_part
  60. nvkm_vmm_join
  61. nvkm_vmm_boot_ptes
  62. nvkm_vmm_boot
  63. nvkm_vmm_del
  64. nvkm_vmm_unref
  65. nvkm_vmm_ref
  66. nvkm_vmm_new

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

/* [<][>][^][v][top][bottom][index][help] */