vmm.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514
  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. #include <subdev/fb.h>
  25. static void
  26. nvkm_vmm_pt_del(struct nvkm_vmm_pt **ppgt)
  27. {
  28. struct nvkm_vmm_pt *pgt = *ppgt;
  29. if (pgt) {
  30. kvfree(pgt->pde);
  31. kfree(pgt);
  32. *ppgt = NULL;
  33. }
  34. }
  35. static struct nvkm_vmm_pt *
  36. nvkm_vmm_pt_new(const struct nvkm_vmm_desc *desc, bool sparse,
  37. const struct nvkm_vmm_page *page)
  38. {
  39. const u32 pten = 1 << desc->bits;
  40. struct nvkm_vmm_pt *pgt;
  41. u32 lpte = 0;
  42. if (desc->type > PGT) {
  43. if (desc->type == SPT) {
  44. const struct nvkm_vmm_desc *pair = page[-1].desc;
  45. lpte = pten >> (desc->bits - pair->bits);
  46. } else {
  47. lpte = pten;
  48. }
  49. }
  50. if (!(pgt = kzalloc(sizeof(*pgt) + lpte, GFP_KERNEL)))
  51. return NULL;
  52. pgt->page = page ? page->shift : 0;
  53. pgt->sparse = sparse;
  54. if (desc->type == PGD) {
  55. pgt->pde = kvcalloc(pten, sizeof(*pgt->pde), GFP_KERNEL);
  56. if (!pgt->pde) {
  57. kfree(pgt);
  58. return NULL;
  59. }
  60. }
  61. return pgt;
  62. }
  63. struct nvkm_vmm_iter {
  64. const struct nvkm_vmm_page *page;
  65. const struct nvkm_vmm_desc *desc;
  66. struct nvkm_vmm *vmm;
  67. u64 cnt;
  68. u16 max, lvl;
  69. u32 pte[NVKM_VMM_LEVELS_MAX];
  70. struct nvkm_vmm_pt *pt[NVKM_VMM_LEVELS_MAX];
  71. int flush;
  72. };
  73. #ifdef CONFIG_NOUVEAU_DEBUG_MMU
  74. static const char *
  75. nvkm_vmm_desc_type(const struct nvkm_vmm_desc *desc)
  76. {
  77. switch (desc->type) {
  78. case PGD: return "PGD";
  79. case PGT: return "PGT";
  80. case SPT: return "SPT";
  81. case LPT: return "LPT";
  82. default:
  83. return "UNKNOWN";
  84. }
  85. }
  86. static void
  87. nvkm_vmm_trace(struct nvkm_vmm_iter *it, char *buf)
  88. {
  89. int lvl;
  90. for (lvl = it->max; lvl >= 0; lvl--) {
  91. if (lvl >= it->lvl)
  92. buf += sprintf(buf, "%05x:", it->pte[lvl]);
  93. else
  94. buf += sprintf(buf, "xxxxx:");
  95. }
  96. }
  97. #define TRA(i,f,a...) do { \
  98. char _buf[NVKM_VMM_LEVELS_MAX * 7]; \
  99. struct nvkm_vmm_iter *_it = (i); \
  100. nvkm_vmm_trace(_it, _buf); \
  101. VMM_TRACE(_it->vmm, "%s "f, _buf, ##a); \
  102. } while(0)
  103. #else
  104. #define TRA(i,f,a...)
  105. #endif
  106. static inline void
  107. nvkm_vmm_flush_mark(struct nvkm_vmm_iter *it)
  108. {
  109. it->flush = min(it->flush, it->max - it->lvl);
  110. }
  111. static inline void
  112. nvkm_vmm_flush(struct nvkm_vmm_iter *it)
  113. {
  114. if (it->flush != NVKM_VMM_LEVELS_MAX) {
  115. if (it->vmm->func->flush) {
  116. TRA(it, "flush: %d", it->flush);
  117. it->vmm->func->flush(it->vmm, it->flush);
  118. }
  119. it->flush = NVKM_VMM_LEVELS_MAX;
  120. }
  121. }
  122. static void
  123. nvkm_vmm_unref_pdes(struct nvkm_vmm_iter *it)
  124. {
  125. const struct nvkm_vmm_desc *desc = it->desc;
  126. const int type = desc[it->lvl].type == SPT;
  127. struct nvkm_vmm_pt *pgd = it->pt[it->lvl + 1];
  128. struct nvkm_vmm_pt *pgt = it->pt[it->lvl];
  129. struct nvkm_mmu_pt *pt = pgt->pt[type];
  130. struct nvkm_vmm *vmm = it->vmm;
  131. u32 pdei = it->pte[it->lvl + 1];
  132. /* Recurse up the tree, unreferencing/destroying unneeded PDs. */
  133. it->lvl++;
  134. if (--pgd->refs[0]) {
  135. const struct nvkm_vmm_desc_func *func = desc[it->lvl].func;
  136. /* PD has other valid PDEs, so we need a proper update. */
  137. TRA(it, "PDE unmap %s", nvkm_vmm_desc_type(&desc[it->lvl - 1]));
  138. pgt->pt[type] = NULL;
  139. if (!pgt->refs[!type]) {
  140. /* PDE no longer required. */
  141. if (pgd->pt[0]) {
  142. if (pgt->sparse) {
  143. func->sparse(vmm, pgd->pt[0], pdei, 1);
  144. pgd->pde[pdei] = NVKM_VMM_PDE_SPARSE;
  145. } else {
  146. func->unmap(vmm, pgd->pt[0], pdei, 1);
  147. pgd->pde[pdei] = NULL;
  148. }
  149. } else {
  150. /* Special handling for Tesla-class GPUs,
  151. * where there's no central PD, but each
  152. * instance has its own embedded PD.
  153. */
  154. func->pde(vmm, pgd, pdei);
  155. pgd->pde[pdei] = NULL;
  156. }
  157. } else {
  158. /* PDE was pointing at dual-PTs and we're removing
  159. * one of them, leaving the other in place.
  160. */
  161. func->pde(vmm, pgd, pdei);
  162. }
  163. /* GPU may have cached the PTs, flush before freeing. */
  164. nvkm_vmm_flush_mark(it);
  165. nvkm_vmm_flush(it);
  166. } else {
  167. /* PD has no valid PDEs left, so we can just destroy it. */
  168. nvkm_vmm_unref_pdes(it);
  169. }
  170. /* Destroy PD/PT. */
  171. TRA(it, "PDE free %s", nvkm_vmm_desc_type(&desc[it->lvl - 1]));
  172. nvkm_mmu_ptc_put(vmm->mmu, vmm->bootstrapped, &pt);
  173. if (!pgt->refs[!type])
  174. nvkm_vmm_pt_del(&pgt);
  175. it->lvl--;
  176. }
  177. static void
  178. nvkm_vmm_unref_sptes(struct nvkm_vmm_iter *it, struct nvkm_vmm_pt *pgt,
  179. const struct nvkm_vmm_desc *desc, u32 ptei, u32 ptes)
  180. {
  181. const struct nvkm_vmm_desc *pair = it->page[-1].desc;
  182. const u32 sptb = desc->bits - pair->bits;
  183. const u32 sptn = 1 << sptb;
  184. struct nvkm_vmm *vmm = it->vmm;
  185. u32 spti = ptei & (sptn - 1), lpti, pteb;
  186. /* Determine how many SPTEs are being touched under each LPTE,
  187. * and drop reference counts.
  188. */
  189. for (lpti = ptei >> sptb; ptes; spti = 0, lpti++) {
  190. const u32 pten = min(sptn - spti, ptes);
  191. pgt->pte[lpti] -= pten;
  192. ptes -= pten;
  193. }
  194. /* We're done here if there's no corresponding LPT. */
  195. if (!pgt->refs[0])
  196. return;
  197. for (ptei = pteb = ptei >> sptb; ptei < lpti; pteb = ptei) {
  198. /* Skip over any LPTEs that still have valid SPTEs. */
  199. if (pgt->pte[pteb] & NVKM_VMM_PTE_SPTES) {
  200. for (ptes = 1, ptei++; ptei < lpti; ptes++, ptei++) {
  201. if (!(pgt->pte[ptei] & NVKM_VMM_PTE_SPTES))
  202. break;
  203. }
  204. continue;
  205. }
  206. /* As there's no more non-UNMAPPED SPTEs left in the range
  207. * covered by a number of LPTEs, the LPTEs once again take
  208. * control over their address range.
  209. *
  210. * Determine how many LPTEs need to transition state.
  211. */
  212. pgt->pte[ptei] &= ~NVKM_VMM_PTE_VALID;
  213. for (ptes = 1, ptei++; ptei < lpti; ptes++, ptei++) {
  214. if (pgt->pte[ptei] & NVKM_VMM_PTE_SPTES)
  215. break;
  216. pgt->pte[ptei] &= ~NVKM_VMM_PTE_VALID;
  217. }
  218. if (pgt->pte[pteb] & NVKM_VMM_PTE_SPARSE) {
  219. TRA(it, "LPTE %05x: U -> S %d PTEs", pteb, ptes);
  220. pair->func->sparse(vmm, pgt->pt[0], pteb, ptes);
  221. } else
  222. if (pair->func->invalid) {
  223. /* If the MMU supports it, restore the LPTE to the
  224. * INVALID state to tell the MMU there is no point
  225. * trying to fetch the corresponding SPTEs.
  226. */
  227. TRA(it, "LPTE %05x: U -> I %d PTEs", pteb, ptes);
  228. pair->func->invalid(vmm, pgt->pt[0], pteb, ptes);
  229. }
  230. }
  231. }
  232. static bool
  233. nvkm_vmm_unref_ptes(struct nvkm_vmm_iter *it, u32 ptei, u32 ptes)
  234. {
  235. const struct nvkm_vmm_desc *desc = it->desc;
  236. const int type = desc->type == SPT;
  237. struct nvkm_vmm_pt *pgt = it->pt[0];
  238. /* Drop PTE references. */
  239. pgt->refs[type] -= ptes;
  240. /* Dual-PTs need special handling, unless PDE becoming invalid. */
  241. if (desc->type == SPT && (pgt->refs[0] || pgt->refs[1]))
  242. nvkm_vmm_unref_sptes(it, pgt, desc, ptei, ptes);
  243. /* PT no longer neeed? Destroy it. */
  244. if (!pgt->refs[type]) {
  245. it->lvl++;
  246. TRA(it, "%s empty", nvkm_vmm_desc_type(desc));
  247. it->lvl--;
  248. nvkm_vmm_unref_pdes(it);
  249. return false; /* PTE writes for unmap() not necessary. */
  250. }
  251. return true;
  252. }
  253. static void
  254. nvkm_vmm_ref_sptes(struct nvkm_vmm_iter *it, struct nvkm_vmm_pt *pgt,
  255. const struct nvkm_vmm_desc *desc, u32 ptei, u32 ptes)
  256. {
  257. const struct nvkm_vmm_desc *pair = it->page[-1].desc;
  258. const u32 sptb = desc->bits - pair->bits;
  259. const u32 sptn = 1 << sptb;
  260. struct nvkm_vmm *vmm = it->vmm;
  261. u32 spti = ptei & (sptn - 1), lpti, pteb;
  262. /* Determine how many SPTEs are being touched under each LPTE,
  263. * and increase reference counts.
  264. */
  265. for (lpti = ptei >> sptb; ptes; spti = 0, lpti++) {
  266. const u32 pten = min(sptn - spti, ptes);
  267. pgt->pte[lpti] += pten;
  268. ptes -= pten;
  269. }
  270. /* We're done here if there's no corresponding LPT. */
  271. if (!pgt->refs[0])
  272. return;
  273. for (ptei = pteb = ptei >> sptb; ptei < lpti; pteb = ptei) {
  274. /* Skip over any LPTEs that already have valid SPTEs. */
  275. if (pgt->pte[pteb] & NVKM_VMM_PTE_VALID) {
  276. for (ptes = 1, ptei++; ptei < lpti; ptes++, ptei++) {
  277. if (!(pgt->pte[ptei] & NVKM_VMM_PTE_VALID))
  278. break;
  279. }
  280. continue;
  281. }
  282. /* As there are now non-UNMAPPED SPTEs in the range covered
  283. * by a number of LPTEs, we need to transfer control of the
  284. * address range to the SPTEs.
  285. *
  286. * Determine how many LPTEs need to transition state.
  287. */
  288. pgt->pte[ptei] |= NVKM_VMM_PTE_VALID;
  289. for (ptes = 1, ptei++; ptei < lpti; ptes++, ptei++) {
  290. if (pgt->pte[ptei] & NVKM_VMM_PTE_VALID)
  291. break;
  292. pgt->pte[ptei] |= NVKM_VMM_PTE_VALID;
  293. }
  294. if (pgt->pte[pteb] & NVKM_VMM_PTE_SPARSE) {
  295. const u32 spti = pteb * sptn;
  296. const u32 sptc = ptes * sptn;
  297. /* The entire LPTE is marked as sparse, we need
  298. * to make sure that the SPTEs are too.
  299. */
  300. TRA(it, "SPTE %05x: U -> S %d PTEs", spti, sptc);
  301. desc->func->sparse(vmm, pgt->pt[1], spti, sptc);
  302. /* Sparse LPTEs prevent SPTEs from being accessed. */
  303. TRA(it, "LPTE %05x: S -> U %d PTEs", pteb, ptes);
  304. pair->func->unmap(vmm, pgt->pt[0], pteb, ptes);
  305. } else
  306. if (pair->func->invalid) {
  307. /* MMU supports blocking SPTEs by marking an LPTE
  308. * as INVALID. We need to reverse that here.
  309. */
  310. TRA(it, "LPTE %05x: I -> U %d PTEs", pteb, ptes);
  311. pair->func->unmap(vmm, pgt->pt[0], pteb, ptes);
  312. }
  313. }
  314. }
  315. static bool
  316. nvkm_vmm_ref_ptes(struct nvkm_vmm_iter *it, u32 ptei, u32 ptes)
  317. {
  318. const struct nvkm_vmm_desc *desc = it->desc;
  319. const int type = desc->type == SPT;
  320. struct nvkm_vmm_pt *pgt = it->pt[0];
  321. /* Take PTE references. */
  322. pgt->refs[type] += ptes;
  323. /* Dual-PTs need special handling. */
  324. if (desc->type == SPT)
  325. nvkm_vmm_ref_sptes(it, pgt, desc, ptei, ptes);
  326. return true;
  327. }
  328. static void
  329. nvkm_vmm_sparse_ptes(const struct nvkm_vmm_desc *desc,
  330. struct nvkm_vmm_pt *pgt, u32 ptei, u32 ptes)
  331. {
  332. if (desc->type == PGD) {
  333. while (ptes--)
  334. pgt->pde[ptei++] = NVKM_VMM_PDE_SPARSE;
  335. } else
  336. if (desc->type == LPT) {
  337. memset(&pgt->pte[ptei], NVKM_VMM_PTE_SPARSE, ptes);
  338. }
  339. }
  340. static bool
  341. nvkm_vmm_sparse_unref_ptes(struct nvkm_vmm_iter *it, u32 ptei, u32 ptes)
  342. {
  343. struct nvkm_vmm_pt *pt = it->pt[0];
  344. if (it->desc->type == PGD)
  345. memset(&pt->pde[ptei], 0x00, sizeof(pt->pde[0]) * ptes);
  346. else
  347. if (it->desc->type == LPT)
  348. memset(&pt->pte[ptei], 0x00, sizeof(pt->pte[0]) * ptes);
  349. return nvkm_vmm_unref_ptes(it, ptei, ptes);
  350. }
  351. static bool
  352. nvkm_vmm_sparse_ref_ptes(struct nvkm_vmm_iter *it, u32 ptei, u32 ptes)
  353. {
  354. nvkm_vmm_sparse_ptes(it->desc, it->pt[0], ptei, ptes);
  355. return nvkm_vmm_ref_ptes(it, ptei, ptes);
  356. }
  357. static bool
  358. nvkm_vmm_ref_hwpt(struct nvkm_vmm_iter *it, struct nvkm_vmm_pt *pgd, u32 pdei)
  359. {
  360. const struct nvkm_vmm_desc *desc = &it->desc[it->lvl - 1];
  361. const int type = desc->type == SPT;
  362. struct nvkm_vmm_pt *pgt = pgd->pde[pdei];
  363. const bool zero = !pgt->sparse && !desc->func->invalid;
  364. struct nvkm_vmm *vmm = it->vmm;
  365. struct nvkm_mmu *mmu = vmm->mmu;
  366. struct nvkm_mmu_pt *pt;
  367. u32 pten = 1 << desc->bits;
  368. u32 pteb, ptei, ptes;
  369. u32 size = desc->size * pten;
  370. pgd->refs[0]++;
  371. pgt->pt[type] = nvkm_mmu_ptc_get(mmu, size, desc->align, zero);
  372. if (!pgt->pt[type]) {
  373. it->lvl--;
  374. nvkm_vmm_unref_pdes(it);
  375. return false;
  376. }
  377. if (zero)
  378. goto done;
  379. pt = pgt->pt[type];
  380. if (desc->type == LPT && pgt->refs[1]) {
  381. /* SPT already exists covering the same range as this LPT,
  382. * which means we need to be careful that any LPTEs which
  383. * overlap valid SPTEs are unmapped as opposed to invalid
  384. * or sparse, which would prevent the MMU from looking at
  385. * the SPTEs on some GPUs.
  386. */
  387. for (ptei = pteb = 0; ptei < pten; pteb = ptei) {
  388. bool spte = pgt->pte[ptei] & NVKM_VMM_PTE_SPTES;
  389. for (ptes = 1, ptei++; ptei < pten; ptes++, ptei++) {
  390. bool next = pgt->pte[ptei] & NVKM_VMM_PTE_SPTES;
  391. if (spte != next)
  392. break;
  393. }
  394. if (!spte) {
  395. if (pgt->sparse)
  396. desc->func->sparse(vmm, pt, pteb, ptes);
  397. else
  398. desc->func->invalid(vmm, pt, pteb, ptes);
  399. memset(&pgt->pte[pteb], 0x00, ptes);
  400. } else {
  401. desc->func->unmap(vmm, pt, pteb, ptes);
  402. while (ptes--)
  403. pgt->pte[pteb++] |= NVKM_VMM_PTE_VALID;
  404. }
  405. }
  406. } else {
  407. if (pgt->sparse) {
  408. nvkm_vmm_sparse_ptes(desc, pgt, 0, pten);
  409. desc->func->sparse(vmm, pt, 0, pten);
  410. } else {
  411. desc->func->invalid(vmm, pt, 0, pten);
  412. }
  413. }
  414. done:
  415. TRA(it, "PDE write %s", nvkm_vmm_desc_type(desc));
  416. it->desc[it->lvl].func->pde(it->vmm, pgd, pdei);
  417. nvkm_vmm_flush_mark(it);
  418. return true;
  419. }
  420. static bool
  421. nvkm_vmm_ref_swpt(struct nvkm_vmm_iter *it, struct nvkm_vmm_pt *pgd, u32 pdei)
  422. {
  423. const struct nvkm_vmm_desc *desc = &it->desc[it->lvl - 1];
  424. struct nvkm_vmm_pt *pgt = pgd->pde[pdei];
  425. pgt = nvkm_vmm_pt_new(desc, NVKM_VMM_PDE_SPARSED(pgt), it->page);
  426. if (!pgt) {
  427. if (!pgd->refs[0])
  428. nvkm_vmm_unref_pdes(it);
  429. return false;
  430. }
  431. pgd->pde[pdei] = pgt;
  432. return true;
  433. }
  434. static inline u64
  435. nvkm_vmm_iter(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  436. u64 addr, u64 size, const char *name, bool ref,
  437. bool (*REF_PTES)(struct nvkm_vmm_iter *, u32, u32),
  438. nvkm_vmm_pte_func MAP_PTES, struct nvkm_vmm_map *map,
  439. nvkm_vmm_pxe_func CLR_PTES)
  440. {
  441. const struct nvkm_vmm_desc *desc = page->desc;
  442. struct nvkm_vmm_iter it;
  443. u64 bits = addr >> page->shift;
  444. it.page = page;
  445. it.desc = desc;
  446. it.vmm = vmm;
  447. it.cnt = size >> page->shift;
  448. it.flush = NVKM_VMM_LEVELS_MAX;
  449. /* Deconstruct address into PTE indices for each mapping level. */
  450. for (it.lvl = 0; desc[it.lvl].bits; it.lvl++) {
  451. it.pte[it.lvl] = bits & ((1 << desc[it.lvl].bits) - 1);
  452. bits >>= desc[it.lvl].bits;
  453. }
  454. it.max = --it.lvl;
  455. it.pt[it.max] = vmm->pd;
  456. it.lvl = 0;
  457. TRA(&it, "%s: %016llx %016llx %d %lld PTEs", name,
  458. addr, size, page->shift, it.cnt);
  459. it.lvl = it.max;
  460. /* Depth-first traversal of page tables. */
  461. while (it.cnt) {
  462. struct nvkm_vmm_pt *pgt = it.pt[it.lvl];
  463. const int type = desc->type == SPT;
  464. const u32 pten = 1 << desc->bits;
  465. const u32 ptei = it.pte[0];
  466. const u32 ptes = min_t(u64, it.cnt, pten - ptei);
  467. /* Walk down the tree, finding page tables for each level. */
  468. for (; it.lvl; it.lvl--) {
  469. const u32 pdei = it.pte[it.lvl];
  470. struct nvkm_vmm_pt *pgd = pgt;
  471. /* Software PT. */
  472. if (ref && NVKM_VMM_PDE_INVALID(pgd->pde[pdei])) {
  473. if (!nvkm_vmm_ref_swpt(&it, pgd, pdei))
  474. goto fail;
  475. }
  476. it.pt[it.lvl - 1] = pgt = pgd->pde[pdei];
  477. /* Hardware PT.
  478. *
  479. * This is a separate step from above due to GF100 and
  480. * newer having dual page tables at some levels, which
  481. * are refcounted independently.
  482. */
  483. if (ref && !pgt->refs[desc[it.lvl - 1].type == SPT]) {
  484. if (!nvkm_vmm_ref_hwpt(&it, pgd, pdei))
  485. goto fail;
  486. }
  487. }
  488. /* Handle PTE updates. */
  489. if (!REF_PTES || REF_PTES(&it, ptei, ptes)) {
  490. struct nvkm_mmu_pt *pt = pgt->pt[type];
  491. if (MAP_PTES || CLR_PTES) {
  492. if (MAP_PTES)
  493. MAP_PTES(vmm, pt, ptei, ptes, map);
  494. else
  495. CLR_PTES(vmm, pt, ptei, ptes);
  496. nvkm_vmm_flush_mark(&it);
  497. }
  498. }
  499. /* Walk back up the tree to the next position. */
  500. it.pte[it.lvl] += ptes;
  501. it.cnt -= ptes;
  502. if (it.cnt) {
  503. while (it.pte[it.lvl] == (1 << desc[it.lvl].bits)) {
  504. it.pte[it.lvl++] = 0;
  505. it.pte[it.lvl]++;
  506. }
  507. }
  508. };
  509. nvkm_vmm_flush(&it);
  510. return ~0ULL;
  511. fail:
  512. /* Reconstruct the failure address so the caller is able to
  513. * reverse any partially completed operations.
  514. */
  515. addr = it.pte[it.max--];
  516. do {
  517. addr = addr << desc[it.max].bits;
  518. addr |= it.pte[it.max];
  519. } while (it.max--);
  520. return addr << page->shift;
  521. }
  522. static void
  523. nvkm_vmm_ptes_sparse_put(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  524. u64 addr, u64 size)
  525. {
  526. nvkm_vmm_iter(vmm, page, addr, size, "sparse unref", false,
  527. nvkm_vmm_sparse_unref_ptes, NULL, NULL,
  528. page->desc->func->invalid ?
  529. page->desc->func->invalid : page->desc->func->unmap);
  530. }
  531. static int
  532. nvkm_vmm_ptes_sparse_get(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  533. u64 addr, u64 size)
  534. {
  535. if ((page->type & NVKM_VMM_PAGE_SPARSE)) {
  536. u64 fail = nvkm_vmm_iter(vmm, page, addr, size, "sparse ref",
  537. true, nvkm_vmm_sparse_ref_ptes, NULL,
  538. NULL, page->desc->func->sparse);
  539. if (fail != ~0ULL) {
  540. if ((size = fail - addr))
  541. nvkm_vmm_ptes_sparse_put(vmm, page, addr, size);
  542. return -ENOMEM;
  543. }
  544. return 0;
  545. }
  546. return -EINVAL;
  547. }
  548. static int
  549. nvkm_vmm_ptes_sparse(struct nvkm_vmm *vmm, u64 addr, u64 size, bool ref)
  550. {
  551. const struct nvkm_vmm_page *page = vmm->func->page;
  552. int m = 0, i;
  553. u64 start = addr;
  554. u64 block;
  555. while (size) {
  556. /* Limit maximum page size based on remaining size. */
  557. while (size < (1ULL << page[m].shift))
  558. m++;
  559. i = m;
  560. /* Find largest page size suitable for alignment. */
  561. while (!IS_ALIGNED(addr, 1ULL << page[i].shift))
  562. i++;
  563. /* Determine number of PTEs at this page size. */
  564. if (i != m) {
  565. /* Limited to alignment boundary of next page size. */
  566. u64 next = 1ULL << page[i - 1].shift;
  567. u64 part = ALIGN(addr, next) - addr;
  568. if (size - part >= next)
  569. block = (part >> page[i].shift) << page[i].shift;
  570. else
  571. block = (size >> page[i].shift) << page[i].shift;
  572. } else {
  573. block = (size >> page[i].shift) << page[i].shift;
  574. }
  575. /* Perform operation. */
  576. if (ref) {
  577. int ret = nvkm_vmm_ptes_sparse_get(vmm, &page[i], addr, block);
  578. if (ret) {
  579. if ((size = addr - start))
  580. nvkm_vmm_ptes_sparse(vmm, start, size, false);
  581. return ret;
  582. }
  583. } else {
  584. nvkm_vmm_ptes_sparse_put(vmm, &page[i], addr, block);
  585. }
  586. size -= block;
  587. addr += block;
  588. }
  589. return 0;
  590. }
  591. static void
  592. nvkm_vmm_ptes_unmap_put(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  593. u64 addr, u64 size, bool sparse)
  594. {
  595. const struct nvkm_vmm_desc_func *func = page->desc->func;
  596. nvkm_vmm_iter(vmm, page, addr, size, "unmap + unref",
  597. false, nvkm_vmm_unref_ptes, NULL, NULL,
  598. sparse ? func->sparse : func->invalid ? func->invalid :
  599. func->unmap);
  600. }
  601. static int
  602. nvkm_vmm_ptes_get_map(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  603. u64 addr, u64 size, struct nvkm_vmm_map *map,
  604. nvkm_vmm_pte_func func)
  605. {
  606. u64 fail = nvkm_vmm_iter(vmm, page, addr, size, "ref + map", true,
  607. nvkm_vmm_ref_ptes, func, map, NULL);
  608. if (fail != ~0ULL) {
  609. if ((size = fail - addr))
  610. nvkm_vmm_ptes_unmap_put(vmm, page, addr, size, false);
  611. return -ENOMEM;
  612. }
  613. return 0;
  614. }
  615. static void
  616. nvkm_vmm_ptes_unmap(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  617. u64 addr, u64 size, bool sparse)
  618. {
  619. const struct nvkm_vmm_desc_func *func = page->desc->func;
  620. nvkm_vmm_iter(vmm, page, addr, size, "unmap", false, NULL, NULL, NULL,
  621. sparse ? func->sparse : func->invalid ? func->invalid :
  622. func->unmap);
  623. }
  624. static void
  625. nvkm_vmm_ptes_map(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  626. u64 addr, u64 size, struct nvkm_vmm_map *map,
  627. nvkm_vmm_pte_func func)
  628. {
  629. nvkm_vmm_iter(vmm, page, addr, size, "map", false,
  630. NULL, func, map, NULL);
  631. }
  632. static void
  633. nvkm_vmm_ptes_put(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  634. u64 addr, u64 size)
  635. {
  636. nvkm_vmm_iter(vmm, page, addr, size, "unref", false,
  637. nvkm_vmm_unref_ptes, NULL, NULL, NULL);
  638. }
  639. static int
  640. nvkm_vmm_ptes_get(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
  641. u64 addr, u64 size)
  642. {
  643. u64 fail = nvkm_vmm_iter(vmm, page, addr, size, "ref", true,
  644. nvkm_vmm_ref_ptes, NULL, NULL, NULL);
  645. if (fail != ~0ULL) {
  646. if (fail != addr)
  647. nvkm_vmm_ptes_put(vmm, page, addr, fail - addr);
  648. return -ENOMEM;
  649. }
  650. return 0;
  651. }
  652. static inline struct nvkm_vma *
  653. nvkm_vma_new(u64 addr, u64 size)
  654. {
  655. struct nvkm_vma *vma = kzalloc(sizeof(*vma), GFP_KERNEL);
  656. if (vma) {
  657. vma->addr = addr;
  658. vma->size = size;
  659. vma->page = NVKM_VMA_PAGE_NONE;
  660. vma->refd = NVKM_VMA_PAGE_NONE;
  661. }
  662. return vma;
  663. }
  664. struct nvkm_vma *
  665. nvkm_vma_tail(struct nvkm_vma *vma, u64 tail)
  666. {
  667. struct nvkm_vma *new;
  668. BUG_ON(vma->size == tail);
  669. if (!(new = nvkm_vma_new(vma->addr + (vma->size - tail), tail)))
  670. return NULL;
  671. vma->size -= tail;
  672. new->mapref = vma->mapref;
  673. new->sparse = vma->sparse;
  674. new->page = vma->page;
  675. new->refd = vma->refd;
  676. new->used = vma->used;
  677. new->part = vma->part;
  678. new->user = vma->user;
  679. new->busy = vma->busy;
  680. list_add(&new->head, &vma->head);
  681. return new;
  682. }
  683. static void
  684. nvkm_vmm_free_insert(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
  685. {
  686. struct rb_node **ptr = &vmm->free.rb_node;
  687. struct rb_node *parent = NULL;
  688. while (*ptr) {
  689. struct nvkm_vma *this = rb_entry(*ptr, typeof(*this), tree);
  690. parent = *ptr;
  691. if (vma->size < this->size)
  692. ptr = &parent->rb_left;
  693. else
  694. if (vma->size > this->size)
  695. ptr = &parent->rb_right;
  696. else
  697. if (vma->addr < this->addr)
  698. ptr = &parent->rb_left;
  699. else
  700. if (vma->addr > this->addr)
  701. ptr = &parent->rb_right;
  702. else
  703. BUG();
  704. }
  705. rb_link_node(&vma->tree, parent, ptr);
  706. rb_insert_color(&vma->tree, &vmm->free);
  707. }
  708. void
  709. nvkm_vmm_node_insert(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
  710. {
  711. struct rb_node **ptr = &vmm->root.rb_node;
  712. struct rb_node *parent = NULL;
  713. while (*ptr) {
  714. struct nvkm_vma *this = rb_entry(*ptr, typeof(*this), tree);
  715. parent = *ptr;
  716. if (vma->addr < this->addr)
  717. ptr = &parent->rb_left;
  718. else
  719. if (vma->addr > this->addr)
  720. ptr = &parent->rb_right;
  721. else
  722. BUG();
  723. }
  724. rb_link_node(&vma->tree, parent, ptr);
  725. rb_insert_color(&vma->tree, &vmm->root);
  726. }
  727. struct nvkm_vma *
  728. nvkm_vmm_node_search(struct nvkm_vmm *vmm, u64 addr)
  729. {
  730. struct rb_node *node = vmm->root.rb_node;
  731. while (node) {
  732. struct nvkm_vma *vma = rb_entry(node, typeof(*vma), tree);
  733. if (addr < vma->addr)
  734. node = node->rb_left;
  735. else
  736. if (addr >= vma->addr + vma->size)
  737. node = node->rb_right;
  738. else
  739. return vma;
  740. }
  741. return NULL;
  742. }
  743. static void
  744. nvkm_vmm_dtor(struct nvkm_vmm *vmm)
  745. {
  746. struct nvkm_vma *vma;
  747. struct rb_node *node;
  748. while ((node = rb_first(&vmm->root))) {
  749. struct nvkm_vma *vma = rb_entry(node, typeof(*vma), tree);
  750. nvkm_vmm_put(vmm, &vma);
  751. }
  752. if (vmm->bootstrapped) {
  753. const struct nvkm_vmm_page *page = vmm->func->page;
  754. const u64 limit = vmm->limit - vmm->start;
  755. while (page[1].shift)
  756. page++;
  757. nvkm_mmu_ptc_dump(vmm->mmu);
  758. nvkm_vmm_ptes_put(vmm, page, vmm->start, limit);
  759. }
  760. vma = list_first_entry(&vmm->list, typeof(*vma), head);
  761. list_del(&vma->head);
  762. kfree(vma);
  763. WARN_ON(!list_empty(&vmm->list));
  764. if (vmm->nullp) {
  765. dma_free_coherent(vmm->mmu->subdev.device->dev, 16 * 1024,
  766. vmm->nullp, vmm->null);
  767. }
  768. if (vmm->pd) {
  769. nvkm_mmu_ptc_put(vmm->mmu, true, &vmm->pd->pt[0]);
  770. nvkm_vmm_pt_del(&vmm->pd);
  771. }
  772. }
  773. int
  774. nvkm_vmm_ctor(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
  775. u32 pd_header, u64 addr, u64 size, struct lock_class_key *key,
  776. const char *name, struct nvkm_vmm *vmm)
  777. {
  778. static struct lock_class_key _key;
  779. const struct nvkm_vmm_page *page = func->page;
  780. const struct nvkm_vmm_desc *desc;
  781. struct nvkm_vma *vma;
  782. int levels, bits = 0;
  783. vmm->func = func;
  784. vmm->mmu = mmu;
  785. vmm->name = name;
  786. vmm->debug = mmu->subdev.debug;
  787. kref_init(&vmm->kref);
  788. __mutex_init(&vmm->mutex, "&vmm->mutex", key ? key : &_key);
  789. /* Locate the smallest page size supported by the backend, it will
  790. * have the the deepest nesting of page tables.
  791. */
  792. while (page[1].shift)
  793. page++;
  794. /* Locate the structure that describes the layout of the top-level
  795. * page table, and determine the number of valid bits in a virtual
  796. * address.
  797. */
  798. for (levels = 0, desc = page->desc; desc->bits; desc++, levels++)
  799. bits += desc->bits;
  800. bits += page->shift;
  801. desc--;
  802. if (WARN_ON(levels > NVKM_VMM_LEVELS_MAX))
  803. return -EINVAL;
  804. vmm->start = addr;
  805. vmm->limit = size ? (addr + size) : (1ULL << bits);
  806. if (vmm->start > vmm->limit || vmm->limit > (1ULL << bits))
  807. return -EINVAL;
  808. /* Allocate top-level page table. */
  809. vmm->pd = nvkm_vmm_pt_new(desc, false, NULL);
  810. if (!vmm->pd)
  811. return -ENOMEM;
  812. vmm->pd->refs[0] = 1;
  813. INIT_LIST_HEAD(&vmm->join);
  814. /* ... and the GPU storage for it, except on Tesla-class GPUs that
  815. * have the PD embedded in the instance structure.
  816. */
  817. if (desc->size) {
  818. const u32 size = pd_header + desc->size * (1 << desc->bits);
  819. vmm->pd->pt[0] = nvkm_mmu_ptc_get(mmu, size, desc->align, true);
  820. if (!vmm->pd->pt[0])
  821. return -ENOMEM;
  822. }
  823. /* Initialise address-space MM. */
  824. INIT_LIST_HEAD(&vmm->list);
  825. vmm->free = RB_ROOT;
  826. vmm->root = RB_ROOT;
  827. if (!(vma = nvkm_vma_new(vmm->start, vmm->limit - vmm->start)))
  828. return -ENOMEM;
  829. nvkm_vmm_free_insert(vmm, vma);
  830. list_add(&vma->head, &vmm->list);
  831. return 0;
  832. }
  833. int
  834. nvkm_vmm_new_(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
  835. u32 hdr, u64 addr, u64 size, struct lock_class_key *key,
  836. const char *name, struct nvkm_vmm **pvmm)
  837. {
  838. if (!(*pvmm = kzalloc(sizeof(**pvmm), GFP_KERNEL)))
  839. return -ENOMEM;
  840. return nvkm_vmm_ctor(func, mmu, hdr, addr, size, key, name, *pvmm);
  841. }
  842. #define node(root, dir) ((root)->head.dir == &vmm->list) ? NULL : \
  843. list_entry((root)->head.dir, struct nvkm_vma, head)
  844. void
  845. nvkm_vmm_unmap_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
  846. {
  847. struct nvkm_vma *next;
  848. nvkm_memory_tags_put(vma->memory, vmm->mmu->subdev.device, &vma->tags);
  849. nvkm_memory_unref(&vma->memory);
  850. if (vma->part) {
  851. struct nvkm_vma *prev = node(vma, prev);
  852. if (!prev->memory) {
  853. prev->size += vma->size;
  854. rb_erase(&vma->tree, &vmm->root);
  855. list_del(&vma->head);
  856. kfree(vma);
  857. vma = prev;
  858. }
  859. }
  860. next = node(vma, next);
  861. if (next && next->part) {
  862. if (!next->memory) {
  863. vma->size += next->size;
  864. rb_erase(&next->tree, &vmm->root);
  865. list_del(&next->head);
  866. kfree(next);
  867. }
  868. }
  869. }
  870. void
  871. nvkm_vmm_unmap_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
  872. {
  873. const struct nvkm_vmm_page *page = &vmm->func->page[vma->refd];
  874. if (vma->mapref) {
  875. nvkm_vmm_ptes_unmap_put(vmm, page, vma->addr, vma->size, vma->sparse);
  876. vma->refd = NVKM_VMA_PAGE_NONE;
  877. } else {
  878. nvkm_vmm_ptes_unmap(vmm, page, vma->addr, vma->size, vma->sparse);
  879. }
  880. nvkm_vmm_unmap_region(vmm, vma);
  881. }
  882. void
  883. nvkm_vmm_unmap(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
  884. {
  885. if (vma->memory) {
  886. mutex_lock(&vmm->mutex);
  887. nvkm_vmm_unmap_locked(vmm, vma);
  888. mutex_unlock(&vmm->mutex);
  889. }
  890. }
  891. static int
  892. nvkm_vmm_map_valid(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
  893. void *argv, u32 argc, struct nvkm_vmm_map *map)
  894. {
  895. switch (nvkm_memory_target(map->memory)) {
  896. case NVKM_MEM_TARGET_VRAM:
  897. if (!(map->page->type & NVKM_VMM_PAGE_VRAM)) {
  898. VMM_DEBUG(vmm, "%d !VRAM", map->page->shift);
  899. return -EINVAL;
  900. }
  901. break;
  902. case NVKM_MEM_TARGET_HOST:
  903. case NVKM_MEM_TARGET_NCOH:
  904. if (!(map->page->type & NVKM_VMM_PAGE_HOST)) {
  905. VMM_DEBUG(vmm, "%d !HOST", map->page->shift);
  906. return -EINVAL;
  907. }
  908. break;
  909. default:
  910. WARN_ON(1);
  911. return -ENOSYS;
  912. }
  913. if (!IS_ALIGNED( vma->addr, 1ULL << map->page->shift) ||
  914. !IS_ALIGNED((u64)vma->size, 1ULL << map->page->shift) ||
  915. !IS_ALIGNED( map->offset, 1ULL << map->page->shift) ||
  916. nvkm_memory_page(map->memory) < map->page->shift) {
  917. VMM_DEBUG(vmm, "alignment %016llx %016llx %016llx %d %d",
  918. vma->addr, (u64)vma->size, map->offset, map->page->shift,
  919. nvkm_memory_page(map->memory));
  920. return -EINVAL;
  921. }
  922. return vmm->func->valid(vmm, argv, argc, map);
  923. }
  924. static int
  925. nvkm_vmm_map_choose(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
  926. void *argv, u32 argc, struct nvkm_vmm_map *map)
  927. {
  928. for (map->page = vmm->func->page; map->page->shift; map->page++) {
  929. VMM_DEBUG(vmm, "trying %d", map->page->shift);
  930. if (!nvkm_vmm_map_valid(vmm, vma, argv, argc, map))
  931. return 0;
  932. }
  933. return -EINVAL;
  934. }
  935. static int
  936. nvkm_vmm_map_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
  937. void *argv, u32 argc, struct nvkm_vmm_map *map)
  938. {
  939. nvkm_vmm_pte_func func;
  940. int ret;
  941. /* Make sure we won't overrun the end of the memory object. */
  942. if (unlikely(nvkm_memory_size(map->memory) < map->offset + vma->size)) {
  943. VMM_DEBUG(vmm, "overrun %016llx %016llx %016llx",
  944. nvkm_memory_size(map->memory),
  945. map->offset, (u64)vma->size);
  946. return -EINVAL;
  947. }
  948. /* Check remaining arguments for validity. */
  949. if (vma->page == NVKM_VMA_PAGE_NONE &&
  950. vma->refd == NVKM_VMA_PAGE_NONE) {
  951. /* Find the largest page size we can perform the mapping at. */
  952. const u32 debug = vmm->debug;
  953. vmm->debug = 0;
  954. ret = nvkm_vmm_map_choose(vmm, vma, argv, argc, map);
  955. vmm->debug = debug;
  956. if (ret) {
  957. VMM_DEBUG(vmm, "invalid at any page size");
  958. nvkm_vmm_map_choose(vmm, vma, argv, argc, map);
  959. return -EINVAL;
  960. }
  961. } else {
  962. /* Page size of the VMA is already pre-determined. */
  963. if (vma->refd != NVKM_VMA_PAGE_NONE)
  964. map->page = &vmm->func->page[vma->refd];
  965. else
  966. map->page = &vmm->func->page[vma->page];
  967. ret = nvkm_vmm_map_valid(vmm, vma, argv, argc, map);
  968. if (ret) {
  969. VMM_DEBUG(vmm, "invalid %d\n", ret);
  970. return ret;
  971. }
  972. }
  973. /* Deal with the 'offset' argument, and fetch the backend function. */
  974. map->off = map->offset;
  975. if (map->mem) {
  976. for (; map->off; map->mem = map->mem->next) {
  977. u64 size = (u64)map->mem->length << NVKM_RAM_MM_SHIFT;
  978. if (size > map->off)
  979. break;
  980. map->off -= size;
  981. }
  982. func = map->page->desc->func->mem;
  983. } else
  984. if (map->sgl) {
  985. for (; map->off; map->sgl = sg_next(map->sgl)) {
  986. u64 size = sg_dma_len(map->sgl);
  987. if (size > map->off)
  988. break;
  989. map->off -= size;
  990. }
  991. func = map->page->desc->func->sgl;
  992. } else {
  993. map->dma += map->offset >> PAGE_SHIFT;
  994. map->off = map->offset & PAGE_MASK;
  995. func = map->page->desc->func->dma;
  996. }
  997. /* Perform the map. */
  998. if (vma->refd == NVKM_VMA_PAGE_NONE) {
  999. ret = nvkm_vmm_ptes_get_map(vmm, map->page, vma->addr, vma->size, map, func);
  1000. if (ret)
  1001. return ret;
  1002. vma->refd = map->page - vmm->func->page;
  1003. } else {
  1004. nvkm_vmm_ptes_map(vmm, map->page, vma->addr, vma->size, map, func);
  1005. }
  1006. nvkm_memory_tags_put(vma->memory, vmm->mmu->subdev.device, &vma->tags);
  1007. nvkm_memory_unref(&vma->memory);
  1008. vma->memory = nvkm_memory_ref(map->memory);
  1009. vma->tags = map->tags;
  1010. return 0;
  1011. }
  1012. int
  1013. nvkm_vmm_map(struct nvkm_vmm *vmm, struct nvkm_vma *vma, void *argv, u32 argc,
  1014. struct nvkm_vmm_map *map)
  1015. {
  1016. int ret;
  1017. mutex_lock(&vmm->mutex);
  1018. ret = nvkm_vmm_map_locked(vmm, vma, argv, argc, map);
  1019. vma->busy = false;
  1020. mutex_unlock(&vmm->mutex);
  1021. return ret;
  1022. }
  1023. static void
  1024. nvkm_vmm_put_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
  1025. {
  1026. struct nvkm_vma *prev, *next;
  1027. if ((prev = node(vma, prev)) && !prev->used) {
  1028. rb_erase(&prev->tree, &vmm->free);
  1029. list_del(&prev->head);
  1030. vma->addr = prev->addr;
  1031. vma->size += prev->size;
  1032. kfree(prev);
  1033. }
  1034. if ((next = node(vma, next)) && !next->used) {
  1035. rb_erase(&next->tree, &vmm->free);
  1036. list_del(&next->head);
  1037. vma->size += next->size;
  1038. kfree(next);
  1039. }
  1040. nvkm_vmm_free_insert(vmm, vma);
  1041. }
  1042. void
  1043. nvkm_vmm_put_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
  1044. {
  1045. const struct nvkm_vmm_page *page = vmm->func->page;
  1046. struct nvkm_vma *next = vma;
  1047. BUG_ON(vma->part);
  1048. if (vma->mapref || !vma->sparse) {
  1049. do {
  1050. const bool map = next->memory != NULL;
  1051. const u8 refd = next->refd;
  1052. const u64 addr = next->addr;
  1053. u64 size = next->size;
  1054. /* Merge regions that are in the same state. */
  1055. while ((next = node(next, next)) && next->part &&
  1056. (next->memory != NULL) == map &&
  1057. (next->refd == refd))
  1058. size += next->size;
  1059. if (map) {
  1060. /* Region(s) are mapped, merge the unmap
  1061. * and dereference into a single walk of
  1062. * the page tree.
  1063. */
  1064. nvkm_vmm_ptes_unmap_put(vmm, &page[refd], addr,
  1065. size, vma->sparse);
  1066. } else
  1067. if (refd != NVKM_VMA_PAGE_NONE) {
  1068. /* Drop allocation-time PTE references. */
  1069. nvkm_vmm_ptes_put(vmm, &page[refd], addr, size);
  1070. }
  1071. } while (next && next->part);
  1072. }
  1073. /* Merge any mapped regions that were split from the initial
  1074. * address-space allocation back into the allocated VMA, and
  1075. * release memory/compression resources.
  1076. */
  1077. next = vma;
  1078. do {
  1079. if (next->memory)
  1080. nvkm_vmm_unmap_region(vmm, next);
  1081. } while ((next = node(vma, next)) && next->part);
  1082. if (vma->sparse && !vma->mapref) {
  1083. /* Sparse region that was allocated with a fixed page size,
  1084. * meaning all relevant PTEs were referenced once when the
  1085. * region was allocated, and remained that way, regardless
  1086. * of whether memory was mapped into it afterwards.
  1087. *
  1088. * The process of unmapping, unsparsing, and dereferencing
  1089. * PTEs can be done in a single page tree walk.
  1090. */
  1091. nvkm_vmm_ptes_sparse_put(vmm, &page[vma->refd], vma->addr, vma->size);
  1092. } else
  1093. if (vma->sparse) {
  1094. /* Sparse region that wasn't allocated with a fixed page size,
  1095. * PTE references were taken both at allocation time (to make
  1096. * the GPU see the region as sparse), and when mapping memory
  1097. * into the region.
  1098. *
  1099. * The latter was handled above, and the remaining references
  1100. * are dealt with here.
  1101. */
  1102. nvkm_vmm_ptes_sparse(vmm, vma->addr, vma->size, false);
  1103. }
  1104. /* Remove VMA from the list of allocated nodes. */
  1105. rb_erase(&vma->tree, &vmm->root);
  1106. /* Merge VMA back into the free list. */
  1107. vma->page = NVKM_VMA_PAGE_NONE;
  1108. vma->refd = NVKM_VMA_PAGE_NONE;
  1109. vma->used = false;
  1110. vma->user = false;
  1111. nvkm_vmm_put_region(vmm, vma);
  1112. }
  1113. void
  1114. nvkm_vmm_put(struct nvkm_vmm *vmm, struct nvkm_vma **pvma)
  1115. {
  1116. struct nvkm_vma *vma = *pvma;
  1117. if (vma) {
  1118. mutex_lock(&vmm->mutex);
  1119. nvkm_vmm_put_locked(vmm, vma);
  1120. mutex_unlock(&vmm->mutex);
  1121. *pvma = NULL;
  1122. }
  1123. }
  1124. int
  1125. nvkm_vmm_get_locked(struct nvkm_vmm *vmm, bool getref, bool mapref, bool sparse,
  1126. u8 shift, u8 align, u64 size, struct nvkm_vma **pvma)
  1127. {
  1128. const struct nvkm_vmm_page *page = &vmm->func->page[NVKM_VMA_PAGE_NONE];
  1129. struct rb_node *node = NULL, *temp;
  1130. struct nvkm_vma *vma = NULL, *tmp;
  1131. u64 addr, tail;
  1132. int ret;
  1133. VMM_TRACE(vmm, "getref %d mapref %d sparse %d "
  1134. "shift: %d align: %d size: %016llx",
  1135. getref, mapref, sparse, shift, align, size);
  1136. /* Zero-sized, or lazily-allocated sparse VMAs, make no sense. */
  1137. if (unlikely(!size || (!getref && !mapref && sparse))) {
  1138. VMM_DEBUG(vmm, "args %016llx %d %d %d",
  1139. size, getref, mapref, sparse);
  1140. return -EINVAL;
  1141. }
  1142. /* Tesla-class GPUs can only select page size per-PDE, which means
  1143. * we're required to know the mapping granularity up-front to find
  1144. * a suitable region of address-space.
  1145. *
  1146. * The same goes if we're requesting up-front allocation of PTES.
  1147. */
  1148. if (unlikely((getref || vmm->func->page_block) && !shift)) {
  1149. VMM_DEBUG(vmm, "page size required: %d %016llx",
  1150. getref, vmm->func->page_block);
  1151. return -EINVAL;
  1152. }
  1153. /* If a specific page size was requested, determine its index and
  1154. * make sure the requested size is a multiple of the page size.
  1155. */
  1156. if (shift) {
  1157. for (page = vmm->func->page; page->shift; page++) {
  1158. if (shift == page->shift)
  1159. break;
  1160. }
  1161. if (!page->shift || !IS_ALIGNED(size, 1ULL << page->shift)) {
  1162. VMM_DEBUG(vmm, "page %d %016llx", shift, size);
  1163. return -EINVAL;
  1164. }
  1165. align = max_t(u8, align, shift);
  1166. } else {
  1167. align = max_t(u8, align, 12);
  1168. }
  1169. /* Locate smallest block that can possibly satisfy the allocation. */
  1170. temp = vmm->free.rb_node;
  1171. while (temp) {
  1172. struct nvkm_vma *this = rb_entry(temp, typeof(*this), tree);
  1173. if (this->size < size) {
  1174. temp = temp->rb_right;
  1175. } else {
  1176. node = temp;
  1177. temp = temp->rb_left;
  1178. }
  1179. }
  1180. if (unlikely(!node))
  1181. return -ENOSPC;
  1182. /* Take into account alignment restrictions, trying larger blocks
  1183. * in turn until we find a suitable free block.
  1184. */
  1185. do {
  1186. struct nvkm_vma *this = rb_entry(node, typeof(*this), tree);
  1187. struct nvkm_vma *prev = node(this, prev);
  1188. struct nvkm_vma *next = node(this, next);
  1189. const int p = page - vmm->func->page;
  1190. addr = this->addr;
  1191. if (vmm->func->page_block && prev && prev->page != p)
  1192. addr = ALIGN(addr, vmm->func->page_block);
  1193. addr = ALIGN(addr, 1ULL << align);
  1194. tail = this->addr + this->size;
  1195. if (vmm->func->page_block && next && next->page != p)
  1196. tail = ALIGN_DOWN(tail, vmm->func->page_block);
  1197. if (addr <= tail && tail - addr >= size) {
  1198. rb_erase(&this->tree, &vmm->free);
  1199. vma = this;
  1200. break;
  1201. }
  1202. } while ((node = rb_next(node)));
  1203. if (unlikely(!vma))
  1204. return -ENOSPC;
  1205. /* If the VMA we found isn't already exactly the requested size,
  1206. * it needs to be split, and the remaining free blocks returned.
  1207. */
  1208. if (addr != vma->addr) {
  1209. if (!(tmp = nvkm_vma_tail(vma, vma->size + vma->addr - addr))) {
  1210. nvkm_vmm_put_region(vmm, vma);
  1211. return -ENOMEM;
  1212. }
  1213. nvkm_vmm_free_insert(vmm, vma);
  1214. vma = tmp;
  1215. }
  1216. if (size != vma->size) {
  1217. if (!(tmp = nvkm_vma_tail(vma, vma->size - size))) {
  1218. nvkm_vmm_put_region(vmm, vma);
  1219. return -ENOMEM;
  1220. }
  1221. nvkm_vmm_free_insert(vmm, tmp);
  1222. }
  1223. /* Pre-allocate page tables and/or setup sparse mappings. */
  1224. if (sparse && getref)
  1225. ret = nvkm_vmm_ptes_sparse_get(vmm, page, vma->addr, vma->size);
  1226. else if (sparse)
  1227. ret = nvkm_vmm_ptes_sparse(vmm, vma->addr, vma->size, true);
  1228. else if (getref)
  1229. ret = nvkm_vmm_ptes_get(vmm, page, vma->addr, vma->size);
  1230. else
  1231. ret = 0;
  1232. if (ret) {
  1233. nvkm_vmm_put_region(vmm, vma);
  1234. return ret;
  1235. }
  1236. vma->mapref = mapref && !getref;
  1237. vma->sparse = sparse;
  1238. vma->page = page - vmm->func->page;
  1239. vma->refd = getref ? vma->page : NVKM_VMA_PAGE_NONE;
  1240. vma->used = true;
  1241. nvkm_vmm_node_insert(vmm, vma);
  1242. *pvma = vma;
  1243. return 0;
  1244. }
  1245. int
  1246. nvkm_vmm_get(struct nvkm_vmm *vmm, u8 page, u64 size, struct nvkm_vma **pvma)
  1247. {
  1248. int ret;
  1249. mutex_lock(&vmm->mutex);
  1250. ret = nvkm_vmm_get_locked(vmm, false, true, false, page, 0, size, pvma);
  1251. mutex_unlock(&vmm->mutex);
  1252. return ret;
  1253. }
  1254. void
  1255. nvkm_vmm_part(struct nvkm_vmm *vmm, struct nvkm_memory *inst)
  1256. {
  1257. if (inst && vmm && vmm->func->part) {
  1258. mutex_lock(&vmm->mutex);
  1259. vmm->func->part(vmm, inst);
  1260. mutex_unlock(&vmm->mutex);
  1261. }
  1262. }
  1263. int
  1264. nvkm_vmm_join(struct nvkm_vmm *vmm, struct nvkm_memory *inst)
  1265. {
  1266. int ret = 0;
  1267. if (vmm->func->join) {
  1268. mutex_lock(&vmm->mutex);
  1269. ret = vmm->func->join(vmm, inst);
  1270. mutex_unlock(&vmm->mutex);
  1271. }
  1272. return ret;
  1273. }
  1274. static bool
  1275. nvkm_vmm_boot_ptes(struct nvkm_vmm_iter *it, u32 ptei, u32 ptes)
  1276. {
  1277. const struct nvkm_vmm_desc *desc = it->desc;
  1278. const int type = desc->type == SPT;
  1279. nvkm_memory_boot(it->pt[0]->pt[type]->memory, it->vmm);
  1280. return false;
  1281. }
  1282. int
  1283. nvkm_vmm_boot(struct nvkm_vmm *vmm)
  1284. {
  1285. const struct nvkm_vmm_page *page = vmm->func->page;
  1286. const u64 limit = vmm->limit - vmm->start;
  1287. int ret;
  1288. while (page[1].shift)
  1289. page++;
  1290. ret = nvkm_vmm_ptes_get(vmm, page, vmm->start, limit);
  1291. if (ret)
  1292. return ret;
  1293. nvkm_vmm_iter(vmm, page, vmm->start, limit, "bootstrap", false,
  1294. nvkm_vmm_boot_ptes, NULL, NULL, NULL);
  1295. vmm->bootstrapped = true;
  1296. return 0;
  1297. }
  1298. static void
  1299. nvkm_vmm_del(struct kref *kref)
  1300. {
  1301. struct nvkm_vmm *vmm = container_of(kref, typeof(*vmm), kref);
  1302. nvkm_vmm_dtor(vmm);
  1303. kfree(vmm);
  1304. }
  1305. void
  1306. nvkm_vmm_unref(struct nvkm_vmm **pvmm)
  1307. {
  1308. struct nvkm_vmm *vmm = *pvmm;
  1309. if (vmm) {
  1310. kref_put(&vmm->kref, nvkm_vmm_del);
  1311. *pvmm = NULL;
  1312. }
  1313. }
  1314. struct nvkm_vmm *
  1315. nvkm_vmm_ref(struct nvkm_vmm *vmm)
  1316. {
  1317. if (vmm)
  1318. kref_get(&vmm->kref);
  1319. return vmm;
  1320. }
  1321. int
  1322. nvkm_vmm_new(struct nvkm_device *device, u64 addr, u64 size, void *argv,
  1323. u32 argc, struct lock_class_key *key, const char *name,
  1324. struct nvkm_vmm **pvmm)
  1325. {
  1326. struct nvkm_mmu *mmu = device->mmu;
  1327. struct nvkm_vmm *vmm = NULL;
  1328. int ret;
  1329. ret = mmu->func->vmm.ctor(mmu, addr, size, argv, argc, key, name, &vmm);
  1330. if (ret)
  1331. nvkm_vmm_unref(&vmm);
  1332. *pvmm = vmm;
  1333. return ret;
  1334. }