gtt.c 72 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770
  1. /*
  2. * GTT virtualization
  3. *
  4. * Copyright(c) 2011-2016 Intel Corporation. All rights reserved.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the "Software"),
  8. * to deal in the Software without restriction, including without limitation
  9. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the
  11. * Software is furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice (including the next
  14. * paragraph) shall be included in all copies or substantial portions of the
  15. * Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23. * SOFTWARE.
  24. *
  25. * Authors:
  26. * Zhi Wang <zhi.a.wang@intel.com>
  27. * Zhenyu Wang <zhenyuw@linux.intel.com>
  28. * Xiao Zheng <xiao.zheng@intel.com>
  29. *
  30. * Contributors:
  31. * Min He <min.he@intel.com>
  32. * Bing Niu <bing.niu@intel.com>
  33. *
  34. */
  35. #include "i915_drv.h"
  36. #include "gvt.h"
  37. #include "i915_pvinfo.h"
  38. #include "trace.h"
  39. #if defined(VERBOSE_DEBUG)
  40. #define gvt_vdbg_mm(fmt, args...) gvt_dbg_mm(fmt, ##args)
  41. #else
  42. #define gvt_vdbg_mm(fmt, args...)
  43. #endif
  44. static bool enable_out_of_sync = false;
  45. static int preallocated_oos_pages = 8192;
  46. /*
  47. * validate a gm address and related range size,
  48. * translate it to host gm address
  49. */
  50. bool intel_gvt_ggtt_validate_range(struct intel_vgpu *vgpu, u64 addr, u32 size)
  51. {
  52. if ((!vgpu_gmadr_is_valid(vgpu, addr)) || (size
  53. && !vgpu_gmadr_is_valid(vgpu, addr + size - 1))) {
  54. gvt_vgpu_err("invalid range gmadr 0x%llx size 0x%x\n",
  55. addr, size);
  56. return false;
  57. }
  58. return true;
  59. }
  60. /* translate a guest gmadr to host gmadr */
  61. int intel_gvt_ggtt_gmadr_g2h(struct intel_vgpu *vgpu, u64 g_addr, u64 *h_addr)
  62. {
  63. if (WARN(!vgpu_gmadr_is_valid(vgpu, g_addr),
  64. "invalid guest gmadr %llx\n", g_addr))
  65. return -EACCES;
  66. if (vgpu_gmadr_is_aperture(vgpu, g_addr))
  67. *h_addr = vgpu_aperture_gmadr_base(vgpu)
  68. + (g_addr - vgpu_aperture_offset(vgpu));
  69. else
  70. *h_addr = vgpu_hidden_gmadr_base(vgpu)
  71. + (g_addr - vgpu_hidden_offset(vgpu));
  72. return 0;
  73. }
  74. /* translate a host gmadr to guest gmadr */
  75. int intel_gvt_ggtt_gmadr_h2g(struct intel_vgpu *vgpu, u64 h_addr, u64 *g_addr)
  76. {
  77. if (WARN(!gvt_gmadr_is_valid(vgpu->gvt, h_addr),
  78. "invalid host gmadr %llx\n", h_addr))
  79. return -EACCES;
  80. if (gvt_gmadr_is_aperture(vgpu->gvt, h_addr))
  81. *g_addr = vgpu_aperture_gmadr_base(vgpu)
  82. + (h_addr - gvt_aperture_gmadr_base(vgpu->gvt));
  83. else
  84. *g_addr = vgpu_hidden_gmadr_base(vgpu)
  85. + (h_addr - gvt_hidden_gmadr_base(vgpu->gvt));
  86. return 0;
  87. }
  88. int intel_gvt_ggtt_index_g2h(struct intel_vgpu *vgpu, unsigned long g_index,
  89. unsigned long *h_index)
  90. {
  91. u64 h_addr;
  92. int ret;
  93. ret = intel_gvt_ggtt_gmadr_g2h(vgpu, g_index << I915_GTT_PAGE_SHIFT,
  94. &h_addr);
  95. if (ret)
  96. return ret;
  97. *h_index = h_addr >> I915_GTT_PAGE_SHIFT;
  98. return 0;
  99. }
  100. int intel_gvt_ggtt_h2g_index(struct intel_vgpu *vgpu, unsigned long h_index,
  101. unsigned long *g_index)
  102. {
  103. u64 g_addr;
  104. int ret;
  105. ret = intel_gvt_ggtt_gmadr_h2g(vgpu, h_index << I915_GTT_PAGE_SHIFT,
  106. &g_addr);
  107. if (ret)
  108. return ret;
  109. *g_index = g_addr >> I915_GTT_PAGE_SHIFT;
  110. return 0;
  111. }
  112. #define gtt_type_is_entry(type) \
  113. (type > GTT_TYPE_INVALID && type < GTT_TYPE_PPGTT_ENTRY \
  114. && type != GTT_TYPE_PPGTT_PTE_ENTRY \
  115. && type != GTT_TYPE_PPGTT_ROOT_ENTRY)
  116. #define gtt_type_is_pt(type) \
  117. (type >= GTT_TYPE_PPGTT_PTE_PT && type < GTT_TYPE_MAX)
  118. #define gtt_type_is_pte_pt(type) \
  119. (type == GTT_TYPE_PPGTT_PTE_PT)
  120. #define gtt_type_is_root_pointer(type) \
  121. (gtt_type_is_entry(type) && type > GTT_TYPE_PPGTT_ROOT_ENTRY)
  122. #define gtt_init_entry(e, t, p, v) do { \
  123. (e)->type = t; \
  124. (e)->pdev = p; \
  125. memcpy(&(e)->val64, &v, sizeof(v)); \
  126. } while (0)
  127. /*
  128. * Mappings between GTT_TYPE* enumerations.
  129. * Following information can be found according to the given type:
  130. * - type of next level page table
  131. * - type of entry inside this level page table
  132. * - type of entry with PSE set
  133. *
  134. * If the given type doesn't have such a kind of information,
  135. * e.g. give a l4 root entry type, then request to get its PSE type,
  136. * give a PTE page table type, then request to get its next level page
  137. * table type, as we know l4 root entry doesn't have a PSE bit,
  138. * and a PTE page table doesn't have a next level page table type,
  139. * GTT_TYPE_INVALID will be returned. This is useful when traversing a
  140. * page table.
  141. */
  142. struct gtt_type_table_entry {
  143. int entry_type;
  144. int pt_type;
  145. int next_pt_type;
  146. int pse_entry_type;
  147. };
  148. #define GTT_TYPE_TABLE_ENTRY(type, e_type, cpt_type, npt_type, pse_type) \
  149. [type] = { \
  150. .entry_type = e_type, \
  151. .pt_type = cpt_type, \
  152. .next_pt_type = npt_type, \
  153. .pse_entry_type = pse_type, \
  154. }
  155. static struct gtt_type_table_entry gtt_type_table[] = {
  156. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_ROOT_L4_ENTRY,
  157. GTT_TYPE_PPGTT_ROOT_L4_ENTRY,
  158. GTT_TYPE_INVALID,
  159. GTT_TYPE_PPGTT_PML4_PT,
  160. GTT_TYPE_INVALID),
  161. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PML4_PT,
  162. GTT_TYPE_PPGTT_PML4_ENTRY,
  163. GTT_TYPE_PPGTT_PML4_PT,
  164. GTT_TYPE_PPGTT_PDP_PT,
  165. GTT_TYPE_INVALID),
  166. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PML4_ENTRY,
  167. GTT_TYPE_PPGTT_PML4_ENTRY,
  168. GTT_TYPE_PPGTT_PML4_PT,
  169. GTT_TYPE_PPGTT_PDP_PT,
  170. GTT_TYPE_INVALID),
  171. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDP_PT,
  172. GTT_TYPE_PPGTT_PDP_ENTRY,
  173. GTT_TYPE_PPGTT_PDP_PT,
  174. GTT_TYPE_PPGTT_PDE_PT,
  175. GTT_TYPE_PPGTT_PTE_1G_ENTRY),
  176. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_ROOT_L3_ENTRY,
  177. GTT_TYPE_PPGTT_ROOT_L3_ENTRY,
  178. GTT_TYPE_INVALID,
  179. GTT_TYPE_PPGTT_PDE_PT,
  180. GTT_TYPE_PPGTT_PTE_1G_ENTRY),
  181. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDP_ENTRY,
  182. GTT_TYPE_PPGTT_PDP_ENTRY,
  183. GTT_TYPE_PPGTT_PDP_PT,
  184. GTT_TYPE_PPGTT_PDE_PT,
  185. GTT_TYPE_PPGTT_PTE_1G_ENTRY),
  186. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDE_PT,
  187. GTT_TYPE_PPGTT_PDE_ENTRY,
  188. GTT_TYPE_PPGTT_PDE_PT,
  189. GTT_TYPE_PPGTT_PTE_PT,
  190. GTT_TYPE_PPGTT_PTE_2M_ENTRY),
  191. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDE_ENTRY,
  192. GTT_TYPE_PPGTT_PDE_ENTRY,
  193. GTT_TYPE_PPGTT_PDE_PT,
  194. GTT_TYPE_PPGTT_PTE_PT,
  195. GTT_TYPE_PPGTT_PTE_2M_ENTRY),
  196. /* We take IPS bit as 'PSE' for PTE level. */
  197. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_PT,
  198. GTT_TYPE_PPGTT_PTE_4K_ENTRY,
  199. GTT_TYPE_PPGTT_PTE_PT,
  200. GTT_TYPE_INVALID,
  201. GTT_TYPE_PPGTT_PTE_64K_ENTRY),
  202. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_4K_ENTRY,
  203. GTT_TYPE_PPGTT_PTE_4K_ENTRY,
  204. GTT_TYPE_PPGTT_PTE_PT,
  205. GTT_TYPE_INVALID,
  206. GTT_TYPE_PPGTT_PTE_64K_ENTRY),
  207. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_64K_ENTRY,
  208. GTT_TYPE_PPGTT_PTE_4K_ENTRY,
  209. GTT_TYPE_PPGTT_PTE_PT,
  210. GTT_TYPE_INVALID,
  211. GTT_TYPE_PPGTT_PTE_64K_ENTRY),
  212. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_2M_ENTRY,
  213. GTT_TYPE_PPGTT_PDE_ENTRY,
  214. GTT_TYPE_PPGTT_PDE_PT,
  215. GTT_TYPE_INVALID,
  216. GTT_TYPE_PPGTT_PTE_2M_ENTRY),
  217. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_1G_ENTRY,
  218. GTT_TYPE_PPGTT_PDP_ENTRY,
  219. GTT_TYPE_PPGTT_PDP_PT,
  220. GTT_TYPE_INVALID,
  221. GTT_TYPE_PPGTT_PTE_1G_ENTRY),
  222. GTT_TYPE_TABLE_ENTRY(GTT_TYPE_GGTT_PTE,
  223. GTT_TYPE_GGTT_PTE,
  224. GTT_TYPE_INVALID,
  225. GTT_TYPE_INVALID,
  226. GTT_TYPE_INVALID),
  227. };
  228. static inline int get_next_pt_type(int type)
  229. {
  230. return gtt_type_table[type].next_pt_type;
  231. }
  232. static inline int get_pt_type(int type)
  233. {
  234. return gtt_type_table[type].pt_type;
  235. }
  236. static inline int get_entry_type(int type)
  237. {
  238. return gtt_type_table[type].entry_type;
  239. }
  240. static inline int get_pse_type(int type)
  241. {
  242. return gtt_type_table[type].pse_entry_type;
  243. }
  244. static u64 read_pte64(struct drm_i915_private *dev_priv, unsigned long index)
  245. {
  246. void __iomem *addr = (gen8_pte_t __iomem *)dev_priv->ggtt.gsm + index;
  247. return readq(addr);
  248. }
  249. static void ggtt_invalidate(struct drm_i915_private *dev_priv)
  250. {
  251. mmio_hw_access_pre(dev_priv);
  252. I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
  253. mmio_hw_access_post(dev_priv);
  254. }
  255. static void write_pte64(struct drm_i915_private *dev_priv,
  256. unsigned long index, u64 pte)
  257. {
  258. void __iomem *addr = (gen8_pte_t __iomem *)dev_priv->ggtt.gsm + index;
  259. writeq(pte, addr);
  260. }
  261. static inline int gtt_get_entry64(void *pt,
  262. struct intel_gvt_gtt_entry *e,
  263. unsigned long index, bool hypervisor_access, unsigned long gpa,
  264. struct intel_vgpu *vgpu)
  265. {
  266. const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
  267. int ret;
  268. if (WARN_ON(info->gtt_entry_size != 8))
  269. return -EINVAL;
  270. if (hypervisor_access) {
  271. ret = intel_gvt_hypervisor_read_gpa(vgpu, gpa +
  272. (index << info->gtt_entry_size_shift),
  273. &e->val64, 8);
  274. if (WARN_ON(ret))
  275. return ret;
  276. } else if (!pt) {
  277. e->val64 = read_pte64(vgpu->gvt->dev_priv, index);
  278. } else {
  279. e->val64 = *((u64 *)pt + index);
  280. }
  281. return 0;
  282. }
  283. static inline int gtt_set_entry64(void *pt,
  284. struct intel_gvt_gtt_entry *e,
  285. unsigned long index, bool hypervisor_access, unsigned long gpa,
  286. struct intel_vgpu *vgpu)
  287. {
  288. const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
  289. int ret;
  290. if (WARN_ON(info->gtt_entry_size != 8))
  291. return -EINVAL;
  292. if (hypervisor_access) {
  293. ret = intel_gvt_hypervisor_write_gpa(vgpu, gpa +
  294. (index << info->gtt_entry_size_shift),
  295. &e->val64, 8);
  296. if (WARN_ON(ret))
  297. return ret;
  298. } else if (!pt) {
  299. write_pte64(vgpu->gvt->dev_priv, index, e->val64);
  300. } else {
  301. *((u64 *)pt + index) = e->val64;
  302. }
  303. return 0;
  304. }
  305. #define GTT_HAW 46
  306. #define ADDR_1G_MASK GENMASK_ULL(GTT_HAW - 1, 30)
  307. #define ADDR_2M_MASK GENMASK_ULL(GTT_HAW - 1, 21)
  308. #define ADDR_64K_MASK GENMASK_ULL(GTT_HAW - 1, 16)
  309. #define ADDR_4K_MASK GENMASK_ULL(GTT_HAW - 1, 12)
  310. #define GTT_SPTE_FLAG_MASK GENMASK_ULL(62, 52)
  311. #define GTT_SPTE_FLAG_64K_SPLITED BIT(52) /* splited 64K gtt entry */
  312. #define GTT_64K_PTE_STRIDE 16
  313. static unsigned long gen8_gtt_get_pfn(struct intel_gvt_gtt_entry *e)
  314. {
  315. unsigned long pfn;
  316. if (e->type == GTT_TYPE_PPGTT_PTE_1G_ENTRY)
  317. pfn = (e->val64 & ADDR_1G_MASK) >> PAGE_SHIFT;
  318. else if (e->type == GTT_TYPE_PPGTT_PTE_2M_ENTRY)
  319. pfn = (e->val64 & ADDR_2M_MASK) >> PAGE_SHIFT;
  320. else if (e->type == GTT_TYPE_PPGTT_PTE_64K_ENTRY)
  321. pfn = (e->val64 & ADDR_64K_MASK) >> PAGE_SHIFT;
  322. else
  323. pfn = (e->val64 & ADDR_4K_MASK) >> PAGE_SHIFT;
  324. return pfn;
  325. }
  326. static void gen8_gtt_set_pfn(struct intel_gvt_gtt_entry *e, unsigned long pfn)
  327. {
  328. if (e->type == GTT_TYPE_PPGTT_PTE_1G_ENTRY) {
  329. e->val64 &= ~ADDR_1G_MASK;
  330. pfn &= (ADDR_1G_MASK >> PAGE_SHIFT);
  331. } else if (e->type == GTT_TYPE_PPGTT_PTE_2M_ENTRY) {
  332. e->val64 &= ~ADDR_2M_MASK;
  333. pfn &= (ADDR_2M_MASK >> PAGE_SHIFT);
  334. } else if (e->type == GTT_TYPE_PPGTT_PTE_64K_ENTRY) {
  335. e->val64 &= ~ADDR_64K_MASK;
  336. pfn &= (ADDR_64K_MASK >> PAGE_SHIFT);
  337. } else {
  338. e->val64 &= ~ADDR_4K_MASK;
  339. pfn &= (ADDR_4K_MASK >> PAGE_SHIFT);
  340. }
  341. e->val64 |= (pfn << PAGE_SHIFT);
  342. }
  343. static bool gen8_gtt_test_pse(struct intel_gvt_gtt_entry *e)
  344. {
  345. return !!(e->val64 & _PAGE_PSE);
  346. }
  347. static void gen8_gtt_clear_pse(struct intel_gvt_gtt_entry *e)
  348. {
  349. if (gen8_gtt_test_pse(e)) {
  350. switch (e->type) {
  351. case GTT_TYPE_PPGTT_PTE_2M_ENTRY:
  352. e->val64 &= ~_PAGE_PSE;
  353. e->type = GTT_TYPE_PPGTT_PDE_ENTRY;
  354. break;
  355. case GTT_TYPE_PPGTT_PTE_1G_ENTRY:
  356. e->type = GTT_TYPE_PPGTT_PDP_ENTRY;
  357. e->val64 &= ~_PAGE_PSE;
  358. break;
  359. default:
  360. WARN_ON(1);
  361. }
  362. }
  363. }
  364. static bool gen8_gtt_test_ips(struct intel_gvt_gtt_entry *e)
  365. {
  366. if (GEM_WARN_ON(e->type != GTT_TYPE_PPGTT_PDE_ENTRY))
  367. return false;
  368. return !!(e->val64 & GEN8_PDE_IPS_64K);
  369. }
  370. static void gen8_gtt_clear_ips(struct intel_gvt_gtt_entry *e)
  371. {
  372. if (GEM_WARN_ON(e->type != GTT_TYPE_PPGTT_PDE_ENTRY))
  373. return;
  374. e->val64 &= ~GEN8_PDE_IPS_64K;
  375. }
  376. static bool gen8_gtt_test_present(struct intel_gvt_gtt_entry *e)
  377. {
  378. /*
  379. * i915 writes PDP root pointer registers without present bit,
  380. * it also works, so we need to treat root pointer entry
  381. * specifically.
  382. */
  383. if (e->type == GTT_TYPE_PPGTT_ROOT_L3_ENTRY
  384. || e->type == GTT_TYPE_PPGTT_ROOT_L4_ENTRY)
  385. return (e->val64 != 0);
  386. else
  387. return (e->val64 & _PAGE_PRESENT);
  388. }
  389. static void gtt_entry_clear_present(struct intel_gvt_gtt_entry *e)
  390. {
  391. e->val64 &= ~_PAGE_PRESENT;
  392. }
  393. static void gtt_entry_set_present(struct intel_gvt_gtt_entry *e)
  394. {
  395. e->val64 |= _PAGE_PRESENT;
  396. }
  397. static bool gen8_gtt_test_64k_splited(struct intel_gvt_gtt_entry *e)
  398. {
  399. return !!(e->val64 & GTT_SPTE_FLAG_64K_SPLITED);
  400. }
  401. static void gen8_gtt_set_64k_splited(struct intel_gvt_gtt_entry *e)
  402. {
  403. e->val64 |= GTT_SPTE_FLAG_64K_SPLITED;
  404. }
  405. static void gen8_gtt_clear_64k_splited(struct intel_gvt_gtt_entry *e)
  406. {
  407. e->val64 &= ~GTT_SPTE_FLAG_64K_SPLITED;
  408. }
  409. /*
  410. * Per-platform GMA routines.
  411. */
  412. static unsigned long gma_to_ggtt_pte_index(unsigned long gma)
  413. {
  414. unsigned long x = (gma >> I915_GTT_PAGE_SHIFT);
  415. trace_gma_index(__func__, gma, x);
  416. return x;
  417. }
  418. #define DEFINE_PPGTT_GMA_TO_INDEX(prefix, ename, exp) \
  419. static unsigned long prefix##_gma_to_##ename##_index(unsigned long gma) \
  420. { \
  421. unsigned long x = (exp); \
  422. trace_gma_index(__func__, gma, x); \
  423. return x; \
  424. }
  425. DEFINE_PPGTT_GMA_TO_INDEX(gen8, pte, (gma >> 12 & 0x1ff));
  426. DEFINE_PPGTT_GMA_TO_INDEX(gen8, pde, (gma >> 21 & 0x1ff));
  427. DEFINE_PPGTT_GMA_TO_INDEX(gen8, l3_pdp, (gma >> 30 & 0x3));
  428. DEFINE_PPGTT_GMA_TO_INDEX(gen8, l4_pdp, (gma >> 30 & 0x1ff));
  429. DEFINE_PPGTT_GMA_TO_INDEX(gen8, pml4, (gma >> 39 & 0x1ff));
  430. static struct intel_gvt_gtt_pte_ops gen8_gtt_pte_ops = {
  431. .get_entry = gtt_get_entry64,
  432. .set_entry = gtt_set_entry64,
  433. .clear_present = gtt_entry_clear_present,
  434. .set_present = gtt_entry_set_present,
  435. .test_present = gen8_gtt_test_present,
  436. .test_pse = gen8_gtt_test_pse,
  437. .clear_pse = gen8_gtt_clear_pse,
  438. .clear_ips = gen8_gtt_clear_ips,
  439. .test_ips = gen8_gtt_test_ips,
  440. .clear_64k_splited = gen8_gtt_clear_64k_splited,
  441. .set_64k_splited = gen8_gtt_set_64k_splited,
  442. .test_64k_splited = gen8_gtt_test_64k_splited,
  443. .get_pfn = gen8_gtt_get_pfn,
  444. .set_pfn = gen8_gtt_set_pfn,
  445. };
  446. static struct intel_gvt_gtt_gma_ops gen8_gtt_gma_ops = {
  447. .gma_to_ggtt_pte_index = gma_to_ggtt_pte_index,
  448. .gma_to_pte_index = gen8_gma_to_pte_index,
  449. .gma_to_pde_index = gen8_gma_to_pde_index,
  450. .gma_to_l3_pdp_index = gen8_gma_to_l3_pdp_index,
  451. .gma_to_l4_pdp_index = gen8_gma_to_l4_pdp_index,
  452. .gma_to_pml4_index = gen8_gma_to_pml4_index,
  453. };
  454. /* Update entry type per pse and ips bit. */
  455. static void update_entry_type_for_real(struct intel_gvt_gtt_pte_ops *pte_ops,
  456. struct intel_gvt_gtt_entry *entry, bool ips)
  457. {
  458. switch (entry->type) {
  459. case GTT_TYPE_PPGTT_PDE_ENTRY:
  460. case GTT_TYPE_PPGTT_PDP_ENTRY:
  461. if (pte_ops->test_pse(entry))
  462. entry->type = get_pse_type(entry->type);
  463. break;
  464. case GTT_TYPE_PPGTT_PTE_4K_ENTRY:
  465. if (ips)
  466. entry->type = get_pse_type(entry->type);
  467. break;
  468. default:
  469. GEM_BUG_ON(!gtt_type_is_entry(entry->type));
  470. }
  471. GEM_BUG_ON(entry->type == GTT_TYPE_INVALID);
  472. }
  473. /*
  474. * MM helpers.
  475. */
  476. static void _ppgtt_get_root_entry(struct intel_vgpu_mm *mm,
  477. struct intel_gvt_gtt_entry *entry, unsigned long index,
  478. bool guest)
  479. {
  480. struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
  481. GEM_BUG_ON(mm->type != INTEL_GVT_MM_PPGTT);
  482. entry->type = mm->ppgtt_mm.root_entry_type;
  483. pte_ops->get_entry(guest ? mm->ppgtt_mm.guest_pdps :
  484. mm->ppgtt_mm.shadow_pdps,
  485. entry, index, false, 0, mm->vgpu);
  486. update_entry_type_for_real(pte_ops, entry, false);
  487. }
  488. static inline void ppgtt_get_guest_root_entry(struct intel_vgpu_mm *mm,
  489. struct intel_gvt_gtt_entry *entry, unsigned long index)
  490. {
  491. _ppgtt_get_root_entry(mm, entry, index, true);
  492. }
  493. static inline void ppgtt_get_shadow_root_entry(struct intel_vgpu_mm *mm,
  494. struct intel_gvt_gtt_entry *entry, unsigned long index)
  495. {
  496. _ppgtt_get_root_entry(mm, entry, index, false);
  497. }
  498. static void _ppgtt_set_root_entry(struct intel_vgpu_mm *mm,
  499. struct intel_gvt_gtt_entry *entry, unsigned long index,
  500. bool guest)
  501. {
  502. struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
  503. pte_ops->set_entry(guest ? mm->ppgtt_mm.guest_pdps :
  504. mm->ppgtt_mm.shadow_pdps,
  505. entry, index, false, 0, mm->vgpu);
  506. }
  507. static inline void ppgtt_set_guest_root_entry(struct intel_vgpu_mm *mm,
  508. struct intel_gvt_gtt_entry *entry, unsigned long index)
  509. {
  510. _ppgtt_set_root_entry(mm, entry, index, true);
  511. }
  512. static inline void ppgtt_set_shadow_root_entry(struct intel_vgpu_mm *mm,
  513. struct intel_gvt_gtt_entry *entry, unsigned long index)
  514. {
  515. _ppgtt_set_root_entry(mm, entry, index, false);
  516. }
  517. static void ggtt_get_guest_entry(struct intel_vgpu_mm *mm,
  518. struct intel_gvt_gtt_entry *entry, unsigned long index)
  519. {
  520. struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
  521. GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
  522. entry->type = GTT_TYPE_GGTT_PTE;
  523. pte_ops->get_entry(mm->ggtt_mm.virtual_ggtt, entry, index,
  524. false, 0, mm->vgpu);
  525. }
  526. static void ggtt_set_guest_entry(struct intel_vgpu_mm *mm,
  527. struct intel_gvt_gtt_entry *entry, unsigned long index)
  528. {
  529. struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
  530. GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
  531. pte_ops->set_entry(mm->ggtt_mm.virtual_ggtt, entry, index,
  532. false, 0, mm->vgpu);
  533. }
  534. static void ggtt_get_host_entry(struct intel_vgpu_mm *mm,
  535. struct intel_gvt_gtt_entry *entry, unsigned long index)
  536. {
  537. struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
  538. GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
  539. pte_ops->get_entry(NULL, entry, index, false, 0, mm->vgpu);
  540. }
  541. static void ggtt_set_host_entry(struct intel_vgpu_mm *mm,
  542. struct intel_gvt_gtt_entry *entry, unsigned long index)
  543. {
  544. struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
  545. GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
  546. pte_ops->set_entry(NULL, entry, index, false, 0, mm->vgpu);
  547. }
  548. /*
  549. * PPGTT shadow page table helpers.
  550. */
  551. static inline int ppgtt_spt_get_entry(
  552. struct intel_vgpu_ppgtt_spt *spt,
  553. void *page_table, int type,
  554. struct intel_gvt_gtt_entry *e, unsigned long index,
  555. bool guest)
  556. {
  557. struct intel_gvt *gvt = spt->vgpu->gvt;
  558. struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
  559. int ret;
  560. e->type = get_entry_type(type);
  561. if (WARN(!gtt_type_is_entry(e->type), "invalid entry type\n"))
  562. return -EINVAL;
  563. ret = ops->get_entry(page_table, e, index, guest,
  564. spt->guest_page.gfn << I915_GTT_PAGE_SHIFT,
  565. spt->vgpu);
  566. if (ret)
  567. return ret;
  568. update_entry_type_for_real(ops, e, guest ?
  569. spt->guest_page.pde_ips : false);
  570. gvt_vdbg_mm("read ppgtt entry, spt type %d, entry type %d, index %lu, value %llx\n",
  571. type, e->type, index, e->val64);
  572. return 0;
  573. }
  574. static inline int ppgtt_spt_set_entry(
  575. struct intel_vgpu_ppgtt_spt *spt,
  576. void *page_table, int type,
  577. struct intel_gvt_gtt_entry *e, unsigned long index,
  578. bool guest)
  579. {
  580. struct intel_gvt *gvt = spt->vgpu->gvt;
  581. struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
  582. if (WARN(!gtt_type_is_entry(e->type), "invalid entry type\n"))
  583. return -EINVAL;
  584. gvt_vdbg_mm("set ppgtt entry, spt type %d, entry type %d, index %lu, value %llx\n",
  585. type, e->type, index, e->val64);
  586. return ops->set_entry(page_table, e, index, guest,
  587. spt->guest_page.gfn << I915_GTT_PAGE_SHIFT,
  588. spt->vgpu);
  589. }
  590. #define ppgtt_get_guest_entry(spt, e, index) \
  591. ppgtt_spt_get_entry(spt, NULL, \
  592. spt->guest_page.type, e, index, true)
  593. #define ppgtt_set_guest_entry(spt, e, index) \
  594. ppgtt_spt_set_entry(spt, NULL, \
  595. spt->guest_page.type, e, index, true)
  596. #define ppgtt_get_shadow_entry(spt, e, index) \
  597. ppgtt_spt_get_entry(spt, spt->shadow_page.vaddr, \
  598. spt->shadow_page.type, e, index, false)
  599. #define ppgtt_set_shadow_entry(spt, e, index) \
  600. ppgtt_spt_set_entry(spt, spt->shadow_page.vaddr, \
  601. spt->shadow_page.type, e, index, false)
  602. static void *alloc_spt(gfp_t gfp_mask)
  603. {
  604. struct intel_vgpu_ppgtt_spt *spt;
  605. spt = kzalloc(sizeof(*spt), gfp_mask);
  606. if (!spt)
  607. return NULL;
  608. spt->shadow_page.page = alloc_page(gfp_mask);
  609. if (!spt->shadow_page.page) {
  610. kfree(spt);
  611. return NULL;
  612. }
  613. return spt;
  614. }
  615. static void free_spt(struct intel_vgpu_ppgtt_spt *spt)
  616. {
  617. __free_page(spt->shadow_page.page);
  618. kfree(spt);
  619. }
  620. static int detach_oos_page(struct intel_vgpu *vgpu,
  621. struct intel_vgpu_oos_page *oos_page);
  622. static void ppgtt_free_spt(struct intel_vgpu_ppgtt_spt *spt)
  623. {
  624. struct device *kdev = &spt->vgpu->gvt->dev_priv->drm.pdev->dev;
  625. trace_spt_free(spt->vgpu->id, spt, spt->guest_page.type);
  626. dma_unmap_page(kdev, spt->shadow_page.mfn << I915_GTT_PAGE_SHIFT, 4096,
  627. PCI_DMA_BIDIRECTIONAL);
  628. radix_tree_delete(&spt->vgpu->gtt.spt_tree, spt->shadow_page.mfn);
  629. if (spt->guest_page.gfn) {
  630. if (spt->guest_page.oos_page)
  631. detach_oos_page(spt->vgpu, spt->guest_page.oos_page);
  632. intel_vgpu_unregister_page_track(spt->vgpu, spt->guest_page.gfn);
  633. }
  634. list_del_init(&spt->post_shadow_list);
  635. free_spt(spt);
  636. }
  637. static void ppgtt_free_all_spt(struct intel_vgpu *vgpu)
  638. {
  639. struct intel_vgpu_ppgtt_spt *spt;
  640. struct radix_tree_iter iter;
  641. void **slot;
  642. radix_tree_for_each_slot(slot, &vgpu->gtt.spt_tree, &iter, 0) {
  643. spt = radix_tree_deref_slot(slot);
  644. ppgtt_free_spt(spt);
  645. }
  646. }
  647. static int ppgtt_handle_guest_write_page_table_bytes(
  648. struct intel_vgpu_ppgtt_spt *spt,
  649. u64 pa, void *p_data, int bytes);
  650. static int ppgtt_write_protection_handler(
  651. struct intel_vgpu_page_track *page_track,
  652. u64 gpa, void *data, int bytes)
  653. {
  654. struct intel_vgpu_ppgtt_spt *spt = page_track->priv_data;
  655. int ret;
  656. if (bytes != 4 && bytes != 8)
  657. return -EINVAL;
  658. ret = ppgtt_handle_guest_write_page_table_bytes(spt, gpa, data, bytes);
  659. if (ret)
  660. return ret;
  661. return ret;
  662. }
  663. /* Find a spt by guest gfn. */
  664. static struct intel_vgpu_ppgtt_spt *intel_vgpu_find_spt_by_gfn(
  665. struct intel_vgpu *vgpu, unsigned long gfn)
  666. {
  667. struct intel_vgpu_page_track *track;
  668. track = intel_vgpu_find_page_track(vgpu, gfn);
  669. if (track && track->handler == ppgtt_write_protection_handler)
  670. return track->priv_data;
  671. return NULL;
  672. }
  673. /* Find the spt by shadow page mfn. */
  674. static inline struct intel_vgpu_ppgtt_spt *intel_vgpu_find_spt_by_mfn(
  675. struct intel_vgpu *vgpu, unsigned long mfn)
  676. {
  677. return radix_tree_lookup(&vgpu->gtt.spt_tree, mfn);
  678. }
  679. static int reclaim_one_ppgtt_mm(struct intel_gvt *gvt);
  680. /* Allocate shadow page table without guest page. */
  681. static struct intel_vgpu_ppgtt_spt *ppgtt_alloc_spt(
  682. struct intel_vgpu *vgpu, intel_gvt_gtt_type_t type)
  683. {
  684. struct device *kdev = &vgpu->gvt->dev_priv->drm.pdev->dev;
  685. struct intel_vgpu_ppgtt_spt *spt = NULL;
  686. dma_addr_t daddr;
  687. int ret;
  688. retry:
  689. spt = alloc_spt(GFP_KERNEL | __GFP_ZERO);
  690. if (!spt) {
  691. if (reclaim_one_ppgtt_mm(vgpu->gvt))
  692. goto retry;
  693. gvt_vgpu_err("fail to allocate ppgtt shadow page\n");
  694. return ERR_PTR(-ENOMEM);
  695. }
  696. spt->vgpu = vgpu;
  697. atomic_set(&spt->refcount, 1);
  698. INIT_LIST_HEAD(&spt->post_shadow_list);
  699. /*
  700. * Init shadow_page.
  701. */
  702. spt->shadow_page.type = type;
  703. daddr = dma_map_page(kdev, spt->shadow_page.page,
  704. 0, 4096, PCI_DMA_BIDIRECTIONAL);
  705. if (dma_mapping_error(kdev, daddr)) {
  706. gvt_vgpu_err("fail to map dma addr\n");
  707. ret = -EINVAL;
  708. goto err_free_spt;
  709. }
  710. spt->shadow_page.vaddr = page_address(spt->shadow_page.page);
  711. spt->shadow_page.mfn = daddr >> I915_GTT_PAGE_SHIFT;
  712. ret = radix_tree_insert(&vgpu->gtt.spt_tree, spt->shadow_page.mfn, spt);
  713. if (ret)
  714. goto err_unmap_dma;
  715. return spt;
  716. err_unmap_dma:
  717. dma_unmap_page(kdev, daddr, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
  718. err_free_spt:
  719. free_spt(spt);
  720. return ERR_PTR(ret);
  721. }
  722. /* Allocate shadow page table associated with specific gfn. */
  723. static struct intel_vgpu_ppgtt_spt *ppgtt_alloc_spt_gfn(
  724. struct intel_vgpu *vgpu, intel_gvt_gtt_type_t type,
  725. unsigned long gfn, bool guest_pde_ips)
  726. {
  727. struct intel_vgpu_ppgtt_spt *spt;
  728. int ret;
  729. spt = ppgtt_alloc_spt(vgpu, type);
  730. if (IS_ERR(spt))
  731. return spt;
  732. /*
  733. * Init guest_page.
  734. */
  735. ret = intel_vgpu_register_page_track(vgpu, gfn,
  736. ppgtt_write_protection_handler, spt);
  737. if (ret) {
  738. ppgtt_free_spt(spt);
  739. return ERR_PTR(ret);
  740. }
  741. spt->guest_page.type = type;
  742. spt->guest_page.gfn = gfn;
  743. spt->guest_page.pde_ips = guest_pde_ips;
  744. trace_spt_alloc(vgpu->id, spt, type, spt->shadow_page.mfn, gfn);
  745. return spt;
  746. }
  747. #define pt_entry_size_shift(spt) \
  748. ((spt)->vgpu->gvt->device_info.gtt_entry_size_shift)
  749. #define pt_entries(spt) \
  750. (I915_GTT_PAGE_SIZE >> pt_entry_size_shift(spt))
  751. #define for_each_present_guest_entry(spt, e, i) \
  752. for (i = 0; i < pt_entries(spt); \
  753. i += spt->guest_page.pde_ips ? GTT_64K_PTE_STRIDE : 1) \
  754. if (!ppgtt_get_guest_entry(spt, e, i) && \
  755. spt->vgpu->gvt->gtt.pte_ops->test_present(e))
  756. #define for_each_present_shadow_entry(spt, e, i) \
  757. for (i = 0; i < pt_entries(spt); \
  758. i += spt->shadow_page.pde_ips ? GTT_64K_PTE_STRIDE : 1) \
  759. if (!ppgtt_get_shadow_entry(spt, e, i) && \
  760. spt->vgpu->gvt->gtt.pte_ops->test_present(e))
  761. #define for_each_shadow_entry(spt, e, i) \
  762. for (i = 0; i < pt_entries(spt); \
  763. i += (spt->shadow_page.pde_ips ? GTT_64K_PTE_STRIDE : 1)) \
  764. if (!ppgtt_get_shadow_entry(spt, e, i))
  765. static inline void ppgtt_get_spt(struct intel_vgpu_ppgtt_spt *spt)
  766. {
  767. int v = atomic_read(&spt->refcount);
  768. trace_spt_refcount(spt->vgpu->id, "inc", spt, v, (v + 1));
  769. atomic_inc(&spt->refcount);
  770. }
  771. static inline int ppgtt_put_spt(struct intel_vgpu_ppgtt_spt *spt)
  772. {
  773. int v = atomic_read(&spt->refcount);
  774. trace_spt_refcount(spt->vgpu->id, "dec", spt, v, (v - 1));
  775. return atomic_dec_return(&spt->refcount);
  776. }
  777. static int ppgtt_invalidate_spt(struct intel_vgpu_ppgtt_spt *spt);
  778. static int ppgtt_invalidate_spt_by_shadow_entry(struct intel_vgpu *vgpu,
  779. struct intel_gvt_gtt_entry *e)
  780. {
  781. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  782. struct intel_vgpu_ppgtt_spt *s;
  783. intel_gvt_gtt_type_t cur_pt_type;
  784. GEM_BUG_ON(!gtt_type_is_pt(get_next_pt_type(e->type)));
  785. if (e->type != GTT_TYPE_PPGTT_ROOT_L3_ENTRY
  786. && e->type != GTT_TYPE_PPGTT_ROOT_L4_ENTRY) {
  787. cur_pt_type = get_next_pt_type(e->type) + 1;
  788. if (ops->get_pfn(e) ==
  789. vgpu->gtt.scratch_pt[cur_pt_type].page_mfn)
  790. return 0;
  791. }
  792. s = intel_vgpu_find_spt_by_mfn(vgpu, ops->get_pfn(e));
  793. if (!s) {
  794. gvt_vgpu_err("fail to find shadow page: mfn: 0x%lx\n",
  795. ops->get_pfn(e));
  796. return -ENXIO;
  797. }
  798. return ppgtt_invalidate_spt(s);
  799. }
  800. static inline void ppgtt_invalidate_pte(struct intel_vgpu_ppgtt_spt *spt,
  801. struct intel_gvt_gtt_entry *entry)
  802. {
  803. struct intel_vgpu *vgpu = spt->vgpu;
  804. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  805. unsigned long pfn;
  806. int type;
  807. pfn = ops->get_pfn(entry);
  808. type = spt->shadow_page.type;
  809. /* Uninitialized spte or unshadowed spte. */
  810. if (!pfn || pfn == vgpu->gtt.scratch_pt[type].page_mfn)
  811. return;
  812. intel_gvt_hypervisor_dma_unmap_guest_page(vgpu, pfn << PAGE_SHIFT);
  813. }
  814. static int ppgtt_invalidate_spt(struct intel_vgpu_ppgtt_spt *spt)
  815. {
  816. struct intel_vgpu *vgpu = spt->vgpu;
  817. struct intel_gvt_gtt_entry e;
  818. unsigned long index;
  819. int ret;
  820. trace_spt_change(spt->vgpu->id, "die", spt,
  821. spt->guest_page.gfn, spt->shadow_page.type);
  822. if (ppgtt_put_spt(spt) > 0)
  823. return 0;
  824. for_each_present_shadow_entry(spt, &e, index) {
  825. switch (e.type) {
  826. case GTT_TYPE_PPGTT_PTE_4K_ENTRY:
  827. gvt_vdbg_mm("invalidate 4K entry\n");
  828. ppgtt_invalidate_pte(spt, &e);
  829. break;
  830. case GTT_TYPE_PPGTT_PTE_64K_ENTRY:
  831. /* We don't setup 64K shadow entry so far. */
  832. WARN(1, "suspicious 64K gtt entry\n");
  833. continue;
  834. case GTT_TYPE_PPGTT_PTE_2M_ENTRY:
  835. gvt_vdbg_mm("invalidate 2M entry\n");
  836. continue;
  837. case GTT_TYPE_PPGTT_PTE_1G_ENTRY:
  838. WARN(1, "GVT doesn't support 1GB page\n");
  839. continue;
  840. case GTT_TYPE_PPGTT_PML4_ENTRY:
  841. case GTT_TYPE_PPGTT_PDP_ENTRY:
  842. case GTT_TYPE_PPGTT_PDE_ENTRY:
  843. gvt_vdbg_mm("invalidate PMUL4/PDP/PDE entry\n");
  844. ret = ppgtt_invalidate_spt_by_shadow_entry(
  845. spt->vgpu, &e);
  846. if (ret)
  847. goto fail;
  848. break;
  849. default:
  850. GEM_BUG_ON(1);
  851. }
  852. }
  853. trace_spt_change(spt->vgpu->id, "release", spt,
  854. spt->guest_page.gfn, spt->shadow_page.type);
  855. ppgtt_free_spt(spt);
  856. return 0;
  857. fail:
  858. gvt_vgpu_err("fail: shadow page %p shadow entry 0x%llx type %d\n",
  859. spt, e.val64, e.type);
  860. return ret;
  861. }
  862. static bool vgpu_ips_enabled(struct intel_vgpu *vgpu)
  863. {
  864. struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
  865. if (INTEL_GEN(dev_priv) == 9 || INTEL_GEN(dev_priv) == 10) {
  866. u32 ips = vgpu_vreg_t(vgpu, GEN8_GAMW_ECO_DEV_RW_IA) &
  867. GAMW_ECO_ENABLE_64K_IPS_FIELD;
  868. return ips == GAMW_ECO_ENABLE_64K_IPS_FIELD;
  869. } else if (INTEL_GEN(dev_priv) >= 11) {
  870. /* 64K paging only controlled by IPS bit in PTE now. */
  871. return true;
  872. } else
  873. return false;
  874. }
  875. static int ppgtt_populate_spt(struct intel_vgpu_ppgtt_spt *spt);
  876. static struct intel_vgpu_ppgtt_spt *ppgtt_populate_spt_by_guest_entry(
  877. struct intel_vgpu *vgpu, struct intel_gvt_gtt_entry *we)
  878. {
  879. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  880. struct intel_vgpu_ppgtt_spt *spt = NULL;
  881. bool ips = false;
  882. int ret;
  883. GEM_BUG_ON(!gtt_type_is_pt(get_next_pt_type(we->type)));
  884. if (we->type == GTT_TYPE_PPGTT_PDE_ENTRY)
  885. ips = vgpu_ips_enabled(vgpu) && ops->test_ips(we);
  886. spt = intel_vgpu_find_spt_by_gfn(vgpu, ops->get_pfn(we));
  887. if (spt) {
  888. ppgtt_get_spt(spt);
  889. if (ips != spt->guest_page.pde_ips) {
  890. spt->guest_page.pde_ips = ips;
  891. gvt_dbg_mm("reshadow PDE since ips changed\n");
  892. clear_page(spt->shadow_page.vaddr);
  893. ret = ppgtt_populate_spt(spt);
  894. if (ret) {
  895. ppgtt_put_spt(spt);
  896. goto err;
  897. }
  898. }
  899. } else {
  900. int type = get_next_pt_type(we->type);
  901. spt = ppgtt_alloc_spt_gfn(vgpu, type, ops->get_pfn(we), ips);
  902. if (IS_ERR(spt)) {
  903. ret = PTR_ERR(spt);
  904. goto err;
  905. }
  906. ret = intel_vgpu_enable_page_track(vgpu, spt->guest_page.gfn);
  907. if (ret)
  908. goto err_free_spt;
  909. ret = ppgtt_populate_spt(spt);
  910. if (ret)
  911. goto err_free_spt;
  912. trace_spt_change(vgpu->id, "new", spt, spt->guest_page.gfn,
  913. spt->shadow_page.type);
  914. }
  915. return spt;
  916. err_free_spt:
  917. ppgtt_free_spt(spt);
  918. err:
  919. gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d\n",
  920. spt, we->val64, we->type);
  921. return ERR_PTR(ret);
  922. }
  923. static inline void ppgtt_generate_shadow_entry(struct intel_gvt_gtt_entry *se,
  924. struct intel_vgpu_ppgtt_spt *s, struct intel_gvt_gtt_entry *ge)
  925. {
  926. struct intel_gvt_gtt_pte_ops *ops = s->vgpu->gvt->gtt.pte_ops;
  927. se->type = ge->type;
  928. se->val64 = ge->val64;
  929. /* Because we always split 64KB pages, so clear IPS in shadow PDE. */
  930. if (se->type == GTT_TYPE_PPGTT_PDE_ENTRY)
  931. ops->clear_ips(se);
  932. ops->set_pfn(se, s->shadow_page.mfn);
  933. }
  934. /**
  935. * Check if can do 2M page
  936. * @vgpu: target vgpu
  937. * @entry: target pfn's gtt entry
  938. *
  939. * Return 1 if 2MB huge gtt shadowing is possilbe, 0 if miscondition,
  940. * negtive if found err.
  941. */
  942. static int is_2MB_gtt_possible(struct intel_vgpu *vgpu,
  943. struct intel_gvt_gtt_entry *entry)
  944. {
  945. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  946. unsigned long pfn;
  947. if (!HAS_PAGE_SIZES(vgpu->gvt->dev_priv, I915_GTT_PAGE_SIZE_2M))
  948. return 0;
  949. pfn = intel_gvt_hypervisor_gfn_to_mfn(vgpu, ops->get_pfn(entry));
  950. if (pfn == INTEL_GVT_INVALID_ADDR)
  951. return -EINVAL;
  952. return PageTransHuge(pfn_to_page(pfn));
  953. }
  954. static int split_2MB_gtt_entry(struct intel_vgpu *vgpu,
  955. struct intel_vgpu_ppgtt_spt *spt, unsigned long index,
  956. struct intel_gvt_gtt_entry *se)
  957. {
  958. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  959. struct intel_vgpu_ppgtt_spt *sub_spt;
  960. struct intel_gvt_gtt_entry sub_se;
  961. unsigned long start_gfn;
  962. dma_addr_t dma_addr;
  963. unsigned long sub_index;
  964. int ret;
  965. gvt_dbg_mm("Split 2M gtt entry, index %lu\n", index);
  966. start_gfn = ops->get_pfn(se);
  967. sub_spt = ppgtt_alloc_spt(vgpu, GTT_TYPE_PPGTT_PTE_PT);
  968. if (IS_ERR(sub_spt))
  969. return PTR_ERR(sub_spt);
  970. for_each_shadow_entry(sub_spt, &sub_se, sub_index) {
  971. ret = intel_gvt_hypervisor_dma_map_guest_page(vgpu,
  972. start_gfn + sub_index, PAGE_SIZE, &dma_addr);
  973. if (ret) {
  974. ppgtt_invalidate_spt(spt);
  975. return ret;
  976. }
  977. sub_se.val64 = se->val64;
  978. /* Copy the PAT field from PDE. */
  979. sub_se.val64 &= ~_PAGE_PAT;
  980. sub_se.val64 |= (se->val64 & _PAGE_PAT_LARGE) >> 5;
  981. ops->set_pfn(&sub_se, dma_addr >> PAGE_SHIFT);
  982. ppgtt_set_shadow_entry(sub_spt, &sub_se, sub_index);
  983. }
  984. /* Clear dirty field. */
  985. se->val64 &= ~_PAGE_DIRTY;
  986. ops->clear_pse(se);
  987. ops->clear_ips(se);
  988. ops->set_pfn(se, sub_spt->shadow_page.mfn);
  989. ppgtt_set_shadow_entry(spt, se, index);
  990. return 0;
  991. }
  992. static int split_64KB_gtt_entry(struct intel_vgpu *vgpu,
  993. struct intel_vgpu_ppgtt_spt *spt, unsigned long index,
  994. struct intel_gvt_gtt_entry *se)
  995. {
  996. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  997. struct intel_gvt_gtt_entry entry = *se;
  998. unsigned long start_gfn;
  999. dma_addr_t dma_addr;
  1000. int i, ret;
  1001. gvt_vdbg_mm("Split 64K gtt entry, index %lu\n", index);
  1002. GEM_BUG_ON(index % GTT_64K_PTE_STRIDE);
  1003. start_gfn = ops->get_pfn(se);
  1004. entry.type = GTT_TYPE_PPGTT_PTE_4K_ENTRY;
  1005. ops->set_64k_splited(&entry);
  1006. for (i = 0; i < GTT_64K_PTE_STRIDE; i++) {
  1007. ret = intel_gvt_hypervisor_dma_map_guest_page(vgpu,
  1008. start_gfn + i, PAGE_SIZE, &dma_addr);
  1009. if (ret)
  1010. return ret;
  1011. ops->set_pfn(&entry, dma_addr >> PAGE_SHIFT);
  1012. ppgtt_set_shadow_entry(spt, &entry, index + i);
  1013. }
  1014. return 0;
  1015. }
  1016. static int ppgtt_populate_shadow_entry(struct intel_vgpu *vgpu,
  1017. struct intel_vgpu_ppgtt_spt *spt, unsigned long index,
  1018. struct intel_gvt_gtt_entry *ge)
  1019. {
  1020. struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
  1021. struct intel_gvt_gtt_entry se = *ge;
  1022. unsigned long gfn, page_size = PAGE_SIZE;
  1023. dma_addr_t dma_addr;
  1024. int ret;
  1025. if (!pte_ops->test_present(ge))
  1026. return 0;
  1027. gfn = pte_ops->get_pfn(ge);
  1028. switch (ge->type) {
  1029. case GTT_TYPE_PPGTT_PTE_4K_ENTRY:
  1030. gvt_vdbg_mm("shadow 4K gtt entry\n");
  1031. break;
  1032. case GTT_TYPE_PPGTT_PTE_64K_ENTRY:
  1033. gvt_vdbg_mm("shadow 64K gtt entry\n");
  1034. /*
  1035. * The layout of 64K page is special, the page size is
  1036. * controlled by uper PDE. To be simple, we always split
  1037. * 64K page to smaller 4K pages in shadow PT.
  1038. */
  1039. return split_64KB_gtt_entry(vgpu, spt, index, &se);
  1040. case GTT_TYPE_PPGTT_PTE_2M_ENTRY:
  1041. gvt_vdbg_mm("shadow 2M gtt entry\n");
  1042. ret = is_2MB_gtt_possible(vgpu, ge);
  1043. if (ret == 0)
  1044. return split_2MB_gtt_entry(vgpu, spt, index, &se);
  1045. else if (ret < 0)
  1046. return ret;
  1047. page_size = I915_GTT_PAGE_SIZE_2M;
  1048. break;
  1049. case GTT_TYPE_PPGTT_PTE_1G_ENTRY:
  1050. gvt_vgpu_err("GVT doesn't support 1GB entry\n");
  1051. return -EINVAL;
  1052. default:
  1053. GEM_BUG_ON(1);
  1054. };
  1055. /* direct shadow */
  1056. ret = intel_gvt_hypervisor_dma_map_guest_page(vgpu, gfn, page_size,
  1057. &dma_addr);
  1058. if (ret)
  1059. return -ENXIO;
  1060. pte_ops->set_pfn(&se, dma_addr >> PAGE_SHIFT);
  1061. ppgtt_set_shadow_entry(spt, &se, index);
  1062. return 0;
  1063. }
  1064. static int ppgtt_populate_spt(struct intel_vgpu_ppgtt_spt *spt)
  1065. {
  1066. struct intel_vgpu *vgpu = spt->vgpu;
  1067. struct intel_gvt *gvt = vgpu->gvt;
  1068. struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
  1069. struct intel_vgpu_ppgtt_spt *s;
  1070. struct intel_gvt_gtt_entry se, ge;
  1071. unsigned long gfn, i;
  1072. int ret;
  1073. trace_spt_change(spt->vgpu->id, "born", spt,
  1074. spt->guest_page.gfn, spt->shadow_page.type);
  1075. for_each_present_guest_entry(spt, &ge, i) {
  1076. if (gtt_type_is_pt(get_next_pt_type(ge.type))) {
  1077. s = ppgtt_populate_spt_by_guest_entry(vgpu, &ge);
  1078. if (IS_ERR(s)) {
  1079. ret = PTR_ERR(s);
  1080. goto fail;
  1081. }
  1082. ppgtt_get_shadow_entry(spt, &se, i);
  1083. ppgtt_generate_shadow_entry(&se, s, &ge);
  1084. ppgtt_set_shadow_entry(spt, &se, i);
  1085. } else {
  1086. gfn = ops->get_pfn(&ge);
  1087. if (!intel_gvt_hypervisor_is_valid_gfn(vgpu, gfn)) {
  1088. ops->set_pfn(&se, gvt->gtt.scratch_mfn);
  1089. ppgtt_set_shadow_entry(spt, &se, i);
  1090. continue;
  1091. }
  1092. ret = ppgtt_populate_shadow_entry(vgpu, spt, i, &ge);
  1093. if (ret)
  1094. goto fail;
  1095. }
  1096. }
  1097. return 0;
  1098. fail:
  1099. gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d\n",
  1100. spt, ge.val64, ge.type);
  1101. return ret;
  1102. }
  1103. static int ppgtt_handle_guest_entry_removal(struct intel_vgpu_ppgtt_spt *spt,
  1104. struct intel_gvt_gtt_entry *se, unsigned long index)
  1105. {
  1106. struct intel_vgpu *vgpu = spt->vgpu;
  1107. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  1108. int ret;
  1109. trace_spt_guest_change(spt->vgpu->id, "remove", spt,
  1110. spt->shadow_page.type, se->val64, index);
  1111. gvt_vdbg_mm("destroy old shadow entry, type %d, index %lu, value %llx\n",
  1112. se->type, index, se->val64);
  1113. if (!ops->test_present(se))
  1114. return 0;
  1115. if (ops->get_pfn(se) ==
  1116. vgpu->gtt.scratch_pt[spt->shadow_page.type].page_mfn)
  1117. return 0;
  1118. if (gtt_type_is_pt(get_next_pt_type(se->type))) {
  1119. struct intel_vgpu_ppgtt_spt *s =
  1120. intel_vgpu_find_spt_by_mfn(vgpu, ops->get_pfn(se));
  1121. if (!s) {
  1122. gvt_vgpu_err("fail to find guest page\n");
  1123. ret = -ENXIO;
  1124. goto fail;
  1125. }
  1126. ret = ppgtt_invalidate_spt(s);
  1127. if (ret)
  1128. goto fail;
  1129. } else {
  1130. /* We don't setup 64K shadow entry so far. */
  1131. WARN(se->type == GTT_TYPE_PPGTT_PTE_64K_ENTRY,
  1132. "suspicious 64K entry\n");
  1133. ppgtt_invalidate_pte(spt, se);
  1134. }
  1135. return 0;
  1136. fail:
  1137. gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d\n",
  1138. spt, se->val64, se->type);
  1139. return ret;
  1140. }
  1141. static int ppgtt_handle_guest_entry_add(struct intel_vgpu_ppgtt_spt *spt,
  1142. struct intel_gvt_gtt_entry *we, unsigned long index)
  1143. {
  1144. struct intel_vgpu *vgpu = spt->vgpu;
  1145. struct intel_gvt_gtt_entry m;
  1146. struct intel_vgpu_ppgtt_spt *s;
  1147. int ret;
  1148. trace_spt_guest_change(spt->vgpu->id, "add", spt, spt->shadow_page.type,
  1149. we->val64, index);
  1150. gvt_vdbg_mm("add shadow entry: type %d, index %lu, value %llx\n",
  1151. we->type, index, we->val64);
  1152. if (gtt_type_is_pt(get_next_pt_type(we->type))) {
  1153. s = ppgtt_populate_spt_by_guest_entry(vgpu, we);
  1154. if (IS_ERR(s)) {
  1155. ret = PTR_ERR(s);
  1156. goto fail;
  1157. }
  1158. ppgtt_get_shadow_entry(spt, &m, index);
  1159. ppgtt_generate_shadow_entry(&m, s, we);
  1160. ppgtt_set_shadow_entry(spt, &m, index);
  1161. } else {
  1162. ret = ppgtt_populate_shadow_entry(vgpu, spt, index, we);
  1163. if (ret)
  1164. goto fail;
  1165. }
  1166. return 0;
  1167. fail:
  1168. gvt_vgpu_err("fail: spt %p guest entry 0x%llx type %d\n",
  1169. spt, we->val64, we->type);
  1170. return ret;
  1171. }
  1172. static int sync_oos_page(struct intel_vgpu *vgpu,
  1173. struct intel_vgpu_oos_page *oos_page)
  1174. {
  1175. const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
  1176. struct intel_gvt *gvt = vgpu->gvt;
  1177. struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
  1178. struct intel_vgpu_ppgtt_spt *spt = oos_page->spt;
  1179. struct intel_gvt_gtt_entry old, new;
  1180. int index;
  1181. int ret;
  1182. trace_oos_change(vgpu->id, "sync", oos_page->id,
  1183. spt, spt->guest_page.type);
  1184. old.type = new.type = get_entry_type(spt->guest_page.type);
  1185. old.val64 = new.val64 = 0;
  1186. for (index = 0; index < (I915_GTT_PAGE_SIZE >>
  1187. info->gtt_entry_size_shift); index++) {
  1188. ops->get_entry(oos_page->mem, &old, index, false, 0, vgpu);
  1189. ops->get_entry(NULL, &new, index, true,
  1190. spt->guest_page.gfn << PAGE_SHIFT, vgpu);
  1191. if (old.val64 == new.val64
  1192. && !test_and_clear_bit(index, spt->post_shadow_bitmap))
  1193. continue;
  1194. trace_oos_sync(vgpu->id, oos_page->id,
  1195. spt, spt->guest_page.type,
  1196. new.val64, index);
  1197. ret = ppgtt_populate_shadow_entry(vgpu, spt, index, &new);
  1198. if (ret)
  1199. return ret;
  1200. ops->set_entry(oos_page->mem, &new, index, false, 0, vgpu);
  1201. }
  1202. spt->guest_page.write_cnt = 0;
  1203. list_del_init(&spt->post_shadow_list);
  1204. return 0;
  1205. }
  1206. static int detach_oos_page(struct intel_vgpu *vgpu,
  1207. struct intel_vgpu_oos_page *oos_page)
  1208. {
  1209. struct intel_gvt *gvt = vgpu->gvt;
  1210. struct intel_vgpu_ppgtt_spt *spt = oos_page->spt;
  1211. trace_oos_change(vgpu->id, "detach", oos_page->id,
  1212. spt, spt->guest_page.type);
  1213. spt->guest_page.write_cnt = 0;
  1214. spt->guest_page.oos_page = NULL;
  1215. oos_page->spt = NULL;
  1216. list_del_init(&oos_page->vm_list);
  1217. list_move_tail(&oos_page->list, &gvt->gtt.oos_page_free_list_head);
  1218. return 0;
  1219. }
  1220. static int attach_oos_page(struct intel_vgpu_oos_page *oos_page,
  1221. struct intel_vgpu_ppgtt_spt *spt)
  1222. {
  1223. struct intel_gvt *gvt = spt->vgpu->gvt;
  1224. int ret;
  1225. ret = intel_gvt_hypervisor_read_gpa(spt->vgpu,
  1226. spt->guest_page.gfn << I915_GTT_PAGE_SHIFT,
  1227. oos_page->mem, I915_GTT_PAGE_SIZE);
  1228. if (ret)
  1229. return ret;
  1230. oos_page->spt = spt;
  1231. spt->guest_page.oos_page = oos_page;
  1232. list_move_tail(&oos_page->list, &gvt->gtt.oos_page_use_list_head);
  1233. trace_oos_change(spt->vgpu->id, "attach", oos_page->id,
  1234. spt, spt->guest_page.type);
  1235. return 0;
  1236. }
  1237. static int ppgtt_set_guest_page_sync(struct intel_vgpu_ppgtt_spt *spt)
  1238. {
  1239. struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page;
  1240. int ret;
  1241. ret = intel_vgpu_enable_page_track(spt->vgpu, spt->guest_page.gfn);
  1242. if (ret)
  1243. return ret;
  1244. trace_oos_change(spt->vgpu->id, "set page sync", oos_page->id,
  1245. spt, spt->guest_page.type);
  1246. list_del_init(&oos_page->vm_list);
  1247. return sync_oos_page(spt->vgpu, oos_page);
  1248. }
  1249. static int ppgtt_allocate_oos_page(struct intel_vgpu_ppgtt_spt *spt)
  1250. {
  1251. struct intel_gvt *gvt = spt->vgpu->gvt;
  1252. struct intel_gvt_gtt *gtt = &gvt->gtt;
  1253. struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page;
  1254. int ret;
  1255. WARN(oos_page, "shadow PPGTT page has already has a oos page\n");
  1256. if (list_empty(&gtt->oos_page_free_list_head)) {
  1257. oos_page = container_of(gtt->oos_page_use_list_head.next,
  1258. struct intel_vgpu_oos_page, list);
  1259. ret = ppgtt_set_guest_page_sync(oos_page->spt);
  1260. if (ret)
  1261. return ret;
  1262. ret = detach_oos_page(spt->vgpu, oos_page);
  1263. if (ret)
  1264. return ret;
  1265. } else
  1266. oos_page = container_of(gtt->oos_page_free_list_head.next,
  1267. struct intel_vgpu_oos_page, list);
  1268. return attach_oos_page(oos_page, spt);
  1269. }
  1270. static int ppgtt_set_guest_page_oos(struct intel_vgpu_ppgtt_spt *spt)
  1271. {
  1272. struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page;
  1273. if (WARN(!oos_page, "shadow PPGTT page should have a oos page\n"))
  1274. return -EINVAL;
  1275. trace_oos_change(spt->vgpu->id, "set page out of sync", oos_page->id,
  1276. spt, spt->guest_page.type);
  1277. list_add_tail(&oos_page->vm_list, &spt->vgpu->gtt.oos_page_list_head);
  1278. return intel_vgpu_disable_page_track(spt->vgpu, spt->guest_page.gfn);
  1279. }
  1280. /**
  1281. * intel_vgpu_sync_oos_pages - sync all the out-of-synced shadow for vGPU
  1282. * @vgpu: a vGPU
  1283. *
  1284. * This function is called before submitting a guest workload to host,
  1285. * to sync all the out-of-synced shadow for vGPU
  1286. *
  1287. * Returns:
  1288. * Zero on success, negative error code if failed.
  1289. */
  1290. int intel_vgpu_sync_oos_pages(struct intel_vgpu *vgpu)
  1291. {
  1292. struct list_head *pos, *n;
  1293. struct intel_vgpu_oos_page *oos_page;
  1294. int ret;
  1295. if (!enable_out_of_sync)
  1296. return 0;
  1297. list_for_each_safe(pos, n, &vgpu->gtt.oos_page_list_head) {
  1298. oos_page = container_of(pos,
  1299. struct intel_vgpu_oos_page, vm_list);
  1300. ret = ppgtt_set_guest_page_sync(oos_page->spt);
  1301. if (ret)
  1302. return ret;
  1303. }
  1304. return 0;
  1305. }
  1306. /*
  1307. * The heart of PPGTT shadow page table.
  1308. */
  1309. static int ppgtt_handle_guest_write_page_table(
  1310. struct intel_vgpu_ppgtt_spt *spt,
  1311. struct intel_gvt_gtt_entry *we, unsigned long index)
  1312. {
  1313. struct intel_vgpu *vgpu = spt->vgpu;
  1314. int type = spt->shadow_page.type;
  1315. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  1316. struct intel_gvt_gtt_entry old_se;
  1317. int new_present;
  1318. int i, ret;
  1319. new_present = ops->test_present(we);
  1320. /*
  1321. * Adding the new entry first and then removing the old one, that can
  1322. * guarantee the ppgtt table is validated during the window between
  1323. * adding and removal.
  1324. */
  1325. ppgtt_get_shadow_entry(spt, &old_se, index);
  1326. if (new_present) {
  1327. ret = ppgtt_handle_guest_entry_add(spt, we, index);
  1328. if (ret)
  1329. goto fail;
  1330. }
  1331. ret = ppgtt_handle_guest_entry_removal(spt, &old_se, index);
  1332. if (ret)
  1333. goto fail;
  1334. if (!new_present) {
  1335. /* For 64KB splited entries, we need clear them all. */
  1336. if (ops->test_64k_splited(&old_se) &&
  1337. !(index % GTT_64K_PTE_STRIDE)) {
  1338. gvt_vdbg_mm("remove splited 64K shadow entries\n");
  1339. for (i = 0; i < GTT_64K_PTE_STRIDE; i++) {
  1340. ops->clear_64k_splited(&old_se);
  1341. ops->set_pfn(&old_se,
  1342. vgpu->gtt.scratch_pt[type].page_mfn);
  1343. ppgtt_set_shadow_entry(spt, &old_se, index + i);
  1344. }
  1345. } else if (old_se.type == GTT_TYPE_PPGTT_PTE_2M_ENTRY ||
  1346. old_se.type == GTT_TYPE_PPGTT_PTE_1G_ENTRY) {
  1347. ops->clear_pse(&old_se);
  1348. ops->set_pfn(&old_se,
  1349. vgpu->gtt.scratch_pt[type].page_mfn);
  1350. ppgtt_set_shadow_entry(spt, &old_se, index);
  1351. } else {
  1352. ops->set_pfn(&old_se,
  1353. vgpu->gtt.scratch_pt[type].page_mfn);
  1354. ppgtt_set_shadow_entry(spt, &old_se, index);
  1355. }
  1356. }
  1357. return 0;
  1358. fail:
  1359. gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d.\n",
  1360. spt, we->val64, we->type);
  1361. return ret;
  1362. }
  1363. static inline bool can_do_out_of_sync(struct intel_vgpu_ppgtt_spt *spt)
  1364. {
  1365. return enable_out_of_sync
  1366. && gtt_type_is_pte_pt(spt->guest_page.type)
  1367. && spt->guest_page.write_cnt >= 2;
  1368. }
  1369. static void ppgtt_set_post_shadow(struct intel_vgpu_ppgtt_spt *spt,
  1370. unsigned long index)
  1371. {
  1372. set_bit(index, spt->post_shadow_bitmap);
  1373. if (!list_empty(&spt->post_shadow_list))
  1374. return;
  1375. list_add_tail(&spt->post_shadow_list,
  1376. &spt->vgpu->gtt.post_shadow_list_head);
  1377. }
  1378. /**
  1379. * intel_vgpu_flush_post_shadow - flush the post shadow transactions
  1380. * @vgpu: a vGPU
  1381. *
  1382. * This function is called before submitting a guest workload to host,
  1383. * to flush all the post shadows for a vGPU.
  1384. *
  1385. * Returns:
  1386. * Zero on success, negative error code if failed.
  1387. */
  1388. int intel_vgpu_flush_post_shadow(struct intel_vgpu *vgpu)
  1389. {
  1390. struct list_head *pos, *n;
  1391. struct intel_vgpu_ppgtt_spt *spt;
  1392. struct intel_gvt_gtt_entry ge;
  1393. unsigned long index;
  1394. int ret;
  1395. list_for_each_safe(pos, n, &vgpu->gtt.post_shadow_list_head) {
  1396. spt = container_of(pos, struct intel_vgpu_ppgtt_spt,
  1397. post_shadow_list);
  1398. for_each_set_bit(index, spt->post_shadow_bitmap,
  1399. GTT_ENTRY_NUM_IN_ONE_PAGE) {
  1400. ppgtt_get_guest_entry(spt, &ge, index);
  1401. ret = ppgtt_handle_guest_write_page_table(spt,
  1402. &ge, index);
  1403. if (ret)
  1404. return ret;
  1405. clear_bit(index, spt->post_shadow_bitmap);
  1406. }
  1407. list_del_init(&spt->post_shadow_list);
  1408. }
  1409. return 0;
  1410. }
  1411. static int ppgtt_handle_guest_write_page_table_bytes(
  1412. struct intel_vgpu_ppgtt_spt *spt,
  1413. u64 pa, void *p_data, int bytes)
  1414. {
  1415. struct intel_vgpu *vgpu = spt->vgpu;
  1416. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  1417. const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
  1418. struct intel_gvt_gtt_entry we, se;
  1419. unsigned long index;
  1420. int ret;
  1421. index = (pa & (PAGE_SIZE - 1)) >> info->gtt_entry_size_shift;
  1422. ppgtt_get_guest_entry(spt, &we, index);
  1423. /*
  1424. * For page table which has 64K gtt entry, only PTE#0, PTE#16,
  1425. * PTE#32, ... PTE#496 are used. Unused PTEs update should be
  1426. * ignored.
  1427. */
  1428. if (we.type == GTT_TYPE_PPGTT_PTE_64K_ENTRY &&
  1429. (index % GTT_64K_PTE_STRIDE)) {
  1430. gvt_vdbg_mm("Ignore write to unused PTE entry, index %lu\n",
  1431. index);
  1432. return 0;
  1433. }
  1434. if (bytes == info->gtt_entry_size) {
  1435. ret = ppgtt_handle_guest_write_page_table(spt, &we, index);
  1436. if (ret)
  1437. return ret;
  1438. } else {
  1439. if (!test_bit(index, spt->post_shadow_bitmap)) {
  1440. int type = spt->shadow_page.type;
  1441. ppgtt_get_shadow_entry(spt, &se, index);
  1442. ret = ppgtt_handle_guest_entry_removal(spt, &se, index);
  1443. if (ret)
  1444. return ret;
  1445. ops->set_pfn(&se, vgpu->gtt.scratch_pt[type].page_mfn);
  1446. ppgtt_set_shadow_entry(spt, &se, index);
  1447. }
  1448. ppgtt_set_post_shadow(spt, index);
  1449. }
  1450. if (!enable_out_of_sync)
  1451. return 0;
  1452. spt->guest_page.write_cnt++;
  1453. if (spt->guest_page.oos_page)
  1454. ops->set_entry(spt->guest_page.oos_page->mem, &we, index,
  1455. false, 0, vgpu);
  1456. if (can_do_out_of_sync(spt)) {
  1457. if (!spt->guest_page.oos_page)
  1458. ppgtt_allocate_oos_page(spt);
  1459. ret = ppgtt_set_guest_page_oos(spt);
  1460. if (ret < 0)
  1461. return ret;
  1462. }
  1463. return 0;
  1464. }
  1465. static void invalidate_ppgtt_mm(struct intel_vgpu_mm *mm)
  1466. {
  1467. struct intel_vgpu *vgpu = mm->vgpu;
  1468. struct intel_gvt *gvt = vgpu->gvt;
  1469. struct intel_gvt_gtt *gtt = &gvt->gtt;
  1470. struct intel_gvt_gtt_pte_ops *ops = gtt->pte_ops;
  1471. struct intel_gvt_gtt_entry se;
  1472. int index;
  1473. if (!mm->ppgtt_mm.shadowed)
  1474. return;
  1475. for (index = 0; index < ARRAY_SIZE(mm->ppgtt_mm.shadow_pdps); index++) {
  1476. ppgtt_get_shadow_root_entry(mm, &se, index);
  1477. if (!ops->test_present(&se))
  1478. continue;
  1479. ppgtt_invalidate_spt_by_shadow_entry(vgpu, &se);
  1480. se.val64 = 0;
  1481. ppgtt_set_shadow_root_entry(mm, &se, index);
  1482. trace_spt_guest_change(vgpu->id, "destroy root pointer",
  1483. NULL, se.type, se.val64, index);
  1484. }
  1485. mm->ppgtt_mm.shadowed = false;
  1486. }
  1487. static int shadow_ppgtt_mm(struct intel_vgpu_mm *mm)
  1488. {
  1489. struct intel_vgpu *vgpu = mm->vgpu;
  1490. struct intel_gvt *gvt = vgpu->gvt;
  1491. struct intel_gvt_gtt *gtt = &gvt->gtt;
  1492. struct intel_gvt_gtt_pte_ops *ops = gtt->pte_ops;
  1493. struct intel_vgpu_ppgtt_spt *spt;
  1494. struct intel_gvt_gtt_entry ge, se;
  1495. int index, ret;
  1496. if (mm->ppgtt_mm.shadowed)
  1497. return 0;
  1498. mm->ppgtt_mm.shadowed = true;
  1499. for (index = 0; index < ARRAY_SIZE(mm->ppgtt_mm.guest_pdps); index++) {
  1500. ppgtt_get_guest_root_entry(mm, &ge, index);
  1501. if (!ops->test_present(&ge))
  1502. continue;
  1503. trace_spt_guest_change(vgpu->id, __func__, NULL,
  1504. ge.type, ge.val64, index);
  1505. spt = ppgtt_populate_spt_by_guest_entry(vgpu, &ge);
  1506. if (IS_ERR(spt)) {
  1507. gvt_vgpu_err("fail to populate guest root pointer\n");
  1508. ret = PTR_ERR(spt);
  1509. goto fail;
  1510. }
  1511. ppgtt_generate_shadow_entry(&se, spt, &ge);
  1512. ppgtt_set_shadow_root_entry(mm, &se, index);
  1513. trace_spt_guest_change(vgpu->id, "populate root pointer",
  1514. NULL, se.type, se.val64, index);
  1515. }
  1516. return 0;
  1517. fail:
  1518. invalidate_ppgtt_mm(mm);
  1519. return ret;
  1520. }
  1521. static struct intel_vgpu_mm *vgpu_alloc_mm(struct intel_vgpu *vgpu)
  1522. {
  1523. struct intel_vgpu_mm *mm;
  1524. mm = kzalloc(sizeof(*mm), GFP_KERNEL);
  1525. if (!mm)
  1526. return NULL;
  1527. mm->vgpu = vgpu;
  1528. kref_init(&mm->ref);
  1529. atomic_set(&mm->pincount, 0);
  1530. return mm;
  1531. }
  1532. static void vgpu_free_mm(struct intel_vgpu_mm *mm)
  1533. {
  1534. kfree(mm);
  1535. }
  1536. /**
  1537. * intel_vgpu_create_ppgtt_mm - create a ppgtt mm object for a vGPU
  1538. * @vgpu: a vGPU
  1539. * @root_entry_type: ppgtt root entry type
  1540. * @pdps: guest pdps.
  1541. *
  1542. * This function is used to create a ppgtt mm object for a vGPU.
  1543. *
  1544. * Returns:
  1545. * Zero on success, negative error code in pointer if failed.
  1546. */
  1547. struct intel_vgpu_mm *intel_vgpu_create_ppgtt_mm(struct intel_vgpu *vgpu,
  1548. intel_gvt_gtt_type_t root_entry_type, u64 pdps[])
  1549. {
  1550. struct intel_gvt *gvt = vgpu->gvt;
  1551. struct intel_vgpu_mm *mm;
  1552. int ret;
  1553. mm = vgpu_alloc_mm(vgpu);
  1554. if (!mm)
  1555. return ERR_PTR(-ENOMEM);
  1556. mm->type = INTEL_GVT_MM_PPGTT;
  1557. GEM_BUG_ON(root_entry_type != GTT_TYPE_PPGTT_ROOT_L3_ENTRY &&
  1558. root_entry_type != GTT_TYPE_PPGTT_ROOT_L4_ENTRY);
  1559. mm->ppgtt_mm.root_entry_type = root_entry_type;
  1560. INIT_LIST_HEAD(&mm->ppgtt_mm.list);
  1561. INIT_LIST_HEAD(&mm->ppgtt_mm.lru_list);
  1562. if (root_entry_type == GTT_TYPE_PPGTT_ROOT_L4_ENTRY)
  1563. mm->ppgtt_mm.guest_pdps[0] = pdps[0];
  1564. else
  1565. memcpy(mm->ppgtt_mm.guest_pdps, pdps,
  1566. sizeof(mm->ppgtt_mm.guest_pdps));
  1567. ret = shadow_ppgtt_mm(mm);
  1568. if (ret) {
  1569. gvt_vgpu_err("failed to shadow ppgtt mm\n");
  1570. vgpu_free_mm(mm);
  1571. return ERR_PTR(ret);
  1572. }
  1573. list_add_tail(&mm->ppgtt_mm.list, &vgpu->gtt.ppgtt_mm_list_head);
  1574. list_add_tail(&mm->ppgtt_mm.lru_list, &gvt->gtt.ppgtt_mm_lru_list_head);
  1575. return mm;
  1576. }
  1577. static struct intel_vgpu_mm *intel_vgpu_create_ggtt_mm(struct intel_vgpu *vgpu)
  1578. {
  1579. struct intel_vgpu_mm *mm;
  1580. unsigned long nr_entries;
  1581. mm = vgpu_alloc_mm(vgpu);
  1582. if (!mm)
  1583. return ERR_PTR(-ENOMEM);
  1584. mm->type = INTEL_GVT_MM_GGTT;
  1585. nr_entries = gvt_ggtt_gm_sz(vgpu->gvt) >> I915_GTT_PAGE_SHIFT;
  1586. mm->ggtt_mm.virtual_ggtt =
  1587. vzalloc(array_size(nr_entries,
  1588. vgpu->gvt->device_info.gtt_entry_size));
  1589. if (!mm->ggtt_mm.virtual_ggtt) {
  1590. vgpu_free_mm(mm);
  1591. return ERR_PTR(-ENOMEM);
  1592. }
  1593. return mm;
  1594. }
  1595. /**
  1596. * _intel_vgpu_mm_release - destroy a mm object
  1597. * @mm_ref: a kref object
  1598. *
  1599. * This function is used to destroy a mm object for vGPU
  1600. *
  1601. */
  1602. void _intel_vgpu_mm_release(struct kref *mm_ref)
  1603. {
  1604. struct intel_vgpu_mm *mm = container_of(mm_ref, typeof(*mm), ref);
  1605. if (GEM_WARN_ON(atomic_read(&mm->pincount)))
  1606. gvt_err("vgpu mm pin count bug detected\n");
  1607. if (mm->type == INTEL_GVT_MM_PPGTT) {
  1608. list_del(&mm->ppgtt_mm.list);
  1609. list_del(&mm->ppgtt_mm.lru_list);
  1610. invalidate_ppgtt_mm(mm);
  1611. } else {
  1612. vfree(mm->ggtt_mm.virtual_ggtt);
  1613. }
  1614. vgpu_free_mm(mm);
  1615. }
  1616. /**
  1617. * intel_vgpu_unpin_mm - decrease the pin count of a vGPU mm object
  1618. * @mm: a vGPU mm object
  1619. *
  1620. * This function is called when user doesn't want to use a vGPU mm object
  1621. */
  1622. void intel_vgpu_unpin_mm(struct intel_vgpu_mm *mm)
  1623. {
  1624. atomic_dec(&mm->pincount);
  1625. }
  1626. /**
  1627. * intel_vgpu_pin_mm - increase the pin count of a vGPU mm object
  1628. * @mm: target vgpu mm
  1629. *
  1630. * This function is called when user wants to use a vGPU mm object. If this
  1631. * mm object hasn't been shadowed yet, the shadow will be populated at this
  1632. * time.
  1633. *
  1634. * Returns:
  1635. * Zero on success, negative error code if failed.
  1636. */
  1637. int intel_vgpu_pin_mm(struct intel_vgpu_mm *mm)
  1638. {
  1639. int ret;
  1640. atomic_inc(&mm->pincount);
  1641. if (mm->type == INTEL_GVT_MM_PPGTT) {
  1642. ret = shadow_ppgtt_mm(mm);
  1643. if (ret)
  1644. return ret;
  1645. list_move_tail(&mm->ppgtt_mm.lru_list,
  1646. &mm->vgpu->gvt->gtt.ppgtt_mm_lru_list_head);
  1647. }
  1648. return 0;
  1649. }
  1650. static int reclaim_one_ppgtt_mm(struct intel_gvt *gvt)
  1651. {
  1652. struct intel_vgpu_mm *mm;
  1653. struct list_head *pos, *n;
  1654. list_for_each_safe(pos, n, &gvt->gtt.ppgtt_mm_lru_list_head) {
  1655. mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.lru_list);
  1656. if (atomic_read(&mm->pincount))
  1657. continue;
  1658. list_del_init(&mm->ppgtt_mm.lru_list);
  1659. invalidate_ppgtt_mm(mm);
  1660. return 1;
  1661. }
  1662. return 0;
  1663. }
  1664. /*
  1665. * GMA translation APIs.
  1666. */
  1667. static inline int ppgtt_get_next_level_entry(struct intel_vgpu_mm *mm,
  1668. struct intel_gvt_gtt_entry *e, unsigned long index, bool guest)
  1669. {
  1670. struct intel_vgpu *vgpu = mm->vgpu;
  1671. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  1672. struct intel_vgpu_ppgtt_spt *s;
  1673. s = intel_vgpu_find_spt_by_mfn(vgpu, ops->get_pfn(e));
  1674. if (!s)
  1675. return -ENXIO;
  1676. if (!guest)
  1677. ppgtt_get_shadow_entry(s, e, index);
  1678. else
  1679. ppgtt_get_guest_entry(s, e, index);
  1680. return 0;
  1681. }
  1682. /**
  1683. * intel_vgpu_gma_to_gpa - translate a gma to GPA
  1684. * @mm: mm object. could be a PPGTT or GGTT mm object
  1685. * @gma: graphics memory address in this mm object
  1686. *
  1687. * This function is used to translate a graphics memory address in specific
  1688. * graphics memory space to guest physical address.
  1689. *
  1690. * Returns:
  1691. * Guest physical address on success, INTEL_GVT_INVALID_ADDR if failed.
  1692. */
  1693. unsigned long intel_vgpu_gma_to_gpa(struct intel_vgpu_mm *mm, unsigned long gma)
  1694. {
  1695. struct intel_vgpu *vgpu = mm->vgpu;
  1696. struct intel_gvt *gvt = vgpu->gvt;
  1697. struct intel_gvt_gtt_pte_ops *pte_ops = gvt->gtt.pte_ops;
  1698. struct intel_gvt_gtt_gma_ops *gma_ops = gvt->gtt.gma_ops;
  1699. unsigned long gpa = INTEL_GVT_INVALID_ADDR;
  1700. unsigned long gma_index[4];
  1701. struct intel_gvt_gtt_entry e;
  1702. int i, levels = 0;
  1703. int ret;
  1704. GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT &&
  1705. mm->type != INTEL_GVT_MM_PPGTT);
  1706. if (mm->type == INTEL_GVT_MM_GGTT) {
  1707. if (!vgpu_gmadr_is_valid(vgpu, gma))
  1708. goto err;
  1709. ggtt_get_guest_entry(mm, &e,
  1710. gma_ops->gma_to_ggtt_pte_index(gma));
  1711. gpa = (pte_ops->get_pfn(&e) << I915_GTT_PAGE_SHIFT)
  1712. + (gma & ~I915_GTT_PAGE_MASK);
  1713. trace_gma_translate(vgpu->id, "ggtt", 0, 0, gma, gpa);
  1714. } else {
  1715. switch (mm->ppgtt_mm.root_entry_type) {
  1716. case GTT_TYPE_PPGTT_ROOT_L4_ENTRY:
  1717. ppgtt_get_shadow_root_entry(mm, &e, 0);
  1718. gma_index[0] = gma_ops->gma_to_pml4_index(gma);
  1719. gma_index[1] = gma_ops->gma_to_l4_pdp_index(gma);
  1720. gma_index[2] = gma_ops->gma_to_pde_index(gma);
  1721. gma_index[3] = gma_ops->gma_to_pte_index(gma);
  1722. levels = 4;
  1723. break;
  1724. case GTT_TYPE_PPGTT_ROOT_L3_ENTRY:
  1725. ppgtt_get_shadow_root_entry(mm, &e,
  1726. gma_ops->gma_to_l3_pdp_index(gma));
  1727. gma_index[0] = gma_ops->gma_to_pde_index(gma);
  1728. gma_index[1] = gma_ops->gma_to_pte_index(gma);
  1729. levels = 2;
  1730. break;
  1731. default:
  1732. GEM_BUG_ON(1);
  1733. }
  1734. /* walk the shadow page table and get gpa from guest entry */
  1735. for (i = 0; i < levels; i++) {
  1736. ret = ppgtt_get_next_level_entry(mm, &e, gma_index[i],
  1737. (i == levels - 1));
  1738. if (ret)
  1739. goto err;
  1740. if (!pte_ops->test_present(&e)) {
  1741. gvt_dbg_core("GMA 0x%lx is not present\n", gma);
  1742. goto err;
  1743. }
  1744. }
  1745. gpa = (pte_ops->get_pfn(&e) << I915_GTT_PAGE_SHIFT) +
  1746. (gma & ~I915_GTT_PAGE_MASK);
  1747. trace_gma_translate(vgpu->id, "ppgtt", 0,
  1748. mm->ppgtt_mm.root_entry_type, gma, gpa);
  1749. }
  1750. return gpa;
  1751. err:
  1752. gvt_vgpu_err("invalid mm type: %d gma %lx\n", mm->type, gma);
  1753. return INTEL_GVT_INVALID_ADDR;
  1754. }
  1755. static int emulate_ggtt_mmio_read(struct intel_vgpu *vgpu,
  1756. unsigned int off, void *p_data, unsigned int bytes)
  1757. {
  1758. struct intel_vgpu_mm *ggtt_mm = vgpu->gtt.ggtt_mm;
  1759. const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
  1760. unsigned long index = off >> info->gtt_entry_size_shift;
  1761. struct intel_gvt_gtt_entry e;
  1762. if (bytes != 4 && bytes != 8)
  1763. return -EINVAL;
  1764. ggtt_get_guest_entry(ggtt_mm, &e, index);
  1765. memcpy(p_data, (void *)&e.val64 + (off & (info->gtt_entry_size - 1)),
  1766. bytes);
  1767. return 0;
  1768. }
  1769. /**
  1770. * intel_vgpu_emulate_gtt_mmio_read - emulate GTT MMIO register read
  1771. * @vgpu: a vGPU
  1772. * @off: register offset
  1773. * @p_data: data will be returned to guest
  1774. * @bytes: data length
  1775. *
  1776. * This function is used to emulate the GTT MMIO register read
  1777. *
  1778. * Returns:
  1779. * Zero on success, error code if failed.
  1780. */
  1781. int intel_vgpu_emulate_ggtt_mmio_read(struct intel_vgpu *vgpu, unsigned int off,
  1782. void *p_data, unsigned int bytes)
  1783. {
  1784. const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
  1785. int ret;
  1786. if (bytes != 4 && bytes != 8)
  1787. return -EINVAL;
  1788. off -= info->gtt_start_offset;
  1789. ret = emulate_ggtt_mmio_read(vgpu, off, p_data, bytes);
  1790. return ret;
  1791. }
  1792. static void ggtt_invalidate_pte(struct intel_vgpu *vgpu,
  1793. struct intel_gvt_gtt_entry *entry)
  1794. {
  1795. struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
  1796. unsigned long pfn;
  1797. pfn = pte_ops->get_pfn(entry);
  1798. if (pfn != vgpu->gvt->gtt.scratch_mfn)
  1799. intel_gvt_hypervisor_dma_unmap_guest_page(vgpu,
  1800. pfn << PAGE_SHIFT);
  1801. }
  1802. static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
  1803. void *p_data, unsigned int bytes)
  1804. {
  1805. struct intel_gvt *gvt = vgpu->gvt;
  1806. const struct intel_gvt_device_info *info = &gvt->device_info;
  1807. struct intel_vgpu_mm *ggtt_mm = vgpu->gtt.ggtt_mm;
  1808. struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
  1809. unsigned long g_gtt_index = off >> info->gtt_entry_size_shift;
  1810. unsigned long gma, gfn;
  1811. struct intel_gvt_gtt_entry e, m;
  1812. dma_addr_t dma_addr;
  1813. int ret;
  1814. struct intel_gvt_partial_pte *partial_pte, *pos, *n;
  1815. bool partial_update = false;
  1816. if (bytes != 4 && bytes != 8)
  1817. return -EINVAL;
  1818. gma = g_gtt_index << I915_GTT_PAGE_SHIFT;
  1819. /* the VM may configure the whole GM space when ballooning is used */
  1820. if (!vgpu_gmadr_is_valid(vgpu, gma))
  1821. return 0;
  1822. e.type = GTT_TYPE_GGTT_PTE;
  1823. memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data,
  1824. bytes);
  1825. /* If ggtt entry size is 8 bytes, and it's split into two 4 bytes
  1826. * write, save the first 4 bytes in a list and update virtual
  1827. * PTE. Only update shadow PTE when the second 4 bytes comes.
  1828. */
  1829. if (bytes < info->gtt_entry_size) {
  1830. bool found = false;
  1831. list_for_each_entry_safe(pos, n,
  1832. &ggtt_mm->ggtt_mm.partial_pte_list, list) {
  1833. if (g_gtt_index == pos->offset >>
  1834. info->gtt_entry_size_shift) {
  1835. if (off != pos->offset) {
  1836. /* the second partial part*/
  1837. int last_off = pos->offset &
  1838. (info->gtt_entry_size - 1);
  1839. memcpy((void *)&e.val64 + last_off,
  1840. (void *)&pos->data + last_off,
  1841. bytes);
  1842. list_del(&pos->list);
  1843. kfree(pos);
  1844. found = true;
  1845. break;
  1846. }
  1847. /* update of the first partial part */
  1848. pos->data = e.val64;
  1849. ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
  1850. return 0;
  1851. }
  1852. }
  1853. if (!found) {
  1854. /* the first partial part */
  1855. partial_pte = kzalloc(sizeof(*partial_pte), GFP_KERNEL);
  1856. if (!partial_pte)
  1857. return -ENOMEM;
  1858. partial_pte->offset = off;
  1859. partial_pte->data = e.val64;
  1860. list_add_tail(&partial_pte->list,
  1861. &ggtt_mm->ggtt_mm.partial_pte_list);
  1862. partial_update = true;
  1863. }
  1864. }
  1865. if (!partial_update && (ops->test_present(&e))) {
  1866. gfn = ops->get_pfn(&e);
  1867. m = e;
  1868. /* one PTE update may be issued in multiple writes and the
  1869. * first write may not construct a valid gfn
  1870. */
  1871. if (!intel_gvt_hypervisor_is_valid_gfn(vgpu, gfn)) {
  1872. ops->set_pfn(&m, gvt->gtt.scratch_mfn);
  1873. goto out;
  1874. }
  1875. ret = intel_gvt_hypervisor_dma_map_guest_page(vgpu, gfn,
  1876. PAGE_SIZE, &dma_addr);
  1877. if (ret) {
  1878. gvt_vgpu_err("fail to populate guest ggtt entry\n");
  1879. /* guest driver may read/write the entry when partial
  1880. * update the entry in this situation p2m will fail
  1881. * settting the shadow entry to point to a scratch page
  1882. */
  1883. ops->set_pfn(&m, gvt->gtt.scratch_mfn);
  1884. } else
  1885. ops->set_pfn(&m, dma_addr >> PAGE_SHIFT);
  1886. } else {
  1887. ops->set_pfn(&m, gvt->gtt.scratch_mfn);
  1888. ops->clear_present(&m);
  1889. }
  1890. out:
  1891. ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
  1892. ggtt_get_host_entry(ggtt_mm, &e, g_gtt_index);
  1893. ggtt_invalidate_pte(vgpu, &e);
  1894. ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);
  1895. ggtt_invalidate(gvt->dev_priv);
  1896. return 0;
  1897. }
  1898. /*
  1899. * intel_vgpu_emulate_ggtt_mmio_write - emulate GTT MMIO register write
  1900. * @vgpu: a vGPU
  1901. * @off: register offset
  1902. * @p_data: data from guest write
  1903. * @bytes: data length
  1904. *
  1905. * This function is used to emulate the GTT MMIO register write
  1906. *
  1907. * Returns:
  1908. * Zero on success, error code if failed.
  1909. */
  1910. int intel_vgpu_emulate_ggtt_mmio_write(struct intel_vgpu *vgpu,
  1911. unsigned int off, void *p_data, unsigned int bytes)
  1912. {
  1913. const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
  1914. int ret;
  1915. if (bytes != 4 && bytes != 8)
  1916. return -EINVAL;
  1917. off -= info->gtt_start_offset;
  1918. ret = emulate_ggtt_mmio_write(vgpu, off, p_data, bytes);
  1919. return ret;
  1920. }
  1921. static int alloc_scratch_pages(struct intel_vgpu *vgpu,
  1922. intel_gvt_gtt_type_t type)
  1923. {
  1924. struct intel_vgpu_gtt *gtt = &vgpu->gtt;
  1925. struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
  1926. int page_entry_num = I915_GTT_PAGE_SIZE >>
  1927. vgpu->gvt->device_info.gtt_entry_size_shift;
  1928. void *scratch_pt;
  1929. int i;
  1930. struct device *dev = &vgpu->gvt->dev_priv->drm.pdev->dev;
  1931. dma_addr_t daddr;
  1932. if (WARN_ON(type < GTT_TYPE_PPGTT_PTE_PT || type >= GTT_TYPE_MAX))
  1933. return -EINVAL;
  1934. scratch_pt = (void *)get_zeroed_page(GFP_KERNEL);
  1935. if (!scratch_pt) {
  1936. gvt_vgpu_err("fail to allocate scratch page\n");
  1937. return -ENOMEM;
  1938. }
  1939. daddr = dma_map_page(dev, virt_to_page(scratch_pt), 0,
  1940. 4096, PCI_DMA_BIDIRECTIONAL);
  1941. if (dma_mapping_error(dev, daddr)) {
  1942. gvt_vgpu_err("fail to dmamap scratch_pt\n");
  1943. __free_page(virt_to_page(scratch_pt));
  1944. return -ENOMEM;
  1945. }
  1946. gtt->scratch_pt[type].page_mfn =
  1947. (unsigned long)(daddr >> I915_GTT_PAGE_SHIFT);
  1948. gtt->scratch_pt[type].page = virt_to_page(scratch_pt);
  1949. gvt_dbg_mm("vgpu%d create scratch_pt: type %d mfn=0x%lx\n",
  1950. vgpu->id, type, gtt->scratch_pt[type].page_mfn);
  1951. /* Build the tree by full filled the scratch pt with the entries which
  1952. * point to the next level scratch pt or scratch page. The
  1953. * scratch_pt[type] indicate the scratch pt/scratch page used by the
  1954. * 'type' pt.
  1955. * e.g. scratch_pt[GTT_TYPE_PPGTT_PDE_PT] is used by
  1956. * GTT_TYPE_PPGTT_PDE_PT level pt, that means this scratch_pt it self
  1957. * is GTT_TYPE_PPGTT_PTE_PT, and full filled by scratch page mfn.
  1958. */
  1959. if (type > GTT_TYPE_PPGTT_PTE_PT) {
  1960. struct intel_gvt_gtt_entry se;
  1961. memset(&se, 0, sizeof(struct intel_gvt_gtt_entry));
  1962. se.type = get_entry_type(type - 1);
  1963. ops->set_pfn(&se, gtt->scratch_pt[type - 1].page_mfn);
  1964. /* The entry parameters like present/writeable/cache type
  1965. * set to the same as i915's scratch page tree.
  1966. */
  1967. se.val64 |= _PAGE_PRESENT | _PAGE_RW;
  1968. if (type == GTT_TYPE_PPGTT_PDE_PT)
  1969. se.val64 |= PPAT_CACHED;
  1970. for (i = 0; i < page_entry_num; i++)
  1971. ops->set_entry(scratch_pt, &se, i, false, 0, vgpu);
  1972. }
  1973. return 0;
  1974. }
  1975. static int release_scratch_page_tree(struct intel_vgpu *vgpu)
  1976. {
  1977. int i;
  1978. struct device *dev = &vgpu->gvt->dev_priv->drm.pdev->dev;
  1979. dma_addr_t daddr;
  1980. for (i = GTT_TYPE_PPGTT_PTE_PT; i < GTT_TYPE_MAX; i++) {
  1981. if (vgpu->gtt.scratch_pt[i].page != NULL) {
  1982. daddr = (dma_addr_t)(vgpu->gtt.scratch_pt[i].page_mfn <<
  1983. I915_GTT_PAGE_SHIFT);
  1984. dma_unmap_page(dev, daddr, 4096, PCI_DMA_BIDIRECTIONAL);
  1985. __free_page(vgpu->gtt.scratch_pt[i].page);
  1986. vgpu->gtt.scratch_pt[i].page = NULL;
  1987. vgpu->gtt.scratch_pt[i].page_mfn = 0;
  1988. }
  1989. }
  1990. return 0;
  1991. }
  1992. static int create_scratch_page_tree(struct intel_vgpu *vgpu)
  1993. {
  1994. int i, ret;
  1995. for (i = GTT_TYPE_PPGTT_PTE_PT; i < GTT_TYPE_MAX; i++) {
  1996. ret = alloc_scratch_pages(vgpu, i);
  1997. if (ret)
  1998. goto err;
  1999. }
  2000. return 0;
  2001. err:
  2002. release_scratch_page_tree(vgpu);
  2003. return ret;
  2004. }
  2005. /**
  2006. * intel_vgpu_init_gtt - initialize per-vGPU graphics memory virulization
  2007. * @vgpu: a vGPU
  2008. *
  2009. * This function is used to initialize per-vGPU graphics memory virtualization
  2010. * components.
  2011. *
  2012. * Returns:
  2013. * Zero on success, error code if failed.
  2014. */
  2015. int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
  2016. {
  2017. struct intel_vgpu_gtt *gtt = &vgpu->gtt;
  2018. INIT_RADIX_TREE(&gtt->spt_tree, GFP_KERNEL);
  2019. INIT_LIST_HEAD(&gtt->ppgtt_mm_list_head);
  2020. INIT_LIST_HEAD(&gtt->oos_page_list_head);
  2021. INIT_LIST_HEAD(&gtt->post_shadow_list_head);
  2022. gtt->ggtt_mm = intel_vgpu_create_ggtt_mm(vgpu);
  2023. if (IS_ERR(gtt->ggtt_mm)) {
  2024. gvt_vgpu_err("fail to create mm for ggtt.\n");
  2025. return PTR_ERR(gtt->ggtt_mm);
  2026. }
  2027. intel_vgpu_reset_ggtt(vgpu, false);
  2028. INIT_LIST_HEAD(&gtt->ggtt_mm->ggtt_mm.partial_pte_list);
  2029. return create_scratch_page_tree(vgpu);
  2030. }
  2031. static void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu)
  2032. {
  2033. struct list_head *pos, *n;
  2034. struct intel_vgpu_mm *mm;
  2035. list_for_each_safe(pos, n, &vgpu->gtt.ppgtt_mm_list_head) {
  2036. mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.list);
  2037. intel_vgpu_destroy_mm(mm);
  2038. }
  2039. if (GEM_WARN_ON(!list_empty(&vgpu->gtt.ppgtt_mm_list_head)))
  2040. gvt_err("vgpu ppgtt mm is not fully destroyed\n");
  2041. if (GEM_WARN_ON(!radix_tree_empty(&vgpu->gtt.spt_tree))) {
  2042. gvt_err("Why we still has spt not freed?\n");
  2043. ppgtt_free_all_spt(vgpu);
  2044. }
  2045. }
  2046. static void intel_vgpu_destroy_ggtt_mm(struct intel_vgpu *vgpu)
  2047. {
  2048. struct intel_gvt_partial_pte *pos, *next;
  2049. list_for_each_entry_safe(pos, next,
  2050. &vgpu->gtt.ggtt_mm->ggtt_mm.partial_pte_list,
  2051. list) {
  2052. gvt_dbg_mm("partial PTE update on hold 0x%lx : 0x%llx\n",
  2053. pos->offset, pos->data);
  2054. kfree(pos);
  2055. }
  2056. intel_vgpu_destroy_mm(vgpu->gtt.ggtt_mm);
  2057. vgpu->gtt.ggtt_mm = NULL;
  2058. }
  2059. /**
  2060. * intel_vgpu_clean_gtt - clean up per-vGPU graphics memory virulization
  2061. * @vgpu: a vGPU
  2062. *
  2063. * This function is used to clean up per-vGPU graphics memory virtualization
  2064. * components.
  2065. *
  2066. * Returns:
  2067. * Zero on success, error code if failed.
  2068. */
  2069. void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu)
  2070. {
  2071. intel_vgpu_destroy_all_ppgtt_mm(vgpu);
  2072. intel_vgpu_destroy_ggtt_mm(vgpu);
  2073. release_scratch_page_tree(vgpu);
  2074. }
  2075. static void clean_spt_oos(struct intel_gvt *gvt)
  2076. {
  2077. struct intel_gvt_gtt *gtt = &gvt->gtt;
  2078. struct list_head *pos, *n;
  2079. struct intel_vgpu_oos_page *oos_page;
  2080. WARN(!list_empty(&gtt->oos_page_use_list_head),
  2081. "someone is still using oos page\n");
  2082. list_for_each_safe(pos, n, &gtt->oos_page_free_list_head) {
  2083. oos_page = container_of(pos, struct intel_vgpu_oos_page, list);
  2084. list_del(&oos_page->list);
  2085. kfree(oos_page);
  2086. }
  2087. }
  2088. static int setup_spt_oos(struct intel_gvt *gvt)
  2089. {
  2090. struct intel_gvt_gtt *gtt = &gvt->gtt;
  2091. struct intel_vgpu_oos_page *oos_page;
  2092. int i;
  2093. int ret;
  2094. INIT_LIST_HEAD(&gtt->oos_page_free_list_head);
  2095. INIT_LIST_HEAD(&gtt->oos_page_use_list_head);
  2096. for (i = 0; i < preallocated_oos_pages; i++) {
  2097. oos_page = kzalloc(sizeof(*oos_page), GFP_KERNEL);
  2098. if (!oos_page) {
  2099. ret = -ENOMEM;
  2100. goto fail;
  2101. }
  2102. INIT_LIST_HEAD(&oos_page->list);
  2103. INIT_LIST_HEAD(&oos_page->vm_list);
  2104. oos_page->id = i;
  2105. list_add_tail(&oos_page->list, &gtt->oos_page_free_list_head);
  2106. }
  2107. gvt_dbg_mm("%d oos pages preallocated\n", i);
  2108. return 0;
  2109. fail:
  2110. clean_spt_oos(gvt);
  2111. return ret;
  2112. }
  2113. /**
  2114. * intel_vgpu_find_ppgtt_mm - find a PPGTT mm object
  2115. * @vgpu: a vGPU
  2116. * @pdps: pdp root array
  2117. *
  2118. * This function is used to find a PPGTT mm object from mm object pool
  2119. *
  2120. * Returns:
  2121. * pointer to mm object on success, NULL if failed.
  2122. */
  2123. struct intel_vgpu_mm *intel_vgpu_find_ppgtt_mm(struct intel_vgpu *vgpu,
  2124. u64 pdps[])
  2125. {
  2126. struct intel_vgpu_mm *mm;
  2127. struct list_head *pos;
  2128. list_for_each(pos, &vgpu->gtt.ppgtt_mm_list_head) {
  2129. mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.list);
  2130. switch (mm->ppgtt_mm.root_entry_type) {
  2131. case GTT_TYPE_PPGTT_ROOT_L4_ENTRY:
  2132. if (pdps[0] == mm->ppgtt_mm.guest_pdps[0])
  2133. return mm;
  2134. break;
  2135. case GTT_TYPE_PPGTT_ROOT_L3_ENTRY:
  2136. if (!memcmp(pdps, mm->ppgtt_mm.guest_pdps,
  2137. sizeof(mm->ppgtt_mm.guest_pdps)))
  2138. return mm;
  2139. break;
  2140. default:
  2141. GEM_BUG_ON(1);
  2142. }
  2143. }
  2144. return NULL;
  2145. }
  2146. /**
  2147. * intel_vgpu_get_ppgtt_mm - get or create a PPGTT mm object.
  2148. * @vgpu: a vGPU
  2149. * @root_entry_type: ppgtt root entry type
  2150. * @pdps: guest pdps
  2151. *
  2152. * This function is used to find or create a PPGTT mm object from a guest.
  2153. *
  2154. * Returns:
  2155. * Zero on success, negative error code if failed.
  2156. */
  2157. struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu,
  2158. intel_gvt_gtt_type_t root_entry_type, u64 pdps[])
  2159. {
  2160. struct intel_vgpu_mm *mm;
  2161. mm = intel_vgpu_find_ppgtt_mm(vgpu, pdps);
  2162. if (mm) {
  2163. intel_vgpu_mm_get(mm);
  2164. } else {
  2165. mm = intel_vgpu_create_ppgtt_mm(vgpu, root_entry_type, pdps);
  2166. if (IS_ERR(mm))
  2167. gvt_vgpu_err("fail to create mm\n");
  2168. }
  2169. return mm;
  2170. }
  2171. /**
  2172. * intel_vgpu_put_ppgtt_mm - find and put a PPGTT mm object.
  2173. * @vgpu: a vGPU
  2174. * @pdps: guest pdps
  2175. *
  2176. * This function is used to find a PPGTT mm object from a guest and destroy it.
  2177. *
  2178. * Returns:
  2179. * Zero on success, negative error code if failed.
  2180. */
  2181. int intel_vgpu_put_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[])
  2182. {
  2183. struct intel_vgpu_mm *mm;
  2184. mm = intel_vgpu_find_ppgtt_mm(vgpu, pdps);
  2185. if (!mm) {
  2186. gvt_vgpu_err("fail to find ppgtt instance.\n");
  2187. return -EINVAL;
  2188. }
  2189. intel_vgpu_mm_put(mm);
  2190. return 0;
  2191. }
  2192. /**
  2193. * intel_gvt_init_gtt - initialize mm components of a GVT device
  2194. * @gvt: GVT device
  2195. *
  2196. * This function is called at the initialization stage, to initialize
  2197. * the mm components of a GVT device.
  2198. *
  2199. * Returns:
  2200. * zero on success, negative error code if failed.
  2201. */
  2202. int intel_gvt_init_gtt(struct intel_gvt *gvt)
  2203. {
  2204. int ret;
  2205. void *page;
  2206. struct device *dev = &gvt->dev_priv->drm.pdev->dev;
  2207. dma_addr_t daddr;
  2208. gvt_dbg_core("init gtt\n");
  2209. gvt->gtt.pte_ops = &gen8_gtt_pte_ops;
  2210. gvt->gtt.gma_ops = &gen8_gtt_gma_ops;
  2211. page = (void *)get_zeroed_page(GFP_KERNEL);
  2212. if (!page) {
  2213. gvt_err("fail to allocate scratch ggtt page\n");
  2214. return -ENOMEM;
  2215. }
  2216. daddr = dma_map_page(dev, virt_to_page(page), 0,
  2217. 4096, PCI_DMA_BIDIRECTIONAL);
  2218. if (dma_mapping_error(dev, daddr)) {
  2219. gvt_err("fail to dmamap scratch ggtt page\n");
  2220. __free_page(virt_to_page(page));
  2221. return -ENOMEM;
  2222. }
  2223. gvt->gtt.scratch_page = virt_to_page(page);
  2224. gvt->gtt.scratch_mfn = (unsigned long)(daddr >> I915_GTT_PAGE_SHIFT);
  2225. if (enable_out_of_sync) {
  2226. ret = setup_spt_oos(gvt);
  2227. if (ret) {
  2228. gvt_err("fail to initialize SPT oos\n");
  2229. dma_unmap_page(dev, daddr, 4096, PCI_DMA_BIDIRECTIONAL);
  2230. __free_page(gvt->gtt.scratch_page);
  2231. return ret;
  2232. }
  2233. }
  2234. INIT_LIST_HEAD(&gvt->gtt.ppgtt_mm_lru_list_head);
  2235. return 0;
  2236. }
  2237. /**
  2238. * intel_gvt_clean_gtt - clean up mm components of a GVT device
  2239. * @gvt: GVT device
  2240. *
  2241. * This function is called at the driver unloading stage, to clean up the
  2242. * the mm components of a GVT device.
  2243. *
  2244. */
  2245. void intel_gvt_clean_gtt(struct intel_gvt *gvt)
  2246. {
  2247. struct device *dev = &gvt->dev_priv->drm.pdev->dev;
  2248. dma_addr_t daddr = (dma_addr_t)(gvt->gtt.scratch_mfn <<
  2249. I915_GTT_PAGE_SHIFT);
  2250. dma_unmap_page(dev, daddr, 4096, PCI_DMA_BIDIRECTIONAL);
  2251. __free_page(gvt->gtt.scratch_page);
  2252. if (enable_out_of_sync)
  2253. clean_spt_oos(gvt);
  2254. }
  2255. /**
  2256. * intel_vgpu_invalidate_ppgtt - invalidate PPGTT instances
  2257. * @vgpu: a vGPU
  2258. *
  2259. * This function is called when invalidate all PPGTT instances of a vGPU.
  2260. *
  2261. */
  2262. void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu)
  2263. {
  2264. struct list_head *pos, *n;
  2265. struct intel_vgpu_mm *mm;
  2266. list_for_each_safe(pos, n, &vgpu->gtt.ppgtt_mm_list_head) {
  2267. mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.list);
  2268. if (mm->type == INTEL_GVT_MM_PPGTT) {
  2269. list_del_init(&mm->ppgtt_mm.lru_list);
  2270. if (mm->ppgtt_mm.shadowed)
  2271. invalidate_ppgtt_mm(mm);
  2272. }
  2273. }
  2274. }
  2275. /**
  2276. * intel_vgpu_reset_ggtt - reset the GGTT entry
  2277. * @vgpu: a vGPU
  2278. * @invalidate_old: invalidate old entries
  2279. *
  2280. * This function is called at the vGPU create stage
  2281. * to reset all the GGTT entries.
  2282. *
  2283. */
  2284. void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old)
  2285. {
  2286. struct intel_gvt *gvt = vgpu->gvt;
  2287. struct drm_i915_private *dev_priv = gvt->dev_priv;
  2288. struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
  2289. struct intel_gvt_gtt_entry entry = {.type = GTT_TYPE_GGTT_PTE};
  2290. struct intel_gvt_gtt_entry old_entry;
  2291. u32 index;
  2292. u32 num_entries;
  2293. pte_ops->set_pfn(&entry, gvt->gtt.scratch_mfn);
  2294. pte_ops->set_present(&entry);
  2295. index = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT;
  2296. num_entries = vgpu_aperture_sz(vgpu) >> PAGE_SHIFT;
  2297. while (num_entries--) {
  2298. if (invalidate_old) {
  2299. ggtt_get_host_entry(vgpu->gtt.ggtt_mm, &old_entry, index);
  2300. ggtt_invalidate_pte(vgpu, &old_entry);
  2301. }
  2302. ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++);
  2303. }
  2304. index = vgpu_hidden_gmadr_base(vgpu) >> PAGE_SHIFT;
  2305. num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT;
  2306. while (num_entries--) {
  2307. if (invalidate_old) {
  2308. ggtt_get_host_entry(vgpu->gtt.ggtt_mm, &old_entry, index);
  2309. ggtt_invalidate_pte(vgpu, &old_entry);
  2310. }
  2311. ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++);
  2312. }
  2313. ggtt_invalidate(dev_priv);
  2314. }
  2315. /**
  2316. * intel_vgpu_reset_gtt - reset the all GTT related status
  2317. * @vgpu: a vGPU
  2318. *
  2319. * This function is called from vfio core to reset reset all
  2320. * GTT related status, including GGTT, PPGTT, scratch page.
  2321. *
  2322. */
  2323. void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu)
  2324. {
  2325. /* Shadow pages are only created when there is no page
  2326. * table tracking data, so remove page tracking data after
  2327. * removing the shadow pages.
  2328. */
  2329. intel_vgpu_destroy_all_ppgtt_mm(vgpu);
  2330. intel_vgpu_reset_ggtt(vgpu, true);
  2331. }