Merge tag '6.10-rc-smb-fix' of git://git.samba.org/sfrench/cifs-2.6
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / gvt / gtt.c
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
36 #include "i915_drv.h"
37 #include "gvt.h"
38 #include "i915_pvinfo.h"
39 #include "trace.h"
40
41 #include "gt/intel_gt_regs.h"
42
43 #if defined(VERBOSE_DEBUG)
44 #define gvt_vdbg_mm(fmt, args...) gvt_dbg_mm(fmt, ##args)
45 #else
46 #define gvt_vdbg_mm(fmt, args...)
47 #endif
48
49 static bool enable_out_of_sync = false;
50 static int preallocated_oos_pages = 8192;
51
52 /*
53  * validate a gm address and related range size,
54  * translate it to host gm address
55  */
56 bool intel_gvt_ggtt_validate_range(struct intel_vgpu *vgpu, u64 addr, u32 size)
57 {
58         if (size == 0)
59                 return vgpu_gmadr_is_valid(vgpu, addr);
60
61         if (vgpu_gmadr_is_aperture(vgpu, addr) &&
62             vgpu_gmadr_is_aperture(vgpu, addr + size - 1))
63                 return true;
64         else if (vgpu_gmadr_is_hidden(vgpu, addr) &&
65                  vgpu_gmadr_is_hidden(vgpu, addr + size - 1))
66                 return true;
67
68         gvt_dbg_mm("Invalid ggtt range at 0x%llx, size: 0x%x\n",
69                      addr, size);
70         return false;
71 }
72
73 /* translate a guest gmadr to host gmadr */
74 int intel_gvt_ggtt_gmadr_g2h(struct intel_vgpu *vgpu, u64 g_addr, u64 *h_addr)
75 {
76         struct drm_i915_private *i915 = vgpu->gvt->gt->i915;
77
78         if (drm_WARN(&i915->drm, !vgpu_gmadr_is_valid(vgpu, g_addr),
79                      "invalid guest gmadr %llx\n", g_addr))
80                 return -EACCES;
81
82         if (vgpu_gmadr_is_aperture(vgpu, g_addr))
83                 *h_addr = vgpu_aperture_gmadr_base(vgpu)
84                           + (g_addr - vgpu_aperture_offset(vgpu));
85         else
86                 *h_addr = vgpu_hidden_gmadr_base(vgpu)
87                           + (g_addr - vgpu_hidden_offset(vgpu));
88         return 0;
89 }
90
91 /* translate a host gmadr to guest gmadr */
92 int intel_gvt_ggtt_gmadr_h2g(struct intel_vgpu *vgpu, u64 h_addr, u64 *g_addr)
93 {
94         struct drm_i915_private *i915 = vgpu->gvt->gt->i915;
95
96         if (drm_WARN(&i915->drm, !gvt_gmadr_is_valid(vgpu->gvt, h_addr),
97                      "invalid host gmadr %llx\n", h_addr))
98                 return -EACCES;
99
100         if (gvt_gmadr_is_aperture(vgpu->gvt, h_addr))
101                 *g_addr = vgpu_aperture_gmadr_base(vgpu)
102                         + (h_addr - gvt_aperture_gmadr_base(vgpu->gvt));
103         else
104                 *g_addr = vgpu_hidden_gmadr_base(vgpu)
105                         + (h_addr - gvt_hidden_gmadr_base(vgpu->gvt));
106         return 0;
107 }
108
109 int intel_gvt_ggtt_index_g2h(struct intel_vgpu *vgpu, unsigned long g_index,
110                              unsigned long *h_index)
111 {
112         u64 h_addr;
113         int ret;
114
115         ret = intel_gvt_ggtt_gmadr_g2h(vgpu, g_index << I915_GTT_PAGE_SHIFT,
116                                        &h_addr);
117         if (ret)
118                 return ret;
119
120         *h_index = h_addr >> I915_GTT_PAGE_SHIFT;
121         return 0;
122 }
123
124 int intel_gvt_ggtt_h2g_index(struct intel_vgpu *vgpu, unsigned long h_index,
125                              unsigned long *g_index)
126 {
127         u64 g_addr;
128         int ret;
129
130         ret = intel_gvt_ggtt_gmadr_h2g(vgpu, h_index << I915_GTT_PAGE_SHIFT,
131                                        &g_addr);
132         if (ret)
133                 return ret;
134
135         *g_index = g_addr >> I915_GTT_PAGE_SHIFT;
136         return 0;
137 }
138
139 #define gtt_type_is_entry(type) \
140         (type > GTT_TYPE_INVALID && type < GTT_TYPE_PPGTT_ENTRY \
141          && type != GTT_TYPE_PPGTT_PTE_ENTRY \
142          && type != GTT_TYPE_PPGTT_ROOT_ENTRY)
143
144 #define gtt_type_is_pt(type) \
145         (type >= GTT_TYPE_PPGTT_PTE_PT && type < GTT_TYPE_MAX)
146
147 #define gtt_type_is_pte_pt(type) \
148         (type == GTT_TYPE_PPGTT_PTE_PT)
149
150 #define gtt_type_is_root_pointer(type) \
151         (gtt_type_is_entry(type) && type > GTT_TYPE_PPGTT_ROOT_ENTRY)
152
153 #define gtt_init_entry(e, t, p, v) do { \
154         (e)->type = t; \
155         (e)->pdev = p; \
156         memcpy(&(e)->val64, &v, sizeof(v)); \
157 } while (0)
158
159 /*
160  * Mappings between GTT_TYPE* enumerations.
161  * Following information can be found according to the given type:
162  * - type of next level page table
163  * - type of entry inside this level page table
164  * - type of entry with PSE set
165  *
166  * If the given type doesn't have such a kind of information,
167  * e.g. give a l4 root entry type, then request to get its PSE type,
168  * give a PTE page table type, then request to get its next level page
169  * table type, as we know l4 root entry doesn't have a PSE bit,
170  * and a PTE page table doesn't have a next level page table type,
171  * GTT_TYPE_INVALID will be returned. This is useful when traversing a
172  * page table.
173  */
174
175 struct gtt_type_table_entry {
176         int entry_type;
177         int pt_type;
178         int next_pt_type;
179         int pse_entry_type;
180 };
181
182 #define GTT_TYPE_TABLE_ENTRY(type, e_type, cpt_type, npt_type, pse_type) \
183         [type] = { \
184                 .entry_type = e_type, \
185                 .pt_type = cpt_type, \
186                 .next_pt_type = npt_type, \
187                 .pse_entry_type = pse_type, \
188         }
189
190 static const struct gtt_type_table_entry gtt_type_table[] = {
191         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_ROOT_L4_ENTRY,
192                         GTT_TYPE_PPGTT_ROOT_L4_ENTRY,
193                         GTT_TYPE_INVALID,
194                         GTT_TYPE_PPGTT_PML4_PT,
195                         GTT_TYPE_INVALID),
196         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PML4_PT,
197                         GTT_TYPE_PPGTT_PML4_ENTRY,
198                         GTT_TYPE_PPGTT_PML4_PT,
199                         GTT_TYPE_PPGTT_PDP_PT,
200                         GTT_TYPE_INVALID),
201         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PML4_ENTRY,
202                         GTT_TYPE_PPGTT_PML4_ENTRY,
203                         GTT_TYPE_PPGTT_PML4_PT,
204                         GTT_TYPE_PPGTT_PDP_PT,
205                         GTT_TYPE_INVALID),
206         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDP_PT,
207                         GTT_TYPE_PPGTT_PDP_ENTRY,
208                         GTT_TYPE_PPGTT_PDP_PT,
209                         GTT_TYPE_PPGTT_PDE_PT,
210                         GTT_TYPE_PPGTT_PTE_1G_ENTRY),
211         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_ROOT_L3_ENTRY,
212                         GTT_TYPE_PPGTT_ROOT_L3_ENTRY,
213                         GTT_TYPE_INVALID,
214                         GTT_TYPE_PPGTT_PDE_PT,
215                         GTT_TYPE_PPGTT_PTE_1G_ENTRY),
216         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDP_ENTRY,
217                         GTT_TYPE_PPGTT_PDP_ENTRY,
218                         GTT_TYPE_PPGTT_PDP_PT,
219                         GTT_TYPE_PPGTT_PDE_PT,
220                         GTT_TYPE_PPGTT_PTE_1G_ENTRY),
221         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDE_PT,
222                         GTT_TYPE_PPGTT_PDE_ENTRY,
223                         GTT_TYPE_PPGTT_PDE_PT,
224                         GTT_TYPE_PPGTT_PTE_PT,
225                         GTT_TYPE_PPGTT_PTE_2M_ENTRY),
226         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDE_ENTRY,
227                         GTT_TYPE_PPGTT_PDE_ENTRY,
228                         GTT_TYPE_PPGTT_PDE_PT,
229                         GTT_TYPE_PPGTT_PTE_PT,
230                         GTT_TYPE_PPGTT_PTE_2M_ENTRY),
231         /* We take IPS bit as 'PSE' for PTE level. */
232         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_PT,
233                         GTT_TYPE_PPGTT_PTE_4K_ENTRY,
234                         GTT_TYPE_PPGTT_PTE_PT,
235                         GTT_TYPE_INVALID,
236                         GTT_TYPE_PPGTT_PTE_64K_ENTRY),
237         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_4K_ENTRY,
238                         GTT_TYPE_PPGTT_PTE_4K_ENTRY,
239                         GTT_TYPE_PPGTT_PTE_PT,
240                         GTT_TYPE_INVALID,
241                         GTT_TYPE_PPGTT_PTE_64K_ENTRY),
242         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_64K_ENTRY,
243                         GTT_TYPE_PPGTT_PTE_4K_ENTRY,
244                         GTT_TYPE_PPGTT_PTE_PT,
245                         GTT_TYPE_INVALID,
246                         GTT_TYPE_PPGTT_PTE_64K_ENTRY),
247         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_2M_ENTRY,
248                         GTT_TYPE_PPGTT_PDE_ENTRY,
249                         GTT_TYPE_PPGTT_PDE_PT,
250                         GTT_TYPE_INVALID,
251                         GTT_TYPE_PPGTT_PTE_2M_ENTRY),
252         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_1G_ENTRY,
253                         GTT_TYPE_PPGTT_PDP_ENTRY,
254                         GTT_TYPE_PPGTT_PDP_PT,
255                         GTT_TYPE_INVALID,
256                         GTT_TYPE_PPGTT_PTE_1G_ENTRY),
257         GTT_TYPE_TABLE_ENTRY(GTT_TYPE_GGTT_PTE,
258                         GTT_TYPE_GGTT_PTE,
259                         GTT_TYPE_INVALID,
260                         GTT_TYPE_INVALID,
261                         GTT_TYPE_INVALID),
262 };
263
264 static inline int get_next_pt_type(int type)
265 {
266         return gtt_type_table[type].next_pt_type;
267 }
268
269 static inline int get_entry_type(int type)
270 {
271         return gtt_type_table[type].entry_type;
272 }
273
274 static inline int get_pse_type(int type)
275 {
276         return gtt_type_table[type].pse_entry_type;
277 }
278
279 static u64 read_pte64(struct i915_ggtt *ggtt, unsigned long index)
280 {
281         void __iomem *addr = (gen8_pte_t __iomem *)ggtt->gsm + index;
282
283         return readq(addr);
284 }
285
286 static void ggtt_invalidate(struct intel_gt *gt)
287 {
288         mmio_hw_access_pre(gt);
289         intel_uncore_write(gt->uncore, GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
290         mmio_hw_access_post(gt);
291 }
292
293 static void write_pte64(struct i915_ggtt *ggtt, unsigned long index, u64 pte)
294 {
295         void __iomem *addr = (gen8_pte_t __iomem *)ggtt->gsm + index;
296
297         writeq(pte, addr);
298 }
299
300 static inline int gtt_get_entry64(void *pt,
301                 struct intel_gvt_gtt_entry *e,
302                 unsigned long index, bool hypervisor_access, unsigned long gpa,
303                 struct intel_vgpu *vgpu)
304 {
305         const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
306         int ret;
307
308         if (WARN_ON(info->gtt_entry_size != 8))
309                 return -EINVAL;
310
311         if (hypervisor_access) {
312                 ret = intel_gvt_read_gpa(vgpu, gpa +
313                                 (index << info->gtt_entry_size_shift),
314                                 &e->val64, 8);
315                 if (WARN_ON(ret))
316                         return ret;
317         } else if (!pt) {
318                 e->val64 = read_pte64(vgpu->gvt->gt->ggtt, index);
319         } else {
320                 e->val64 = *((u64 *)pt + index);
321         }
322         return 0;
323 }
324
325 static inline int gtt_set_entry64(void *pt,
326                 struct intel_gvt_gtt_entry *e,
327                 unsigned long index, bool hypervisor_access, unsigned long gpa,
328                 struct intel_vgpu *vgpu)
329 {
330         const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
331         int ret;
332
333         if (WARN_ON(info->gtt_entry_size != 8))
334                 return -EINVAL;
335
336         if (hypervisor_access) {
337                 ret = intel_gvt_write_gpa(vgpu, gpa +
338                                 (index << info->gtt_entry_size_shift),
339                                 &e->val64, 8);
340                 if (WARN_ON(ret))
341                         return ret;
342         } else if (!pt) {
343                 write_pte64(vgpu->gvt->gt->ggtt, index, e->val64);
344         } else {
345                 *((u64 *)pt + index) = e->val64;
346         }
347         return 0;
348 }
349
350 #define GTT_HAW 46
351
352 #define ADDR_1G_MASK    GENMASK_ULL(GTT_HAW - 1, 30)
353 #define ADDR_2M_MASK    GENMASK_ULL(GTT_HAW - 1, 21)
354 #define ADDR_64K_MASK   GENMASK_ULL(GTT_HAW - 1, 16)
355 #define ADDR_4K_MASK    GENMASK_ULL(GTT_HAW - 1, 12)
356
357 #define GTT_SPTE_FLAG_MASK GENMASK_ULL(62, 52)
358 #define GTT_SPTE_FLAG_64K_SPLITED BIT(52) /* splited 64K gtt entry */
359
360 #define GTT_64K_PTE_STRIDE 16
361
362 static unsigned long gen8_gtt_get_pfn(struct intel_gvt_gtt_entry *e)
363 {
364         unsigned long pfn;
365
366         if (e->type == GTT_TYPE_PPGTT_PTE_1G_ENTRY)
367                 pfn = (e->val64 & ADDR_1G_MASK) >> PAGE_SHIFT;
368         else if (e->type == GTT_TYPE_PPGTT_PTE_2M_ENTRY)
369                 pfn = (e->val64 & ADDR_2M_MASK) >> PAGE_SHIFT;
370         else if (e->type == GTT_TYPE_PPGTT_PTE_64K_ENTRY)
371                 pfn = (e->val64 & ADDR_64K_MASK) >> PAGE_SHIFT;
372         else
373                 pfn = (e->val64 & ADDR_4K_MASK) >> PAGE_SHIFT;
374         return pfn;
375 }
376
377 static void gen8_gtt_set_pfn(struct intel_gvt_gtt_entry *e, unsigned long pfn)
378 {
379         if (e->type == GTT_TYPE_PPGTT_PTE_1G_ENTRY) {
380                 e->val64 &= ~ADDR_1G_MASK;
381                 pfn &= (ADDR_1G_MASK >> PAGE_SHIFT);
382         } else if (e->type == GTT_TYPE_PPGTT_PTE_2M_ENTRY) {
383                 e->val64 &= ~ADDR_2M_MASK;
384                 pfn &= (ADDR_2M_MASK >> PAGE_SHIFT);
385         } else if (e->type == GTT_TYPE_PPGTT_PTE_64K_ENTRY) {
386                 e->val64 &= ~ADDR_64K_MASK;
387                 pfn &= (ADDR_64K_MASK >> PAGE_SHIFT);
388         } else {
389                 e->val64 &= ~ADDR_4K_MASK;
390                 pfn &= (ADDR_4K_MASK >> PAGE_SHIFT);
391         }
392
393         e->val64 |= (pfn << PAGE_SHIFT);
394 }
395
396 static bool gen8_gtt_test_pse(struct intel_gvt_gtt_entry *e)
397 {
398         return !!(e->val64 & _PAGE_PSE);
399 }
400
401 static void gen8_gtt_clear_pse(struct intel_gvt_gtt_entry *e)
402 {
403         if (gen8_gtt_test_pse(e)) {
404                 switch (e->type) {
405                 case GTT_TYPE_PPGTT_PTE_2M_ENTRY:
406                         e->val64 &= ~_PAGE_PSE;
407                         e->type = GTT_TYPE_PPGTT_PDE_ENTRY;
408                         break;
409                 case GTT_TYPE_PPGTT_PTE_1G_ENTRY:
410                         e->type = GTT_TYPE_PPGTT_PDP_ENTRY;
411                         e->val64 &= ~_PAGE_PSE;
412                         break;
413                 default:
414                         WARN_ON(1);
415                 }
416         }
417 }
418
419 static bool gen8_gtt_test_ips(struct intel_gvt_gtt_entry *e)
420 {
421         if (GEM_WARN_ON(e->type != GTT_TYPE_PPGTT_PDE_ENTRY))
422                 return false;
423
424         return !!(e->val64 & GEN8_PDE_IPS_64K);
425 }
426
427 static void gen8_gtt_clear_ips(struct intel_gvt_gtt_entry *e)
428 {
429         if (GEM_WARN_ON(e->type != GTT_TYPE_PPGTT_PDE_ENTRY))
430                 return;
431
432         e->val64 &= ~GEN8_PDE_IPS_64K;
433 }
434
435 static bool gen8_gtt_test_present(struct intel_gvt_gtt_entry *e)
436 {
437         /*
438          * i915 writes PDP root pointer registers without present bit,
439          * it also works, so we need to treat root pointer entry
440          * specifically.
441          */
442         if (e->type == GTT_TYPE_PPGTT_ROOT_L3_ENTRY
443                         || e->type == GTT_TYPE_PPGTT_ROOT_L4_ENTRY)
444                 return (e->val64 != 0);
445         else
446                 return (e->val64 & GEN8_PAGE_PRESENT);
447 }
448
449 static void gtt_entry_clear_present(struct intel_gvt_gtt_entry *e)
450 {
451         e->val64 &= ~GEN8_PAGE_PRESENT;
452 }
453
454 static void gtt_entry_set_present(struct intel_gvt_gtt_entry *e)
455 {
456         e->val64 |= GEN8_PAGE_PRESENT;
457 }
458
459 static bool gen8_gtt_test_64k_splited(struct intel_gvt_gtt_entry *e)
460 {
461         return !!(e->val64 & GTT_SPTE_FLAG_64K_SPLITED);
462 }
463
464 static void gen8_gtt_set_64k_splited(struct intel_gvt_gtt_entry *e)
465 {
466         e->val64 |= GTT_SPTE_FLAG_64K_SPLITED;
467 }
468
469 static void gen8_gtt_clear_64k_splited(struct intel_gvt_gtt_entry *e)
470 {
471         e->val64 &= ~GTT_SPTE_FLAG_64K_SPLITED;
472 }
473
474 /*
475  * Per-platform GMA routines.
476  */
477 static unsigned long gma_to_ggtt_pte_index(unsigned long gma)
478 {
479         unsigned long x = (gma >> I915_GTT_PAGE_SHIFT);
480
481         trace_gma_index(__func__, gma, x);
482         return x;
483 }
484
485 #define DEFINE_PPGTT_GMA_TO_INDEX(prefix, ename, exp) \
486 static unsigned long prefix##_gma_to_##ename##_index(unsigned long gma) \
487 { \
488         unsigned long x = (exp); \
489         trace_gma_index(__func__, gma, x); \
490         return x; \
491 }
492
493 DEFINE_PPGTT_GMA_TO_INDEX(gen8, pte, (gma >> 12 & 0x1ff));
494 DEFINE_PPGTT_GMA_TO_INDEX(gen8, pde, (gma >> 21 & 0x1ff));
495 DEFINE_PPGTT_GMA_TO_INDEX(gen8, l3_pdp, (gma >> 30 & 0x3));
496 DEFINE_PPGTT_GMA_TO_INDEX(gen8, l4_pdp, (gma >> 30 & 0x1ff));
497 DEFINE_PPGTT_GMA_TO_INDEX(gen8, pml4, (gma >> 39 & 0x1ff));
498
499 static const struct intel_gvt_gtt_pte_ops gen8_gtt_pte_ops = {
500         .get_entry = gtt_get_entry64,
501         .set_entry = gtt_set_entry64,
502         .clear_present = gtt_entry_clear_present,
503         .set_present = gtt_entry_set_present,
504         .test_present = gen8_gtt_test_present,
505         .test_pse = gen8_gtt_test_pse,
506         .clear_pse = gen8_gtt_clear_pse,
507         .clear_ips = gen8_gtt_clear_ips,
508         .test_ips = gen8_gtt_test_ips,
509         .clear_64k_splited = gen8_gtt_clear_64k_splited,
510         .set_64k_splited = gen8_gtt_set_64k_splited,
511         .test_64k_splited = gen8_gtt_test_64k_splited,
512         .get_pfn = gen8_gtt_get_pfn,
513         .set_pfn = gen8_gtt_set_pfn,
514 };
515
516 static const struct intel_gvt_gtt_gma_ops gen8_gtt_gma_ops = {
517         .gma_to_ggtt_pte_index = gma_to_ggtt_pte_index,
518         .gma_to_pte_index = gen8_gma_to_pte_index,
519         .gma_to_pde_index = gen8_gma_to_pde_index,
520         .gma_to_l3_pdp_index = gen8_gma_to_l3_pdp_index,
521         .gma_to_l4_pdp_index = gen8_gma_to_l4_pdp_index,
522         .gma_to_pml4_index = gen8_gma_to_pml4_index,
523 };
524
525 /* Update entry type per pse and ips bit. */
526 static void update_entry_type_for_real(const struct intel_gvt_gtt_pte_ops *pte_ops,
527         struct intel_gvt_gtt_entry *entry, bool ips)
528 {
529         switch (entry->type) {
530         case GTT_TYPE_PPGTT_PDE_ENTRY:
531         case GTT_TYPE_PPGTT_PDP_ENTRY:
532                 if (pte_ops->test_pse(entry))
533                         entry->type = get_pse_type(entry->type);
534                 break;
535         case GTT_TYPE_PPGTT_PTE_4K_ENTRY:
536                 if (ips)
537                         entry->type = get_pse_type(entry->type);
538                 break;
539         default:
540                 GEM_BUG_ON(!gtt_type_is_entry(entry->type));
541         }
542
543         GEM_BUG_ON(entry->type == GTT_TYPE_INVALID);
544 }
545
546 /*
547  * MM helpers.
548  */
549 static void _ppgtt_get_root_entry(struct intel_vgpu_mm *mm,
550                 struct intel_gvt_gtt_entry *entry, unsigned long index,
551                 bool guest)
552 {
553         const struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
554
555         GEM_BUG_ON(mm->type != INTEL_GVT_MM_PPGTT);
556
557         entry->type = mm->ppgtt_mm.root_entry_type;
558         pte_ops->get_entry(guest ? mm->ppgtt_mm.guest_pdps :
559                            mm->ppgtt_mm.shadow_pdps,
560                            entry, index, false, 0, mm->vgpu);
561         update_entry_type_for_real(pte_ops, entry, false);
562 }
563
564 static inline void ppgtt_get_guest_root_entry(struct intel_vgpu_mm *mm,
565                 struct intel_gvt_gtt_entry *entry, unsigned long index)
566 {
567         _ppgtt_get_root_entry(mm, entry, index, true);
568 }
569
570 static inline void ppgtt_get_shadow_root_entry(struct intel_vgpu_mm *mm,
571                 struct intel_gvt_gtt_entry *entry, unsigned long index)
572 {
573         _ppgtt_get_root_entry(mm, entry, index, false);
574 }
575
576 static void _ppgtt_set_root_entry(struct intel_vgpu_mm *mm,
577                 struct intel_gvt_gtt_entry *entry, unsigned long index,
578                 bool guest)
579 {
580         const struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
581
582         pte_ops->set_entry(guest ? mm->ppgtt_mm.guest_pdps :
583                            mm->ppgtt_mm.shadow_pdps,
584                            entry, index, false, 0, mm->vgpu);
585 }
586
587 static inline void ppgtt_set_shadow_root_entry(struct intel_vgpu_mm *mm,
588                 struct intel_gvt_gtt_entry *entry, unsigned long index)
589 {
590         _ppgtt_set_root_entry(mm, entry, index, false);
591 }
592
593 static void ggtt_get_guest_entry(struct intel_vgpu_mm *mm,
594                 struct intel_gvt_gtt_entry *entry, unsigned long index)
595 {
596         const struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
597
598         GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
599
600         entry->type = GTT_TYPE_GGTT_PTE;
601         pte_ops->get_entry(mm->ggtt_mm.virtual_ggtt, entry, index,
602                            false, 0, mm->vgpu);
603 }
604
605 static void ggtt_set_guest_entry(struct intel_vgpu_mm *mm,
606                 struct intel_gvt_gtt_entry *entry, unsigned long index)
607 {
608         const struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
609
610         GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
611
612         pte_ops->set_entry(mm->ggtt_mm.virtual_ggtt, entry, index,
613                            false, 0, mm->vgpu);
614 }
615
616 static void ggtt_get_host_entry(struct intel_vgpu_mm *mm,
617                 struct intel_gvt_gtt_entry *entry, unsigned long index)
618 {
619         const struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
620
621         GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
622
623         pte_ops->get_entry(NULL, entry, index, false, 0, mm->vgpu);
624 }
625
626 static void ggtt_set_host_entry(struct intel_vgpu_mm *mm,
627                 struct intel_gvt_gtt_entry *entry, unsigned long index)
628 {
629         const struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
630         unsigned long offset = index;
631
632         GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
633
634         if (vgpu_gmadr_is_aperture(mm->vgpu, index << I915_GTT_PAGE_SHIFT)) {
635                 offset -= (vgpu_aperture_gmadr_base(mm->vgpu) >> PAGE_SHIFT);
636                 mm->ggtt_mm.host_ggtt_aperture[offset] = entry->val64;
637         } else if (vgpu_gmadr_is_hidden(mm->vgpu, index << I915_GTT_PAGE_SHIFT)) {
638                 offset -= (vgpu_hidden_gmadr_base(mm->vgpu) >> PAGE_SHIFT);
639                 mm->ggtt_mm.host_ggtt_hidden[offset] = entry->val64;
640         }
641
642         pte_ops->set_entry(NULL, entry, index, false, 0, mm->vgpu);
643 }
644
645 /*
646  * PPGTT shadow page table helpers.
647  */
648 static inline int ppgtt_spt_get_entry(
649                 struct intel_vgpu_ppgtt_spt *spt,
650                 void *page_table, int type,
651                 struct intel_gvt_gtt_entry *e, unsigned long index,
652                 bool guest)
653 {
654         struct intel_gvt *gvt = spt->vgpu->gvt;
655         const struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
656         int ret;
657
658         e->type = get_entry_type(type);
659
660         if (WARN(!gtt_type_is_entry(e->type), "invalid entry type\n"))
661                 return -EINVAL;
662
663         ret = ops->get_entry(page_table, e, index, guest,
664                         spt->guest_page.gfn << I915_GTT_PAGE_SHIFT,
665                         spt->vgpu);
666         if (ret)
667                 return ret;
668
669         update_entry_type_for_real(ops, e, guest ?
670                                    spt->guest_page.pde_ips : false);
671
672         gvt_vdbg_mm("read ppgtt entry, spt type %d, entry type %d, index %lu, value %llx\n",
673                     type, e->type, index, e->val64);
674         return 0;
675 }
676
677 static inline int ppgtt_spt_set_entry(
678                 struct intel_vgpu_ppgtt_spt *spt,
679                 void *page_table, int type,
680                 struct intel_gvt_gtt_entry *e, unsigned long index,
681                 bool guest)
682 {
683         struct intel_gvt *gvt = spt->vgpu->gvt;
684         const struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
685
686         if (WARN(!gtt_type_is_entry(e->type), "invalid entry type\n"))
687                 return -EINVAL;
688
689         gvt_vdbg_mm("set ppgtt entry, spt type %d, entry type %d, index %lu, value %llx\n",
690                     type, e->type, index, e->val64);
691
692         return ops->set_entry(page_table, e, index, guest,
693                         spt->guest_page.gfn << I915_GTT_PAGE_SHIFT,
694                         spt->vgpu);
695 }
696
697 #define ppgtt_get_guest_entry(spt, e, index) \
698         ppgtt_spt_get_entry(spt, NULL, \
699                 spt->guest_page.type, e, index, true)
700
701 #define ppgtt_set_guest_entry(spt, e, index) \
702         ppgtt_spt_set_entry(spt, NULL, \
703                 spt->guest_page.type, e, index, true)
704
705 #define ppgtt_get_shadow_entry(spt, e, index) \
706         ppgtt_spt_get_entry(spt, spt->shadow_page.vaddr, \
707                 spt->shadow_page.type, e, index, false)
708
709 #define ppgtt_set_shadow_entry(spt, e, index) \
710         ppgtt_spt_set_entry(spt, spt->shadow_page.vaddr, \
711                 spt->shadow_page.type, e, index, false)
712
713 static void *alloc_spt(gfp_t gfp_mask)
714 {
715         struct intel_vgpu_ppgtt_spt *spt;
716
717         spt = kzalloc(sizeof(*spt), gfp_mask);
718         if (!spt)
719                 return NULL;
720
721         spt->shadow_page.page = alloc_page(gfp_mask);
722         if (!spt->shadow_page.page) {
723                 kfree(spt);
724                 return NULL;
725         }
726         return spt;
727 }
728
729 static void free_spt(struct intel_vgpu_ppgtt_spt *spt)
730 {
731         __free_page(spt->shadow_page.page);
732         kfree(spt);
733 }
734
735 static int detach_oos_page(struct intel_vgpu *vgpu,
736                 struct intel_vgpu_oos_page *oos_page);
737
738 static void ppgtt_free_spt(struct intel_vgpu_ppgtt_spt *spt)
739 {
740         struct device *kdev = spt->vgpu->gvt->gt->i915->drm.dev;
741
742         trace_spt_free(spt->vgpu->id, spt, spt->guest_page.type);
743
744         dma_unmap_page(kdev, spt->shadow_page.mfn << I915_GTT_PAGE_SHIFT, 4096,
745                        DMA_BIDIRECTIONAL);
746
747         radix_tree_delete(&spt->vgpu->gtt.spt_tree, spt->shadow_page.mfn);
748
749         if (spt->guest_page.gfn) {
750                 if (spt->guest_page.oos_page)
751                         detach_oos_page(spt->vgpu, spt->guest_page.oos_page);
752
753                 intel_vgpu_unregister_page_track(spt->vgpu, spt->guest_page.gfn);
754         }
755
756         list_del_init(&spt->post_shadow_list);
757         free_spt(spt);
758 }
759
760 static void ppgtt_free_all_spt(struct intel_vgpu *vgpu)
761 {
762         struct intel_vgpu_ppgtt_spt *spt, *spn;
763         struct radix_tree_iter iter;
764         LIST_HEAD(all_spt);
765         void __rcu **slot;
766
767         rcu_read_lock();
768         radix_tree_for_each_slot(slot, &vgpu->gtt.spt_tree, &iter, 0) {
769                 spt = radix_tree_deref_slot(slot);
770                 list_move(&spt->post_shadow_list, &all_spt);
771         }
772         rcu_read_unlock();
773
774         list_for_each_entry_safe(spt, spn, &all_spt, post_shadow_list)
775                 ppgtt_free_spt(spt);
776 }
777
778 static int ppgtt_handle_guest_write_page_table_bytes(
779                 struct intel_vgpu_ppgtt_spt *spt,
780                 u64 pa, void *p_data, int bytes);
781
782 static int ppgtt_write_protection_handler(
783                 struct intel_vgpu_page_track *page_track,
784                 u64 gpa, void *data, int bytes)
785 {
786         struct intel_vgpu_ppgtt_spt *spt = page_track->priv_data;
787
788         int ret;
789
790         if (bytes != 4 && bytes != 8)
791                 return -EINVAL;
792
793         ret = ppgtt_handle_guest_write_page_table_bytes(spt, gpa, data, bytes);
794         if (ret)
795                 return ret;
796         return ret;
797 }
798
799 /* Find a spt by guest gfn. */
800 static struct intel_vgpu_ppgtt_spt *intel_vgpu_find_spt_by_gfn(
801                 struct intel_vgpu *vgpu, unsigned long gfn)
802 {
803         struct intel_vgpu_page_track *track;
804
805         track = intel_vgpu_find_page_track(vgpu, gfn);
806         if (track && track->handler == ppgtt_write_protection_handler)
807                 return track->priv_data;
808
809         return NULL;
810 }
811
812 /* Find the spt by shadow page mfn. */
813 static inline struct intel_vgpu_ppgtt_spt *intel_vgpu_find_spt_by_mfn(
814                 struct intel_vgpu *vgpu, unsigned long mfn)
815 {
816         return radix_tree_lookup(&vgpu->gtt.spt_tree, mfn);
817 }
818
819 static int reclaim_one_ppgtt_mm(struct intel_gvt *gvt);
820
821 /* Allocate shadow page table without guest page. */
822 static struct intel_vgpu_ppgtt_spt *ppgtt_alloc_spt(
823                 struct intel_vgpu *vgpu, enum intel_gvt_gtt_type type)
824 {
825         struct device *kdev = vgpu->gvt->gt->i915->drm.dev;
826         struct intel_vgpu_ppgtt_spt *spt = NULL;
827         dma_addr_t daddr;
828         int ret;
829
830 retry:
831         spt = alloc_spt(GFP_KERNEL | __GFP_ZERO);
832         if (!spt) {
833                 if (reclaim_one_ppgtt_mm(vgpu->gvt))
834                         goto retry;
835
836                 gvt_vgpu_err("fail to allocate ppgtt shadow page\n");
837                 return ERR_PTR(-ENOMEM);
838         }
839
840         spt->vgpu = vgpu;
841         atomic_set(&spt->refcount, 1);
842         INIT_LIST_HEAD(&spt->post_shadow_list);
843
844         /*
845          * Init shadow_page.
846          */
847         spt->shadow_page.type = type;
848         daddr = dma_map_page(kdev, spt->shadow_page.page,
849                              0, 4096, DMA_BIDIRECTIONAL);
850         if (dma_mapping_error(kdev, daddr)) {
851                 gvt_vgpu_err("fail to map dma addr\n");
852                 ret = -EINVAL;
853                 goto err_free_spt;
854         }
855         spt->shadow_page.vaddr = page_address(spt->shadow_page.page);
856         spt->shadow_page.mfn = daddr >> I915_GTT_PAGE_SHIFT;
857
858         ret = radix_tree_insert(&vgpu->gtt.spt_tree, spt->shadow_page.mfn, spt);
859         if (ret)
860                 goto err_unmap_dma;
861
862         return spt;
863
864 err_unmap_dma:
865         dma_unmap_page(kdev, daddr, PAGE_SIZE, DMA_BIDIRECTIONAL);
866 err_free_spt:
867         free_spt(spt);
868         return ERR_PTR(ret);
869 }
870
871 /* Allocate shadow page table associated with specific gfn. */
872 static struct intel_vgpu_ppgtt_spt *ppgtt_alloc_spt_gfn(
873                 struct intel_vgpu *vgpu, enum intel_gvt_gtt_type type,
874                 unsigned long gfn, bool guest_pde_ips)
875 {
876         struct intel_vgpu_ppgtt_spt *spt;
877         int ret;
878
879         spt = ppgtt_alloc_spt(vgpu, type);
880         if (IS_ERR(spt))
881                 return spt;
882
883         /*
884          * Init guest_page.
885          */
886         ret = intel_vgpu_register_page_track(vgpu, gfn,
887                         ppgtt_write_protection_handler, spt);
888         if (ret) {
889                 ppgtt_free_spt(spt);
890                 return ERR_PTR(ret);
891         }
892
893         spt->guest_page.type = type;
894         spt->guest_page.gfn = gfn;
895         spt->guest_page.pde_ips = guest_pde_ips;
896
897         trace_spt_alloc(vgpu->id, spt, type, spt->shadow_page.mfn, gfn);
898
899         return spt;
900 }
901
902 #define pt_entry_size_shift(spt) \
903         ((spt)->vgpu->gvt->device_info.gtt_entry_size_shift)
904
905 #define pt_entries(spt) \
906         (I915_GTT_PAGE_SIZE >> pt_entry_size_shift(spt))
907
908 #define for_each_present_guest_entry(spt, e, i) \
909         for (i = 0; i < pt_entries(spt); \
910              i += spt->guest_page.pde_ips ? GTT_64K_PTE_STRIDE : 1) \
911                 if (!ppgtt_get_guest_entry(spt, e, i) && \
912                     spt->vgpu->gvt->gtt.pte_ops->test_present(e))
913
914 #define for_each_present_shadow_entry(spt, e, i) \
915         for (i = 0; i < pt_entries(spt); \
916              i += spt->shadow_page.pde_ips ? GTT_64K_PTE_STRIDE : 1) \
917                 if (!ppgtt_get_shadow_entry(spt, e, i) && \
918                     spt->vgpu->gvt->gtt.pte_ops->test_present(e))
919
920 #define for_each_shadow_entry(spt, e, i) \
921         for (i = 0; i < pt_entries(spt); \
922              i += (spt->shadow_page.pde_ips ? GTT_64K_PTE_STRIDE : 1)) \
923                 if (!ppgtt_get_shadow_entry(spt, e, i))
924
925 static inline void ppgtt_get_spt(struct intel_vgpu_ppgtt_spt *spt)
926 {
927         int v = atomic_read(&spt->refcount);
928
929         trace_spt_refcount(spt->vgpu->id, "inc", spt, v, (v + 1));
930         atomic_inc(&spt->refcount);
931 }
932
933 static inline int ppgtt_put_spt(struct intel_vgpu_ppgtt_spt *spt)
934 {
935         int v = atomic_read(&spt->refcount);
936
937         trace_spt_refcount(spt->vgpu->id, "dec", spt, v, (v - 1));
938         return atomic_dec_return(&spt->refcount);
939 }
940
941 static int ppgtt_invalidate_spt(struct intel_vgpu_ppgtt_spt *spt);
942
943 static int ppgtt_invalidate_spt_by_shadow_entry(struct intel_vgpu *vgpu,
944                 struct intel_gvt_gtt_entry *e)
945 {
946         struct drm_i915_private *i915 = vgpu->gvt->gt->i915;
947         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
948         struct intel_vgpu_ppgtt_spt *s;
949         enum intel_gvt_gtt_type cur_pt_type;
950
951         GEM_BUG_ON(!gtt_type_is_pt(get_next_pt_type(e->type)));
952
953         if (e->type != GTT_TYPE_PPGTT_ROOT_L3_ENTRY
954                 && e->type != GTT_TYPE_PPGTT_ROOT_L4_ENTRY) {
955                 cur_pt_type = get_next_pt_type(e->type);
956
957                 if (!gtt_type_is_pt(cur_pt_type) ||
958                                 !gtt_type_is_pt(cur_pt_type + 1)) {
959                         drm_WARN(&i915->drm, 1,
960                                  "Invalid page table type, cur_pt_type is: %d\n",
961                                  cur_pt_type);
962                         return -EINVAL;
963                 }
964
965                 cur_pt_type += 1;
966
967                 if (ops->get_pfn(e) ==
968                         vgpu->gtt.scratch_pt[cur_pt_type].page_mfn)
969                         return 0;
970         }
971         s = intel_vgpu_find_spt_by_mfn(vgpu, ops->get_pfn(e));
972         if (!s) {
973                 gvt_vgpu_err("fail to find shadow page: mfn: 0x%lx\n",
974                                 ops->get_pfn(e));
975                 return -ENXIO;
976         }
977         return ppgtt_invalidate_spt(s);
978 }
979
980 static inline void ppgtt_invalidate_pte(struct intel_vgpu_ppgtt_spt *spt,
981                 struct intel_gvt_gtt_entry *entry)
982 {
983         struct intel_vgpu *vgpu = spt->vgpu;
984         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
985         unsigned long pfn;
986         int type;
987
988         pfn = ops->get_pfn(entry);
989         type = spt->shadow_page.type;
990
991         /* Uninitialized spte or unshadowed spte. */
992         if (!pfn || pfn == vgpu->gtt.scratch_pt[type].page_mfn)
993                 return;
994
995         intel_gvt_dma_unmap_guest_page(vgpu, pfn << PAGE_SHIFT);
996 }
997
998 static int ppgtt_invalidate_spt(struct intel_vgpu_ppgtt_spt *spt)
999 {
1000         struct intel_vgpu *vgpu = spt->vgpu;
1001         struct intel_gvt_gtt_entry e;
1002         unsigned long index;
1003         int ret;
1004
1005         trace_spt_change(spt->vgpu->id, "die", spt,
1006                         spt->guest_page.gfn, spt->shadow_page.type);
1007
1008         if (ppgtt_put_spt(spt) > 0)
1009                 return 0;
1010
1011         for_each_present_shadow_entry(spt, &e, index) {
1012                 switch (e.type) {
1013                 case GTT_TYPE_PPGTT_PTE_4K_ENTRY:
1014                         gvt_vdbg_mm("invalidate 4K entry\n");
1015                         ppgtt_invalidate_pte(spt, &e);
1016                         break;
1017                 case GTT_TYPE_PPGTT_PTE_64K_ENTRY:
1018                         /* We don't setup 64K shadow entry so far. */
1019                         WARN(1, "suspicious 64K gtt entry\n");
1020                         continue;
1021                 case GTT_TYPE_PPGTT_PTE_2M_ENTRY:
1022                         gvt_vdbg_mm("invalidate 2M entry\n");
1023                         continue;
1024                 case GTT_TYPE_PPGTT_PTE_1G_ENTRY:
1025                         WARN(1, "GVT doesn't support 1GB page\n");
1026                         continue;
1027                 case GTT_TYPE_PPGTT_PML4_ENTRY:
1028                 case GTT_TYPE_PPGTT_PDP_ENTRY:
1029                 case GTT_TYPE_PPGTT_PDE_ENTRY:
1030                         gvt_vdbg_mm("invalidate PMUL4/PDP/PDE entry\n");
1031                         ret = ppgtt_invalidate_spt_by_shadow_entry(
1032                                         spt->vgpu, &e);
1033                         if (ret)
1034                                 goto fail;
1035                         break;
1036                 default:
1037                         GEM_BUG_ON(1);
1038                 }
1039         }
1040
1041         trace_spt_change(spt->vgpu->id, "release", spt,
1042                          spt->guest_page.gfn, spt->shadow_page.type);
1043         ppgtt_free_spt(spt);
1044         return 0;
1045 fail:
1046         gvt_vgpu_err("fail: shadow page %p shadow entry 0x%llx type %d\n",
1047                         spt, e.val64, e.type);
1048         return ret;
1049 }
1050
1051 static bool vgpu_ips_enabled(struct intel_vgpu *vgpu)
1052 {
1053         struct drm_i915_private *dev_priv = vgpu->gvt->gt->i915;
1054
1055         if (GRAPHICS_VER(dev_priv) == 9) {
1056                 u32 ips = vgpu_vreg_t(vgpu, GEN8_GAMW_ECO_DEV_RW_IA) &
1057                         GAMW_ECO_ENABLE_64K_IPS_FIELD;
1058
1059                 return ips == GAMW_ECO_ENABLE_64K_IPS_FIELD;
1060         } else if (GRAPHICS_VER(dev_priv) >= 11) {
1061                 /* 64K paging only controlled by IPS bit in PTE now. */
1062                 return true;
1063         } else
1064                 return false;
1065 }
1066
1067 static int ppgtt_populate_spt(struct intel_vgpu_ppgtt_spt *spt);
1068
1069 static struct intel_vgpu_ppgtt_spt *ppgtt_populate_spt_by_guest_entry(
1070                 struct intel_vgpu *vgpu, struct intel_gvt_gtt_entry *we)
1071 {
1072         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
1073         struct intel_vgpu_ppgtt_spt *spt = NULL;
1074         bool ips = false;
1075         int ret;
1076
1077         GEM_BUG_ON(!gtt_type_is_pt(get_next_pt_type(we->type)));
1078
1079         if (we->type == GTT_TYPE_PPGTT_PDE_ENTRY)
1080                 ips = vgpu_ips_enabled(vgpu) && ops->test_ips(we);
1081
1082         spt = intel_vgpu_find_spt_by_gfn(vgpu, ops->get_pfn(we));
1083         if (spt) {
1084                 ppgtt_get_spt(spt);
1085
1086                 if (ips != spt->guest_page.pde_ips) {
1087                         spt->guest_page.pde_ips = ips;
1088
1089                         gvt_dbg_mm("reshadow PDE since ips changed\n");
1090                         clear_page(spt->shadow_page.vaddr);
1091                         ret = ppgtt_populate_spt(spt);
1092                         if (ret) {
1093                                 ppgtt_put_spt(spt);
1094                                 goto err;
1095                         }
1096                 }
1097         } else {
1098                 int type = get_next_pt_type(we->type);
1099
1100                 if (!gtt_type_is_pt(type)) {
1101                         ret = -EINVAL;
1102                         goto err;
1103                 }
1104
1105                 spt = ppgtt_alloc_spt_gfn(vgpu, type, ops->get_pfn(we), ips);
1106                 if (IS_ERR(spt)) {
1107                         ret = PTR_ERR(spt);
1108                         goto err;
1109                 }
1110
1111                 ret = intel_vgpu_enable_page_track(vgpu, spt->guest_page.gfn);
1112                 if (ret)
1113                         goto err_free_spt;
1114
1115                 ret = ppgtt_populate_spt(spt);
1116                 if (ret)
1117                         goto err_free_spt;
1118
1119                 trace_spt_change(vgpu->id, "new", spt, spt->guest_page.gfn,
1120                                  spt->shadow_page.type);
1121         }
1122         return spt;
1123
1124 err_free_spt:
1125         ppgtt_free_spt(spt);
1126         spt = NULL;
1127 err:
1128         gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d\n",
1129                      spt, we->val64, we->type);
1130         return ERR_PTR(ret);
1131 }
1132
1133 static inline void ppgtt_generate_shadow_entry(struct intel_gvt_gtt_entry *se,
1134                 struct intel_vgpu_ppgtt_spt *s, struct intel_gvt_gtt_entry *ge)
1135 {
1136         const struct intel_gvt_gtt_pte_ops *ops = s->vgpu->gvt->gtt.pte_ops;
1137
1138         se->type = ge->type;
1139         se->val64 = ge->val64;
1140
1141         /* Because we always split 64KB pages, so clear IPS in shadow PDE. */
1142         if (se->type == GTT_TYPE_PPGTT_PDE_ENTRY)
1143                 ops->clear_ips(se);
1144
1145         ops->set_pfn(se, s->shadow_page.mfn);
1146 }
1147
1148 static int split_2MB_gtt_entry(struct intel_vgpu *vgpu,
1149         struct intel_vgpu_ppgtt_spt *spt, unsigned long index,
1150         struct intel_gvt_gtt_entry *se)
1151 {
1152         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
1153         struct intel_vgpu_ppgtt_spt *sub_spt;
1154         struct intel_gvt_gtt_entry sub_se;
1155         unsigned long start_gfn;
1156         dma_addr_t dma_addr;
1157         unsigned long sub_index;
1158         int ret;
1159
1160         gvt_dbg_mm("Split 2M gtt entry, index %lu\n", index);
1161
1162         start_gfn = ops->get_pfn(se);
1163
1164         sub_spt = ppgtt_alloc_spt(vgpu, GTT_TYPE_PPGTT_PTE_PT);
1165         if (IS_ERR(sub_spt))
1166                 return PTR_ERR(sub_spt);
1167
1168         for_each_shadow_entry(sub_spt, &sub_se, sub_index) {
1169                 ret = intel_gvt_dma_map_guest_page(vgpu, start_gfn + sub_index,
1170                                                    PAGE_SIZE, &dma_addr);
1171                 if (ret)
1172                         goto err;
1173                 sub_se.val64 = se->val64;
1174
1175                 /* Copy the PAT field from PDE. */
1176                 sub_se.val64 &= ~_PAGE_PAT;
1177                 sub_se.val64 |= (se->val64 & _PAGE_PAT_LARGE) >> 5;
1178
1179                 ops->set_pfn(&sub_se, dma_addr >> PAGE_SHIFT);
1180                 ppgtt_set_shadow_entry(sub_spt, &sub_se, sub_index);
1181         }
1182
1183         /* Clear dirty field. */
1184         se->val64 &= ~_PAGE_DIRTY;
1185
1186         ops->clear_pse(se);
1187         ops->clear_ips(se);
1188         ops->set_pfn(se, sub_spt->shadow_page.mfn);
1189         ppgtt_set_shadow_entry(spt, se, index);
1190         return 0;
1191 err:
1192         /* Cancel the existing addess mappings of DMA addr. */
1193         for_each_present_shadow_entry(sub_spt, &sub_se, sub_index) {
1194                 gvt_vdbg_mm("invalidate 4K entry\n");
1195                 ppgtt_invalidate_pte(sub_spt, &sub_se);
1196         }
1197         /* Release the new allocated spt. */
1198         trace_spt_change(sub_spt->vgpu->id, "release", sub_spt,
1199                 sub_spt->guest_page.gfn, sub_spt->shadow_page.type);
1200         ppgtt_free_spt(sub_spt);
1201         return ret;
1202 }
1203
1204 static int split_64KB_gtt_entry(struct intel_vgpu *vgpu,
1205         struct intel_vgpu_ppgtt_spt *spt, unsigned long index,
1206         struct intel_gvt_gtt_entry *se)
1207 {
1208         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
1209         struct intel_gvt_gtt_entry entry = *se;
1210         unsigned long start_gfn;
1211         dma_addr_t dma_addr;
1212         int i, ret;
1213
1214         gvt_vdbg_mm("Split 64K gtt entry, index %lu\n", index);
1215
1216         GEM_BUG_ON(index % GTT_64K_PTE_STRIDE);
1217
1218         start_gfn = ops->get_pfn(se);
1219
1220         entry.type = GTT_TYPE_PPGTT_PTE_4K_ENTRY;
1221         ops->set_64k_splited(&entry);
1222
1223         for (i = 0; i < GTT_64K_PTE_STRIDE; i++) {
1224                 ret = intel_gvt_dma_map_guest_page(vgpu, start_gfn + i,
1225                                                    PAGE_SIZE, &dma_addr);
1226                 if (ret)
1227                         return ret;
1228
1229                 ops->set_pfn(&entry, dma_addr >> PAGE_SHIFT);
1230                 ppgtt_set_shadow_entry(spt, &entry, index + i);
1231         }
1232         return 0;
1233 }
1234
1235 static int ppgtt_populate_shadow_entry(struct intel_vgpu *vgpu,
1236         struct intel_vgpu_ppgtt_spt *spt, unsigned long index,
1237         struct intel_gvt_gtt_entry *ge)
1238 {
1239         const struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
1240         struct intel_gvt_gtt_entry se = *ge;
1241         unsigned long gfn;
1242         dma_addr_t dma_addr;
1243         int ret;
1244
1245         if (!pte_ops->test_present(ge))
1246                 return 0;
1247
1248         gfn = pte_ops->get_pfn(ge);
1249
1250         switch (ge->type) {
1251         case GTT_TYPE_PPGTT_PTE_4K_ENTRY:
1252                 gvt_vdbg_mm("shadow 4K gtt entry\n");
1253                 ret = intel_gvt_dma_map_guest_page(vgpu, gfn, PAGE_SIZE, &dma_addr);
1254                 if (ret)
1255                         return -ENXIO;
1256                 break;
1257         case GTT_TYPE_PPGTT_PTE_64K_ENTRY:
1258                 gvt_vdbg_mm("shadow 64K gtt entry\n");
1259                 /*
1260                  * The layout of 64K page is special, the page size is
1261                  * controlled by uper PDE. To be simple, we always split
1262                  * 64K page to smaller 4K pages in shadow PT.
1263                  */
1264                 return split_64KB_gtt_entry(vgpu, spt, index, &se);
1265         case GTT_TYPE_PPGTT_PTE_2M_ENTRY:
1266                 gvt_vdbg_mm("shadow 2M gtt entry\n");
1267                 if (!HAS_PAGE_SIZES(vgpu->gvt->gt->i915, I915_GTT_PAGE_SIZE_2M) ||
1268                     intel_gvt_dma_map_guest_page(vgpu, gfn,
1269                                                  I915_GTT_PAGE_SIZE_2M, &dma_addr))
1270                         return split_2MB_gtt_entry(vgpu, spt, index, &se);
1271                 break;
1272         case GTT_TYPE_PPGTT_PTE_1G_ENTRY:
1273                 gvt_vgpu_err("GVT doesn't support 1GB entry\n");
1274                 return -EINVAL;
1275         default:
1276                 GEM_BUG_ON(1);
1277                 return -EINVAL;
1278         }
1279
1280         /* Successfully shadowed a 4K or 2M page (without splitting). */
1281         pte_ops->set_pfn(&se, dma_addr >> PAGE_SHIFT);
1282         ppgtt_set_shadow_entry(spt, &se, index);
1283         return 0;
1284 }
1285
1286 static int ppgtt_populate_spt(struct intel_vgpu_ppgtt_spt *spt)
1287 {
1288         struct intel_vgpu *vgpu = spt->vgpu;
1289         struct intel_vgpu_ppgtt_spt *s;
1290         struct intel_gvt_gtt_entry se, ge;
1291         unsigned long i;
1292         int ret;
1293
1294         trace_spt_change(spt->vgpu->id, "born", spt,
1295                          spt->guest_page.gfn, spt->shadow_page.type);
1296
1297         for_each_present_guest_entry(spt, &ge, i) {
1298                 if (gtt_type_is_pt(get_next_pt_type(ge.type))) {
1299                         s = ppgtt_populate_spt_by_guest_entry(vgpu, &ge);
1300                         if (IS_ERR(s)) {
1301                                 ret = PTR_ERR(s);
1302                                 goto fail;
1303                         }
1304                         ppgtt_get_shadow_entry(spt, &se, i);
1305                         ppgtt_generate_shadow_entry(&se, s, &ge);
1306                         ppgtt_set_shadow_entry(spt, &se, i);
1307                 } else {
1308                         ret = ppgtt_populate_shadow_entry(vgpu, spt, i, &ge);
1309                         if (ret)
1310                                 goto fail;
1311                 }
1312         }
1313         return 0;
1314 fail:
1315         gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d\n",
1316                         spt, ge.val64, ge.type);
1317         return ret;
1318 }
1319
1320 static int ppgtt_handle_guest_entry_removal(struct intel_vgpu_ppgtt_spt *spt,
1321                 struct intel_gvt_gtt_entry *se, unsigned long index)
1322 {
1323         struct intel_vgpu *vgpu = spt->vgpu;
1324         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
1325         int ret;
1326
1327         trace_spt_guest_change(spt->vgpu->id, "remove", spt,
1328                                spt->shadow_page.type, se->val64, index);
1329
1330         gvt_vdbg_mm("destroy old shadow entry, type %d, index %lu, value %llx\n",
1331                     se->type, index, se->val64);
1332
1333         if (!ops->test_present(se))
1334                 return 0;
1335
1336         if (ops->get_pfn(se) ==
1337             vgpu->gtt.scratch_pt[spt->shadow_page.type].page_mfn)
1338                 return 0;
1339
1340         if (gtt_type_is_pt(get_next_pt_type(se->type))) {
1341                 struct intel_vgpu_ppgtt_spt *s =
1342                         intel_vgpu_find_spt_by_mfn(vgpu, ops->get_pfn(se));
1343                 if (!s) {
1344                         gvt_vgpu_err("fail to find guest page\n");
1345                         ret = -ENXIO;
1346                         goto fail;
1347                 }
1348                 ret = ppgtt_invalidate_spt(s);
1349                 if (ret)
1350                         goto fail;
1351         } else {
1352                 /* We don't setup 64K shadow entry so far. */
1353                 WARN(se->type == GTT_TYPE_PPGTT_PTE_64K_ENTRY,
1354                      "suspicious 64K entry\n");
1355                 ppgtt_invalidate_pte(spt, se);
1356         }
1357
1358         return 0;
1359 fail:
1360         gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d\n",
1361                         spt, se->val64, se->type);
1362         return ret;
1363 }
1364
1365 static int ppgtt_handle_guest_entry_add(struct intel_vgpu_ppgtt_spt *spt,
1366                 struct intel_gvt_gtt_entry *we, unsigned long index)
1367 {
1368         struct intel_vgpu *vgpu = spt->vgpu;
1369         struct intel_gvt_gtt_entry m;
1370         struct intel_vgpu_ppgtt_spt *s;
1371         int ret;
1372
1373         trace_spt_guest_change(spt->vgpu->id, "add", spt, spt->shadow_page.type,
1374                                we->val64, index);
1375
1376         gvt_vdbg_mm("add shadow entry: type %d, index %lu, value %llx\n",
1377                     we->type, index, we->val64);
1378
1379         if (gtt_type_is_pt(get_next_pt_type(we->type))) {
1380                 s = ppgtt_populate_spt_by_guest_entry(vgpu, we);
1381                 if (IS_ERR(s)) {
1382                         ret = PTR_ERR(s);
1383                         goto fail;
1384                 }
1385                 ppgtt_get_shadow_entry(spt, &m, index);
1386                 ppgtt_generate_shadow_entry(&m, s, we);
1387                 ppgtt_set_shadow_entry(spt, &m, index);
1388         } else {
1389                 ret = ppgtt_populate_shadow_entry(vgpu, spt, index, we);
1390                 if (ret)
1391                         goto fail;
1392         }
1393         return 0;
1394 fail:
1395         gvt_vgpu_err("fail: spt %p guest entry 0x%llx type %d\n",
1396                 spt, we->val64, we->type);
1397         return ret;
1398 }
1399
1400 static int sync_oos_page(struct intel_vgpu *vgpu,
1401                 struct intel_vgpu_oos_page *oos_page)
1402 {
1403         const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
1404         struct intel_gvt *gvt = vgpu->gvt;
1405         const struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
1406         struct intel_vgpu_ppgtt_spt *spt = oos_page->spt;
1407         struct intel_gvt_gtt_entry old, new;
1408         int index;
1409         int ret;
1410
1411         trace_oos_change(vgpu->id, "sync", oos_page->id,
1412                          spt, spt->guest_page.type);
1413
1414         old.type = new.type = get_entry_type(spt->guest_page.type);
1415         old.val64 = new.val64 = 0;
1416
1417         for (index = 0; index < (I915_GTT_PAGE_SIZE >>
1418                                 info->gtt_entry_size_shift); index++) {
1419                 ops->get_entry(oos_page->mem, &old, index, false, 0, vgpu);
1420                 ops->get_entry(NULL, &new, index, true,
1421                                spt->guest_page.gfn << PAGE_SHIFT, vgpu);
1422
1423                 if (old.val64 == new.val64
1424                         && !test_and_clear_bit(index, spt->post_shadow_bitmap))
1425                         continue;
1426
1427                 trace_oos_sync(vgpu->id, oos_page->id,
1428                                 spt, spt->guest_page.type,
1429                                 new.val64, index);
1430
1431                 ret = ppgtt_populate_shadow_entry(vgpu, spt, index, &new);
1432                 if (ret)
1433                         return ret;
1434
1435                 ops->set_entry(oos_page->mem, &new, index, false, 0, vgpu);
1436         }
1437
1438         spt->guest_page.write_cnt = 0;
1439         list_del_init(&spt->post_shadow_list);
1440         return 0;
1441 }
1442
1443 static int detach_oos_page(struct intel_vgpu *vgpu,
1444                 struct intel_vgpu_oos_page *oos_page)
1445 {
1446         struct intel_gvt *gvt = vgpu->gvt;
1447         struct intel_vgpu_ppgtt_spt *spt = oos_page->spt;
1448
1449         trace_oos_change(vgpu->id, "detach", oos_page->id,
1450                          spt, spt->guest_page.type);
1451
1452         spt->guest_page.write_cnt = 0;
1453         spt->guest_page.oos_page = NULL;
1454         oos_page->spt = NULL;
1455
1456         list_del_init(&oos_page->vm_list);
1457         list_move_tail(&oos_page->list, &gvt->gtt.oos_page_free_list_head);
1458
1459         return 0;
1460 }
1461
1462 static int attach_oos_page(struct intel_vgpu_oos_page *oos_page,
1463                 struct intel_vgpu_ppgtt_spt *spt)
1464 {
1465         struct intel_gvt *gvt = spt->vgpu->gvt;
1466         int ret;
1467
1468         ret = intel_gvt_read_gpa(spt->vgpu,
1469                         spt->guest_page.gfn << I915_GTT_PAGE_SHIFT,
1470                         oos_page->mem, I915_GTT_PAGE_SIZE);
1471         if (ret)
1472                 return ret;
1473
1474         oos_page->spt = spt;
1475         spt->guest_page.oos_page = oos_page;
1476
1477         list_move_tail(&oos_page->list, &gvt->gtt.oos_page_use_list_head);
1478
1479         trace_oos_change(spt->vgpu->id, "attach", oos_page->id,
1480                          spt, spt->guest_page.type);
1481         return 0;
1482 }
1483
1484 static int ppgtt_set_guest_page_sync(struct intel_vgpu_ppgtt_spt *spt)
1485 {
1486         struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page;
1487         int ret;
1488
1489         ret = intel_vgpu_enable_page_track(spt->vgpu, spt->guest_page.gfn);
1490         if (ret)
1491                 return ret;
1492
1493         trace_oos_change(spt->vgpu->id, "set page sync", oos_page->id,
1494                          spt, spt->guest_page.type);
1495
1496         list_del_init(&oos_page->vm_list);
1497         return sync_oos_page(spt->vgpu, oos_page);
1498 }
1499
1500 static int ppgtt_allocate_oos_page(struct intel_vgpu_ppgtt_spt *spt)
1501 {
1502         struct intel_gvt *gvt = spt->vgpu->gvt;
1503         struct intel_gvt_gtt *gtt = &gvt->gtt;
1504         struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page;
1505         int ret;
1506
1507         WARN(oos_page, "shadow PPGTT page has already has a oos page\n");
1508
1509         if (list_empty(&gtt->oos_page_free_list_head)) {
1510                 oos_page = container_of(gtt->oos_page_use_list_head.next,
1511                         struct intel_vgpu_oos_page, list);
1512                 ret = ppgtt_set_guest_page_sync(oos_page->spt);
1513                 if (ret)
1514                         return ret;
1515                 ret = detach_oos_page(spt->vgpu, oos_page);
1516                 if (ret)
1517                         return ret;
1518         } else
1519                 oos_page = container_of(gtt->oos_page_free_list_head.next,
1520                         struct intel_vgpu_oos_page, list);
1521         return attach_oos_page(oos_page, spt);
1522 }
1523
1524 static int ppgtt_set_guest_page_oos(struct intel_vgpu_ppgtt_spt *spt)
1525 {
1526         struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page;
1527
1528         if (WARN(!oos_page, "shadow PPGTT page should have a oos page\n"))
1529                 return -EINVAL;
1530
1531         trace_oos_change(spt->vgpu->id, "set page out of sync", oos_page->id,
1532                          spt, spt->guest_page.type);
1533
1534         list_add_tail(&oos_page->vm_list, &spt->vgpu->gtt.oos_page_list_head);
1535         return intel_vgpu_disable_page_track(spt->vgpu, spt->guest_page.gfn);
1536 }
1537
1538 /**
1539  * intel_vgpu_sync_oos_pages - sync all the out-of-synced shadow for vGPU
1540  * @vgpu: a vGPU
1541  *
1542  * This function is called before submitting a guest workload to host,
1543  * to sync all the out-of-synced shadow for vGPU
1544  *
1545  * Returns:
1546  * Zero on success, negative error code if failed.
1547  */
1548 int intel_vgpu_sync_oos_pages(struct intel_vgpu *vgpu)
1549 {
1550         struct list_head *pos, *n;
1551         struct intel_vgpu_oos_page *oos_page;
1552         int ret;
1553
1554         if (!enable_out_of_sync)
1555                 return 0;
1556
1557         list_for_each_safe(pos, n, &vgpu->gtt.oos_page_list_head) {
1558                 oos_page = container_of(pos,
1559                                 struct intel_vgpu_oos_page, vm_list);
1560                 ret = ppgtt_set_guest_page_sync(oos_page->spt);
1561                 if (ret)
1562                         return ret;
1563         }
1564         return 0;
1565 }
1566
1567 /*
1568  * The heart of PPGTT shadow page table.
1569  */
1570 static int ppgtt_handle_guest_write_page_table(
1571                 struct intel_vgpu_ppgtt_spt *spt,
1572                 struct intel_gvt_gtt_entry *we, unsigned long index)
1573 {
1574         struct intel_vgpu *vgpu = spt->vgpu;
1575         int type = spt->shadow_page.type;
1576         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
1577         struct intel_gvt_gtt_entry old_se;
1578         int new_present;
1579         int i, ret;
1580
1581         new_present = ops->test_present(we);
1582
1583         /*
1584          * Adding the new entry first and then removing the old one, that can
1585          * guarantee the ppgtt table is validated during the window between
1586          * adding and removal.
1587          */
1588         ppgtt_get_shadow_entry(spt, &old_se, index);
1589
1590         if (new_present) {
1591                 ret = ppgtt_handle_guest_entry_add(spt, we, index);
1592                 if (ret)
1593                         goto fail;
1594         }
1595
1596         ret = ppgtt_handle_guest_entry_removal(spt, &old_se, index);
1597         if (ret)
1598                 goto fail;
1599
1600         if (!new_present) {
1601                 /* For 64KB splited entries, we need clear them all. */
1602                 if (ops->test_64k_splited(&old_se) &&
1603                     !(index % GTT_64K_PTE_STRIDE)) {
1604                         gvt_vdbg_mm("remove splited 64K shadow entries\n");
1605                         for (i = 0; i < GTT_64K_PTE_STRIDE; i++) {
1606                                 ops->clear_64k_splited(&old_se);
1607                                 ops->set_pfn(&old_se,
1608                                         vgpu->gtt.scratch_pt[type].page_mfn);
1609                                 ppgtt_set_shadow_entry(spt, &old_se, index + i);
1610                         }
1611                 } else if (old_se.type == GTT_TYPE_PPGTT_PTE_2M_ENTRY ||
1612                            old_se.type == GTT_TYPE_PPGTT_PTE_1G_ENTRY) {
1613                         ops->clear_pse(&old_se);
1614                         ops->set_pfn(&old_se,
1615                                      vgpu->gtt.scratch_pt[type].page_mfn);
1616                         ppgtt_set_shadow_entry(spt, &old_se, index);
1617                 } else {
1618                         ops->set_pfn(&old_se,
1619                                      vgpu->gtt.scratch_pt[type].page_mfn);
1620                         ppgtt_set_shadow_entry(spt, &old_se, index);
1621                 }
1622         }
1623
1624         return 0;
1625 fail:
1626         gvt_vgpu_err("fail: shadow page %p guest entry 0x%llx type %d.\n",
1627                         spt, we->val64, we->type);
1628         return ret;
1629 }
1630
1631
1632
1633 static inline bool can_do_out_of_sync(struct intel_vgpu_ppgtt_spt *spt)
1634 {
1635         return enable_out_of_sync
1636                 && gtt_type_is_pte_pt(spt->guest_page.type)
1637                 && spt->guest_page.write_cnt >= 2;
1638 }
1639
1640 static void ppgtt_set_post_shadow(struct intel_vgpu_ppgtt_spt *spt,
1641                 unsigned long index)
1642 {
1643         set_bit(index, spt->post_shadow_bitmap);
1644         if (!list_empty(&spt->post_shadow_list))
1645                 return;
1646
1647         list_add_tail(&spt->post_shadow_list,
1648                         &spt->vgpu->gtt.post_shadow_list_head);
1649 }
1650
1651 /**
1652  * intel_vgpu_flush_post_shadow - flush the post shadow transactions
1653  * @vgpu: a vGPU
1654  *
1655  * This function is called before submitting a guest workload to host,
1656  * to flush all the post shadows for a vGPU.
1657  *
1658  * Returns:
1659  * Zero on success, negative error code if failed.
1660  */
1661 int intel_vgpu_flush_post_shadow(struct intel_vgpu *vgpu)
1662 {
1663         struct list_head *pos, *n;
1664         struct intel_vgpu_ppgtt_spt *spt;
1665         struct intel_gvt_gtt_entry ge;
1666         unsigned long index;
1667         int ret;
1668
1669         list_for_each_safe(pos, n, &vgpu->gtt.post_shadow_list_head) {
1670                 spt = container_of(pos, struct intel_vgpu_ppgtt_spt,
1671                                 post_shadow_list);
1672
1673                 for_each_set_bit(index, spt->post_shadow_bitmap,
1674                                 GTT_ENTRY_NUM_IN_ONE_PAGE) {
1675                         ppgtt_get_guest_entry(spt, &ge, index);
1676
1677                         ret = ppgtt_handle_guest_write_page_table(spt,
1678                                                         &ge, index);
1679                         if (ret)
1680                                 return ret;
1681                         clear_bit(index, spt->post_shadow_bitmap);
1682                 }
1683                 list_del_init(&spt->post_shadow_list);
1684         }
1685         return 0;
1686 }
1687
1688 static int ppgtt_handle_guest_write_page_table_bytes(
1689                 struct intel_vgpu_ppgtt_spt *spt,
1690                 u64 pa, void *p_data, int bytes)
1691 {
1692         struct intel_vgpu *vgpu = spt->vgpu;
1693         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
1694         const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
1695         struct intel_gvt_gtt_entry we, se;
1696         unsigned long index;
1697         int ret;
1698
1699         index = (pa & (PAGE_SIZE - 1)) >> info->gtt_entry_size_shift;
1700
1701         ppgtt_get_guest_entry(spt, &we, index);
1702
1703         /*
1704          * For page table which has 64K gtt entry, only PTE#0, PTE#16,
1705          * PTE#32, ... PTE#496 are used. Unused PTEs update should be
1706          * ignored.
1707          */
1708         if (we.type == GTT_TYPE_PPGTT_PTE_64K_ENTRY &&
1709             (index % GTT_64K_PTE_STRIDE)) {
1710                 gvt_vdbg_mm("Ignore write to unused PTE entry, index %lu\n",
1711                             index);
1712                 return 0;
1713         }
1714
1715         if (bytes == info->gtt_entry_size) {
1716                 ret = ppgtt_handle_guest_write_page_table(spt, &we, index);
1717                 if (ret)
1718                         return ret;
1719         } else {
1720                 if (!test_bit(index, spt->post_shadow_bitmap)) {
1721                         int type = spt->shadow_page.type;
1722
1723                         ppgtt_get_shadow_entry(spt, &se, index);
1724                         ret = ppgtt_handle_guest_entry_removal(spt, &se, index);
1725                         if (ret)
1726                                 return ret;
1727                         ops->set_pfn(&se, vgpu->gtt.scratch_pt[type].page_mfn);
1728                         ppgtt_set_shadow_entry(spt, &se, index);
1729                 }
1730                 ppgtt_set_post_shadow(spt, index);
1731         }
1732
1733         if (!enable_out_of_sync)
1734                 return 0;
1735
1736         spt->guest_page.write_cnt++;
1737
1738         if (spt->guest_page.oos_page)
1739                 ops->set_entry(spt->guest_page.oos_page->mem, &we, index,
1740                                 false, 0, vgpu);
1741
1742         if (can_do_out_of_sync(spt)) {
1743                 if (!spt->guest_page.oos_page)
1744                         ppgtt_allocate_oos_page(spt);
1745
1746                 ret = ppgtt_set_guest_page_oos(spt);
1747                 if (ret < 0)
1748                         return ret;
1749         }
1750         return 0;
1751 }
1752
1753 static void invalidate_ppgtt_mm(struct intel_vgpu_mm *mm)
1754 {
1755         struct intel_vgpu *vgpu = mm->vgpu;
1756         struct intel_gvt *gvt = vgpu->gvt;
1757         struct intel_gvt_gtt *gtt = &gvt->gtt;
1758         const struct intel_gvt_gtt_pte_ops *ops = gtt->pte_ops;
1759         struct intel_gvt_gtt_entry se;
1760         int index;
1761
1762         if (!mm->ppgtt_mm.shadowed)
1763                 return;
1764
1765         for (index = 0; index < ARRAY_SIZE(mm->ppgtt_mm.shadow_pdps); index++) {
1766                 ppgtt_get_shadow_root_entry(mm, &se, index);
1767
1768                 if (!ops->test_present(&se))
1769                         continue;
1770
1771                 ppgtt_invalidate_spt_by_shadow_entry(vgpu, &se);
1772                 se.val64 = 0;
1773                 ppgtt_set_shadow_root_entry(mm, &se, index);
1774
1775                 trace_spt_guest_change(vgpu->id, "destroy root pointer",
1776                                        NULL, se.type, se.val64, index);
1777         }
1778
1779         mm->ppgtt_mm.shadowed = false;
1780 }
1781
1782
1783 static int shadow_ppgtt_mm(struct intel_vgpu_mm *mm)
1784 {
1785         struct intel_vgpu *vgpu = mm->vgpu;
1786         struct intel_gvt *gvt = vgpu->gvt;
1787         struct intel_gvt_gtt *gtt = &gvt->gtt;
1788         const struct intel_gvt_gtt_pte_ops *ops = gtt->pte_ops;
1789         struct intel_vgpu_ppgtt_spt *spt;
1790         struct intel_gvt_gtt_entry ge, se;
1791         int index, ret;
1792
1793         if (mm->ppgtt_mm.shadowed)
1794                 return 0;
1795
1796         if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
1797                 return -EINVAL;
1798
1799         mm->ppgtt_mm.shadowed = true;
1800
1801         for (index = 0; index < ARRAY_SIZE(mm->ppgtt_mm.guest_pdps); index++) {
1802                 ppgtt_get_guest_root_entry(mm, &ge, index);
1803
1804                 if (!ops->test_present(&ge))
1805                         continue;
1806
1807                 trace_spt_guest_change(vgpu->id, __func__, NULL,
1808                                        ge.type, ge.val64, index);
1809
1810                 spt = ppgtt_populate_spt_by_guest_entry(vgpu, &ge);
1811                 if (IS_ERR(spt)) {
1812                         gvt_vgpu_err("fail to populate guest root pointer\n");
1813                         ret = PTR_ERR(spt);
1814                         goto fail;
1815                 }
1816                 ppgtt_generate_shadow_entry(&se, spt, &ge);
1817                 ppgtt_set_shadow_root_entry(mm, &se, index);
1818
1819                 trace_spt_guest_change(vgpu->id, "populate root pointer",
1820                                        NULL, se.type, se.val64, index);
1821         }
1822
1823         return 0;
1824 fail:
1825         invalidate_ppgtt_mm(mm);
1826         return ret;
1827 }
1828
1829 static struct intel_vgpu_mm *vgpu_alloc_mm(struct intel_vgpu *vgpu)
1830 {
1831         struct intel_vgpu_mm *mm;
1832
1833         mm = kzalloc(sizeof(*mm), GFP_KERNEL);
1834         if (!mm)
1835                 return NULL;
1836
1837         mm->vgpu = vgpu;
1838         kref_init(&mm->ref);
1839         atomic_set(&mm->pincount, 0);
1840
1841         return mm;
1842 }
1843
1844 static void vgpu_free_mm(struct intel_vgpu_mm *mm)
1845 {
1846         kfree(mm);
1847 }
1848
1849 /**
1850  * intel_vgpu_create_ppgtt_mm - create a ppgtt mm object for a vGPU
1851  * @vgpu: a vGPU
1852  * @root_entry_type: ppgtt root entry type
1853  * @pdps: guest pdps.
1854  *
1855  * This function is used to create a ppgtt mm object for a vGPU.
1856  *
1857  * Returns:
1858  * Zero on success, negative error code in pointer if failed.
1859  */
1860 struct intel_vgpu_mm *intel_vgpu_create_ppgtt_mm(struct intel_vgpu *vgpu,
1861                 enum intel_gvt_gtt_type root_entry_type, u64 pdps[])
1862 {
1863         struct intel_gvt *gvt = vgpu->gvt;
1864         struct intel_vgpu_mm *mm;
1865         int ret;
1866
1867         mm = vgpu_alloc_mm(vgpu);
1868         if (!mm)
1869                 return ERR_PTR(-ENOMEM);
1870
1871         mm->type = INTEL_GVT_MM_PPGTT;
1872
1873         GEM_BUG_ON(root_entry_type != GTT_TYPE_PPGTT_ROOT_L3_ENTRY &&
1874                    root_entry_type != GTT_TYPE_PPGTT_ROOT_L4_ENTRY);
1875         mm->ppgtt_mm.root_entry_type = root_entry_type;
1876
1877         INIT_LIST_HEAD(&mm->ppgtt_mm.list);
1878         INIT_LIST_HEAD(&mm->ppgtt_mm.lru_list);
1879         INIT_LIST_HEAD(&mm->ppgtt_mm.link);
1880
1881         if (root_entry_type == GTT_TYPE_PPGTT_ROOT_L4_ENTRY)
1882                 mm->ppgtt_mm.guest_pdps[0] = pdps[0];
1883         else
1884                 memcpy(mm->ppgtt_mm.guest_pdps, pdps,
1885                        sizeof(mm->ppgtt_mm.guest_pdps));
1886
1887         ret = shadow_ppgtt_mm(mm);
1888         if (ret) {
1889                 gvt_vgpu_err("failed to shadow ppgtt mm\n");
1890                 vgpu_free_mm(mm);
1891                 return ERR_PTR(ret);
1892         }
1893
1894         list_add_tail(&mm->ppgtt_mm.list, &vgpu->gtt.ppgtt_mm_list_head);
1895
1896         mutex_lock(&gvt->gtt.ppgtt_mm_lock);
1897         list_add_tail(&mm->ppgtt_mm.lru_list, &gvt->gtt.ppgtt_mm_lru_list_head);
1898         mutex_unlock(&gvt->gtt.ppgtt_mm_lock);
1899
1900         return mm;
1901 }
1902
1903 static struct intel_vgpu_mm *intel_vgpu_create_ggtt_mm(struct intel_vgpu *vgpu)
1904 {
1905         struct intel_vgpu_mm *mm;
1906         unsigned long nr_entries;
1907
1908         mm = vgpu_alloc_mm(vgpu);
1909         if (!mm)
1910                 return ERR_PTR(-ENOMEM);
1911
1912         mm->type = INTEL_GVT_MM_GGTT;
1913
1914         nr_entries = gvt_ggtt_gm_sz(vgpu->gvt) >> I915_GTT_PAGE_SHIFT;
1915         mm->ggtt_mm.virtual_ggtt =
1916                 vzalloc(array_size(nr_entries,
1917                                    vgpu->gvt->device_info.gtt_entry_size));
1918         if (!mm->ggtt_mm.virtual_ggtt) {
1919                 vgpu_free_mm(mm);
1920                 return ERR_PTR(-ENOMEM);
1921         }
1922
1923         mm->ggtt_mm.host_ggtt_aperture = vzalloc((vgpu_aperture_sz(vgpu) >> PAGE_SHIFT) * sizeof(u64));
1924         if (!mm->ggtt_mm.host_ggtt_aperture) {
1925                 vfree(mm->ggtt_mm.virtual_ggtt);
1926                 vgpu_free_mm(mm);
1927                 return ERR_PTR(-ENOMEM);
1928         }
1929
1930         mm->ggtt_mm.host_ggtt_hidden = vzalloc((vgpu_hidden_sz(vgpu) >> PAGE_SHIFT) * sizeof(u64));
1931         if (!mm->ggtt_mm.host_ggtt_hidden) {
1932                 vfree(mm->ggtt_mm.host_ggtt_aperture);
1933                 vfree(mm->ggtt_mm.virtual_ggtt);
1934                 vgpu_free_mm(mm);
1935                 return ERR_PTR(-ENOMEM);
1936         }
1937
1938         return mm;
1939 }
1940
1941 /**
1942  * _intel_vgpu_mm_release - destroy a mm object
1943  * @mm_ref: a kref object
1944  *
1945  * This function is used to destroy a mm object for vGPU
1946  *
1947  */
1948 void _intel_vgpu_mm_release(struct kref *mm_ref)
1949 {
1950         struct intel_vgpu_mm *mm = container_of(mm_ref, typeof(*mm), ref);
1951
1952         if (GEM_WARN_ON(atomic_read(&mm->pincount)))
1953                 gvt_err("vgpu mm pin count bug detected\n");
1954
1955         if (mm->type == INTEL_GVT_MM_PPGTT) {
1956                 list_del(&mm->ppgtt_mm.list);
1957
1958                 mutex_lock(&mm->vgpu->gvt->gtt.ppgtt_mm_lock);
1959                 list_del(&mm->ppgtt_mm.lru_list);
1960                 mutex_unlock(&mm->vgpu->gvt->gtt.ppgtt_mm_lock);
1961
1962                 invalidate_ppgtt_mm(mm);
1963         } else {
1964                 vfree(mm->ggtt_mm.virtual_ggtt);
1965                 vfree(mm->ggtt_mm.host_ggtt_aperture);
1966                 vfree(mm->ggtt_mm.host_ggtt_hidden);
1967         }
1968
1969         vgpu_free_mm(mm);
1970 }
1971
1972 /**
1973  * intel_vgpu_unpin_mm - decrease the pin count of a vGPU mm object
1974  * @mm: a vGPU mm object
1975  *
1976  * This function is called when user doesn't want to use a vGPU mm object
1977  */
1978 void intel_vgpu_unpin_mm(struct intel_vgpu_mm *mm)
1979 {
1980         atomic_dec_if_positive(&mm->pincount);
1981 }
1982
1983 /**
1984  * intel_vgpu_pin_mm - increase the pin count of a vGPU mm object
1985  * @mm: target vgpu mm
1986  *
1987  * This function is called when user wants to use a vGPU mm object. If this
1988  * mm object hasn't been shadowed yet, the shadow will be populated at this
1989  * time.
1990  *
1991  * Returns:
1992  * Zero on success, negative error code if failed.
1993  */
1994 int intel_vgpu_pin_mm(struct intel_vgpu_mm *mm)
1995 {
1996         int ret;
1997
1998         atomic_inc(&mm->pincount);
1999
2000         if (mm->type == INTEL_GVT_MM_PPGTT) {
2001                 ret = shadow_ppgtt_mm(mm);
2002                 if (ret)
2003                         return ret;
2004
2005                 mutex_lock(&mm->vgpu->gvt->gtt.ppgtt_mm_lock);
2006                 list_move_tail(&mm->ppgtt_mm.lru_list,
2007                                &mm->vgpu->gvt->gtt.ppgtt_mm_lru_list_head);
2008                 mutex_unlock(&mm->vgpu->gvt->gtt.ppgtt_mm_lock);
2009         }
2010
2011         return 0;
2012 }
2013
2014 static int reclaim_one_ppgtt_mm(struct intel_gvt *gvt)
2015 {
2016         struct intel_vgpu_mm *mm;
2017         struct list_head *pos, *n;
2018
2019         mutex_lock(&gvt->gtt.ppgtt_mm_lock);
2020
2021         list_for_each_safe(pos, n, &gvt->gtt.ppgtt_mm_lru_list_head) {
2022                 mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.lru_list);
2023
2024                 if (atomic_read(&mm->pincount))
2025                         continue;
2026
2027                 list_del_init(&mm->ppgtt_mm.lru_list);
2028                 mutex_unlock(&gvt->gtt.ppgtt_mm_lock);
2029                 invalidate_ppgtt_mm(mm);
2030                 return 1;
2031         }
2032         mutex_unlock(&gvt->gtt.ppgtt_mm_lock);
2033         return 0;
2034 }
2035
2036 /*
2037  * GMA translation APIs.
2038  */
2039 static inline int ppgtt_get_next_level_entry(struct intel_vgpu_mm *mm,
2040                 struct intel_gvt_gtt_entry *e, unsigned long index, bool guest)
2041 {
2042         struct intel_vgpu *vgpu = mm->vgpu;
2043         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
2044         struct intel_vgpu_ppgtt_spt *s;
2045
2046         s = intel_vgpu_find_spt_by_mfn(vgpu, ops->get_pfn(e));
2047         if (!s)
2048                 return -ENXIO;
2049
2050         if (!guest)
2051                 ppgtt_get_shadow_entry(s, e, index);
2052         else
2053                 ppgtt_get_guest_entry(s, e, index);
2054         return 0;
2055 }
2056
2057 /**
2058  * intel_vgpu_gma_to_gpa - translate a gma to GPA
2059  * @mm: mm object. could be a PPGTT or GGTT mm object
2060  * @gma: graphics memory address in this mm object
2061  *
2062  * This function is used to translate a graphics memory address in specific
2063  * graphics memory space to guest physical address.
2064  *
2065  * Returns:
2066  * Guest physical address on success, INTEL_GVT_INVALID_ADDR if failed.
2067  */
2068 unsigned long intel_vgpu_gma_to_gpa(struct intel_vgpu_mm *mm, unsigned long gma)
2069 {
2070         struct intel_vgpu *vgpu = mm->vgpu;
2071         struct intel_gvt *gvt = vgpu->gvt;
2072         const struct intel_gvt_gtt_pte_ops *pte_ops = gvt->gtt.pte_ops;
2073         const struct intel_gvt_gtt_gma_ops *gma_ops = gvt->gtt.gma_ops;
2074         unsigned long gpa = INTEL_GVT_INVALID_ADDR;
2075         unsigned long gma_index[4];
2076         struct intel_gvt_gtt_entry e;
2077         int i, levels = 0;
2078         int ret;
2079
2080         GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT &&
2081                    mm->type != INTEL_GVT_MM_PPGTT);
2082
2083         if (mm->type == INTEL_GVT_MM_GGTT) {
2084                 if (!vgpu_gmadr_is_valid(vgpu, gma))
2085                         goto err;
2086
2087                 ggtt_get_guest_entry(mm, &e,
2088                         gma_ops->gma_to_ggtt_pte_index(gma));
2089
2090                 gpa = (pte_ops->get_pfn(&e) << I915_GTT_PAGE_SHIFT)
2091                         + (gma & ~I915_GTT_PAGE_MASK);
2092
2093                 trace_gma_translate(vgpu->id, "ggtt", 0, 0, gma, gpa);
2094         } else {
2095                 switch (mm->ppgtt_mm.root_entry_type) {
2096                 case GTT_TYPE_PPGTT_ROOT_L4_ENTRY:
2097                         ppgtt_get_shadow_root_entry(mm, &e, 0);
2098
2099                         gma_index[0] = gma_ops->gma_to_pml4_index(gma);
2100                         gma_index[1] = gma_ops->gma_to_l4_pdp_index(gma);
2101                         gma_index[2] = gma_ops->gma_to_pde_index(gma);
2102                         gma_index[3] = gma_ops->gma_to_pte_index(gma);
2103                         levels = 4;
2104                         break;
2105                 case GTT_TYPE_PPGTT_ROOT_L3_ENTRY:
2106                         ppgtt_get_shadow_root_entry(mm, &e,
2107                                         gma_ops->gma_to_l3_pdp_index(gma));
2108
2109                         gma_index[0] = gma_ops->gma_to_pde_index(gma);
2110                         gma_index[1] = gma_ops->gma_to_pte_index(gma);
2111                         levels = 2;
2112                         break;
2113                 default:
2114                         GEM_BUG_ON(1);
2115                 }
2116
2117                 /* walk the shadow page table and get gpa from guest entry */
2118                 for (i = 0; i < levels; i++) {
2119                         ret = ppgtt_get_next_level_entry(mm, &e, gma_index[i],
2120                                 (i == levels - 1));
2121                         if (ret)
2122                                 goto err;
2123
2124                         if (!pte_ops->test_present(&e)) {
2125                                 gvt_dbg_core("GMA 0x%lx is not present\n", gma);
2126                                 goto err;
2127                         }
2128                 }
2129
2130                 gpa = (pte_ops->get_pfn(&e) << I915_GTT_PAGE_SHIFT) +
2131                                         (gma & ~I915_GTT_PAGE_MASK);
2132                 trace_gma_translate(vgpu->id, "ppgtt", 0,
2133                                     mm->ppgtt_mm.root_entry_type, gma, gpa);
2134         }
2135
2136         return gpa;
2137 err:
2138         gvt_vgpu_err("invalid mm type: %d gma %lx\n", mm->type, gma);
2139         return INTEL_GVT_INVALID_ADDR;
2140 }
2141
2142 static int emulate_ggtt_mmio_read(struct intel_vgpu *vgpu,
2143         unsigned int off, void *p_data, unsigned int bytes)
2144 {
2145         struct intel_vgpu_mm *ggtt_mm = vgpu->gtt.ggtt_mm;
2146         const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
2147         unsigned long index = off >> info->gtt_entry_size_shift;
2148         unsigned long gma;
2149         struct intel_gvt_gtt_entry e;
2150
2151         if (bytes != 4 && bytes != 8)
2152                 return -EINVAL;
2153
2154         gma = index << I915_GTT_PAGE_SHIFT;
2155         if (!intel_gvt_ggtt_validate_range(vgpu,
2156                                            gma, 1 << I915_GTT_PAGE_SHIFT)) {
2157                 gvt_dbg_mm("read invalid ggtt at 0x%lx\n", gma);
2158                 memset(p_data, 0, bytes);
2159                 return 0;
2160         }
2161
2162         ggtt_get_guest_entry(ggtt_mm, &e, index);
2163         memcpy(p_data, (void *)&e.val64 + (off & (info->gtt_entry_size - 1)),
2164                         bytes);
2165         return 0;
2166 }
2167
2168 /**
2169  * intel_vgpu_emulate_ggtt_mmio_read - emulate GTT MMIO register read
2170  * @vgpu: a vGPU
2171  * @off: register offset
2172  * @p_data: data will be returned to guest
2173  * @bytes: data length
2174  *
2175  * This function is used to emulate the GTT MMIO register read
2176  *
2177  * Returns:
2178  * Zero on success, error code if failed.
2179  */
2180 int intel_vgpu_emulate_ggtt_mmio_read(struct intel_vgpu *vgpu, unsigned int off,
2181         void *p_data, unsigned int bytes)
2182 {
2183         const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
2184         int ret;
2185
2186         if (bytes != 4 && bytes != 8)
2187                 return -EINVAL;
2188
2189         off -= info->gtt_start_offset;
2190         ret = emulate_ggtt_mmio_read(vgpu, off, p_data, bytes);
2191         return ret;
2192 }
2193
2194 static void ggtt_invalidate_pte(struct intel_vgpu *vgpu,
2195                 struct intel_gvt_gtt_entry *entry)
2196 {
2197         const struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
2198         unsigned long pfn;
2199
2200         pfn = pte_ops->get_pfn(entry);
2201         if (pfn != vgpu->gvt->gtt.scratch_mfn)
2202                 intel_gvt_dma_unmap_guest_page(vgpu, pfn << PAGE_SHIFT);
2203 }
2204
2205 static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
2206         void *p_data, unsigned int bytes)
2207 {
2208         struct intel_gvt *gvt = vgpu->gvt;
2209         const struct intel_gvt_device_info *info = &gvt->device_info;
2210         struct intel_vgpu_mm *ggtt_mm = vgpu->gtt.ggtt_mm;
2211         const struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
2212         unsigned long g_gtt_index = off >> info->gtt_entry_size_shift;
2213         unsigned long gma, gfn;
2214         struct intel_gvt_gtt_entry e = {.val64 = 0, .type = GTT_TYPE_GGTT_PTE};
2215         struct intel_gvt_gtt_entry m = {.val64 = 0, .type = GTT_TYPE_GGTT_PTE};
2216         dma_addr_t dma_addr;
2217         int ret;
2218         struct intel_gvt_partial_pte *partial_pte, *pos, *n;
2219         bool partial_update = false;
2220
2221         if (bytes != 4 && bytes != 8)
2222                 return -EINVAL;
2223
2224         gma = g_gtt_index << I915_GTT_PAGE_SHIFT;
2225
2226         /* the VM may configure the whole GM space when ballooning is used */
2227         if (!vgpu_gmadr_is_valid(vgpu, gma))
2228                 return 0;
2229
2230         e.type = GTT_TYPE_GGTT_PTE;
2231         memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data,
2232                         bytes);
2233
2234         /* If ggtt entry size is 8 bytes, and it's split into two 4 bytes
2235          * write, save the first 4 bytes in a list and update virtual
2236          * PTE. Only update shadow PTE when the second 4 bytes comes.
2237          */
2238         if (bytes < info->gtt_entry_size) {
2239                 bool found = false;
2240
2241                 list_for_each_entry_safe(pos, n,
2242                                 &ggtt_mm->ggtt_mm.partial_pte_list, list) {
2243                         if (g_gtt_index == pos->offset >>
2244                                         info->gtt_entry_size_shift) {
2245                                 if (off != pos->offset) {
2246                                         /* the second partial part*/
2247                                         int last_off = pos->offset &
2248                                                 (info->gtt_entry_size - 1);
2249
2250                                         memcpy((void *)&e.val64 + last_off,
2251                                                 (void *)&pos->data + last_off,
2252                                                 bytes);
2253
2254                                         list_del(&pos->list);
2255                                         kfree(pos);
2256                                         found = true;
2257                                         break;
2258                                 }
2259
2260                                 /* update of the first partial part */
2261                                 pos->data = e.val64;
2262                                 ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
2263                                 return 0;
2264                         }
2265                 }
2266
2267                 if (!found) {
2268                         /* the first partial part */
2269                         partial_pte = kzalloc(sizeof(*partial_pte), GFP_KERNEL);
2270                         if (!partial_pte)
2271                                 return -ENOMEM;
2272                         partial_pte->offset = off;
2273                         partial_pte->data = e.val64;
2274                         list_add_tail(&partial_pte->list,
2275                                 &ggtt_mm->ggtt_mm.partial_pte_list);
2276                         partial_update = true;
2277                 }
2278         }
2279
2280         if (!partial_update && (ops->test_present(&e))) {
2281                 gfn = ops->get_pfn(&e);
2282                 m.val64 = e.val64;
2283                 m.type = e.type;
2284
2285                 ret = intel_gvt_dma_map_guest_page(vgpu, gfn, PAGE_SIZE,
2286                                                    &dma_addr);
2287                 if (ret) {
2288                         gvt_vgpu_err("fail to populate guest ggtt entry\n");
2289                         /* guest driver may read/write the entry when partial
2290                          * update the entry in this situation p2m will fail
2291                          * setting the shadow entry to point to a scratch page
2292                          */
2293                         ops->set_pfn(&m, gvt->gtt.scratch_mfn);
2294                 } else
2295                         ops->set_pfn(&m, dma_addr >> PAGE_SHIFT);
2296         } else {
2297                 ops->set_pfn(&m, gvt->gtt.scratch_mfn);
2298                 ops->clear_present(&m);
2299         }
2300
2301         ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
2302
2303         ggtt_get_host_entry(ggtt_mm, &e, g_gtt_index);
2304         ggtt_invalidate_pte(vgpu, &e);
2305
2306         ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);
2307         ggtt_invalidate(gvt->gt);
2308         return 0;
2309 }
2310
2311 /*
2312  * intel_vgpu_emulate_ggtt_mmio_write - emulate GTT MMIO register write
2313  * @vgpu: a vGPU
2314  * @off: register offset
2315  * @p_data: data from guest write
2316  * @bytes: data length
2317  *
2318  * This function is used to emulate the GTT MMIO register write
2319  *
2320  * Returns:
2321  * Zero on success, error code if failed.
2322  */
2323 int intel_vgpu_emulate_ggtt_mmio_write(struct intel_vgpu *vgpu,
2324                 unsigned int off, void *p_data, unsigned int bytes)
2325 {
2326         const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
2327         int ret;
2328         struct intel_vgpu_submission *s = &vgpu->submission;
2329         struct intel_engine_cs *engine;
2330         int i;
2331
2332         if (bytes != 4 && bytes != 8)
2333                 return -EINVAL;
2334
2335         off -= info->gtt_start_offset;
2336         ret = emulate_ggtt_mmio_write(vgpu, off, p_data, bytes);
2337
2338         /* if ggtt of last submitted context is written,
2339          * that context is probably got unpinned.
2340          * Set last shadowed ctx to invalid.
2341          */
2342         for_each_engine(engine, vgpu->gvt->gt, i) {
2343                 if (!s->last_ctx[i].valid)
2344                         continue;
2345
2346                 if (s->last_ctx[i].lrca == (off >> info->gtt_entry_size_shift))
2347                         s->last_ctx[i].valid = false;
2348         }
2349         return ret;
2350 }
2351
2352 static int alloc_scratch_pages(struct intel_vgpu *vgpu,
2353                 enum intel_gvt_gtt_type type)
2354 {
2355         struct drm_i915_private *i915 = vgpu->gvt->gt->i915;
2356         struct intel_vgpu_gtt *gtt = &vgpu->gtt;
2357         const struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
2358         int page_entry_num = I915_GTT_PAGE_SIZE >>
2359                                 vgpu->gvt->device_info.gtt_entry_size_shift;
2360         void *scratch_pt;
2361         int i;
2362         struct device *dev = vgpu->gvt->gt->i915->drm.dev;
2363         dma_addr_t daddr;
2364
2365         if (drm_WARN_ON(&i915->drm,
2366                         type < GTT_TYPE_PPGTT_PTE_PT || type >= GTT_TYPE_MAX))
2367                 return -EINVAL;
2368
2369         scratch_pt = (void *)get_zeroed_page(GFP_KERNEL);
2370         if (!scratch_pt) {
2371                 gvt_vgpu_err("fail to allocate scratch page\n");
2372                 return -ENOMEM;
2373         }
2374
2375         daddr = dma_map_page(dev, virt_to_page(scratch_pt), 0, 4096, DMA_BIDIRECTIONAL);
2376         if (dma_mapping_error(dev, daddr)) {
2377                 gvt_vgpu_err("fail to dmamap scratch_pt\n");
2378                 __free_page(virt_to_page(scratch_pt));
2379                 return -ENOMEM;
2380         }
2381         gtt->scratch_pt[type].page_mfn =
2382                 (unsigned long)(daddr >> I915_GTT_PAGE_SHIFT);
2383         gtt->scratch_pt[type].page = virt_to_page(scratch_pt);
2384         gvt_dbg_mm("vgpu%d create scratch_pt: type %d mfn=0x%lx\n",
2385                         vgpu->id, type, gtt->scratch_pt[type].page_mfn);
2386
2387         /* Build the tree by full filled the scratch pt with the entries which
2388          * point to the next level scratch pt or scratch page. The
2389          * scratch_pt[type] indicate the scratch pt/scratch page used by the
2390          * 'type' pt.
2391          * e.g. scratch_pt[GTT_TYPE_PPGTT_PDE_PT] is used by
2392          * GTT_TYPE_PPGTT_PDE_PT level pt, that means this scratch_pt it self
2393          * is GTT_TYPE_PPGTT_PTE_PT, and full filled by scratch page mfn.
2394          */
2395         if (type > GTT_TYPE_PPGTT_PTE_PT) {
2396                 struct intel_gvt_gtt_entry se;
2397
2398                 memset(&se, 0, sizeof(struct intel_gvt_gtt_entry));
2399                 se.type = get_entry_type(type - 1);
2400                 ops->set_pfn(&se, gtt->scratch_pt[type - 1].page_mfn);
2401
2402                 /* The entry parameters like present/writeable/cache type
2403                  * set to the same as i915's scratch page tree.
2404                  */
2405                 se.val64 |= GEN8_PAGE_PRESENT | GEN8_PAGE_RW;
2406                 if (type == GTT_TYPE_PPGTT_PDE_PT)
2407                         se.val64 |= PPAT_CACHED;
2408
2409                 for (i = 0; i < page_entry_num; i++)
2410                         ops->set_entry(scratch_pt, &se, i, false, 0, vgpu);
2411         }
2412
2413         return 0;
2414 }
2415
2416 static int release_scratch_page_tree(struct intel_vgpu *vgpu)
2417 {
2418         int i;
2419         struct device *dev = vgpu->gvt->gt->i915->drm.dev;
2420         dma_addr_t daddr;
2421
2422         for (i = GTT_TYPE_PPGTT_PTE_PT; i < GTT_TYPE_MAX; i++) {
2423                 if (vgpu->gtt.scratch_pt[i].page != NULL) {
2424                         daddr = (dma_addr_t)(vgpu->gtt.scratch_pt[i].page_mfn <<
2425                                         I915_GTT_PAGE_SHIFT);
2426                         dma_unmap_page(dev, daddr, 4096, DMA_BIDIRECTIONAL);
2427                         __free_page(vgpu->gtt.scratch_pt[i].page);
2428                         vgpu->gtt.scratch_pt[i].page = NULL;
2429                         vgpu->gtt.scratch_pt[i].page_mfn = 0;
2430                 }
2431         }
2432
2433         return 0;
2434 }
2435
2436 static int create_scratch_page_tree(struct intel_vgpu *vgpu)
2437 {
2438         int i, ret;
2439
2440         for (i = GTT_TYPE_PPGTT_PTE_PT; i < GTT_TYPE_MAX; i++) {
2441                 ret = alloc_scratch_pages(vgpu, i);
2442                 if (ret)
2443                         goto err;
2444         }
2445
2446         return 0;
2447
2448 err:
2449         release_scratch_page_tree(vgpu);
2450         return ret;
2451 }
2452
2453 /**
2454  * intel_vgpu_init_gtt - initialize per-vGPU graphics memory virulization
2455  * @vgpu: a vGPU
2456  *
2457  * This function is used to initialize per-vGPU graphics memory virtualization
2458  * components.
2459  *
2460  * Returns:
2461  * Zero on success, error code if failed.
2462  */
2463 int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
2464 {
2465         struct intel_vgpu_gtt *gtt = &vgpu->gtt;
2466
2467         INIT_RADIX_TREE(&gtt->spt_tree, GFP_KERNEL);
2468
2469         INIT_LIST_HEAD(&gtt->ppgtt_mm_list_head);
2470         INIT_LIST_HEAD(&gtt->oos_page_list_head);
2471         INIT_LIST_HEAD(&gtt->post_shadow_list_head);
2472
2473         gtt->ggtt_mm = intel_vgpu_create_ggtt_mm(vgpu);
2474         if (IS_ERR(gtt->ggtt_mm)) {
2475                 gvt_vgpu_err("fail to create mm for ggtt.\n");
2476                 return PTR_ERR(gtt->ggtt_mm);
2477         }
2478
2479         intel_vgpu_reset_ggtt(vgpu, false);
2480
2481         INIT_LIST_HEAD(&gtt->ggtt_mm->ggtt_mm.partial_pte_list);
2482
2483         return create_scratch_page_tree(vgpu);
2484 }
2485
2486 void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu)
2487 {
2488         struct list_head *pos, *n;
2489         struct intel_vgpu_mm *mm;
2490
2491         list_for_each_safe(pos, n, &vgpu->gtt.ppgtt_mm_list_head) {
2492                 mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.list);
2493                 intel_vgpu_destroy_mm(mm);
2494         }
2495
2496         if (GEM_WARN_ON(!list_empty(&vgpu->gtt.ppgtt_mm_list_head)))
2497                 gvt_err("vgpu ppgtt mm is not fully destroyed\n");
2498
2499         if (GEM_WARN_ON(!radix_tree_empty(&vgpu->gtt.spt_tree))) {
2500                 gvt_err("Why we still has spt not freed?\n");
2501                 ppgtt_free_all_spt(vgpu);
2502         }
2503 }
2504
2505 static void intel_vgpu_destroy_ggtt_mm(struct intel_vgpu *vgpu)
2506 {
2507         struct intel_gvt_partial_pte *pos, *next;
2508
2509         list_for_each_entry_safe(pos, next,
2510                                  &vgpu->gtt.ggtt_mm->ggtt_mm.partial_pte_list,
2511                                  list) {
2512                 gvt_dbg_mm("partial PTE update on hold 0x%lx : 0x%llx\n",
2513                         pos->offset, pos->data);
2514                 kfree(pos);
2515         }
2516         intel_vgpu_destroy_mm(vgpu->gtt.ggtt_mm);
2517         vgpu->gtt.ggtt_mm = NULL;
2518 }
2519
2520 /**
2521  * intel_vgpu_clean_gtt - clean up per-vGPU graphics memory virulization
2522  * @vgpu: a vGPU
2523  *
2524  * This function is used to clean up per-vGPU graphics memory virtualization
2525  * components.
2526  *
2527  * Returns:
2528  * Zero on success, error code if failed.
2529  */
2530 void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu)
2531 {
2532         intel_vgpu_destroy_all_ppgtt_mm(vgpu);
2533         intel_vgpu_destroy_ggtt_mm(vgpu);
2534         release_scratch_page_tree(vgpu);
2535 }
2536
2537 static void clean_spt_oos(struct intel_gvt *gvt)
2538 {
2539         struct intel_gvt_gtt *gtt = &gvt->gtt;
2540         struct list_head *pos, *n;
2541         struct intel_vgpu_oos_page *oos_page;
2542
2543         WARN(!list_empty(&gtt->oos_page_use_list_head),
2544                 "someone is still using oos page\n");
2545
2546         list_for_each_safe(pos, n, &gtt->oos_page_free_list_head) {
2547                 oos_page = container_of(pos, struct intel_vgpu_oos_page, list);
2548                 list_del(&oos_page->list);
2549                 free_page((unsigned long)oos_page->mem);
2550                 kfree(oos_page);
2551         }
2552 }
2553
2554 static int setup_spt_oos(struct intel_gvt *gvt)
2555 {
2556         struct intel_gvt_gtt *gtt = &gvt->gtt;
2557         struct intel_vgpu_oos_page *oos_page;
2558         int i;
2559         int ret;
2560
2561         INIT_LIST_HEAD(&gtt->oos_page_free_list_head);
2562         INIT_LIST_HEAD(&gtt->oos_page_use_list_head);
2563
2564         for (i = 0; i < preallocated_oos_pages; i++) {
2565                 oos_page = kzalloc(sizeof(*oos_page), GFP_KERNEL);
2566                 if (!oos_page) {
2567                         ret = -ENOMEM;
2568                         goto fail;
2569                 }
2570                 oos_page->mem = (void *)__get_free_pages(GFP_KERNEL, 0);
2571                 if (!oos_page->mem) {
2572                         ret = -ENOMEM;
2573                         kfree(oos_page);
2574                         goto fail;
2575                 }
2576
2577                 INIT_LIST_HEAD(&oos_page->list);
2578                 INIT_LIST_HEAD(&oos_page->vm_list);
2579                 oos_page->id = i;
2580                 list_add_tail(&oos_page->list, &gtt->oos_page_free_list_head);
2581         }
2582
2583         gvt_dbg_mm("%d oos pages preallocated\n", i);
2584
2585         return 0;
2586 fail:
2587         clean_spt_oos(gvt);
2588         return ret;
2589 }
2590
2591 /**
2592  * intel_vgpu_find_ppgtt_mm - find a PPGTT mm object
2593  * @vgpu: a vGPU
2594  * @pdps: pdp root array
2595  *
2596  * This function is used to find a PPGTT mm object from mm object pool
2597  *
2598  * Returns:
2599  * pointer to mm object on success, NULL if failed.
2600  */
2601 struct intel_vgpu_mm *intel_vgpu_find_ppgtt_mm(struct intel_vgpu *vgpu,
2602                 u64 pdps[])
2603 {
2604         struct intel_vgpu_mm *mm;
2605         struct list_head *pos;
2606
2607         list_for_each(pos, &vgpu->gtt.ppgtt_mm_list_head) {
2608                 mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.list);
2609
2610                 switch (mm->ppgtt_mm.root_entry_type) {
2611                 case GTT_TYPE_PPGTT_ROOT_L4_ENTRY:
2612                         if (pdps[0] == mm->ppgtt_mm.guest_pdps[0])
2613                                 return mm;
2614                         break;
2615                 case GTT_TYPE_PPGTT_ROOT_L3_ENTRY:
2616                         if (!memcmp(pdps, mm->ppgtt_mm.guest_pdps,
2617                                     sizeof(mm->ppgtt_mm.guest_pdps)))
2618                                 return mm;
2619                         break;
2620                 default:
2621                         GEM_BUG_ON(1);
2622                 }
2623         }
2624         return NULL;
2625 }
2626
2627 /**
2628  * intel_vgpu_get_ppgtt_mm - get or create a PPGTT mm object.
2629  * @vgpu: a vGPU
2630  * @root_entry_type: ppgtt root entry type
2631  * @pdps: guest pdps
2632  *
2633  * This function is used to find or create a PPGTT mm object from a guest.
2634  *
2635  * Returns:
2636  * Zero on success, negative error code if failed.
2637  */
2638 struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu,
2639                 enum intel_gvt_gtt_type root_entry_type, u64 pdps[])
2640 {
2641         struct intel_vgpu_mm *mm;
2642
2643         mm = intel_vgpu_find_ppgtt_mm(vgpu, pdps);
2644         if (mm) {
2645                 intel_vgpu_mm_get(mm);
2646         } else {
2647                 mm = intel_vgpu_create_ppgtt_mm(vgpu, root_entry_type, pdps);
2648                 if (IS_ERR(mm))
2649                         gvt_vgpu_err("fail to create mm\n");
2650         }
2651         return mm;
2652 }
2653
2654 /**
2655  * intel_vgpu_put_ppgtt_mm - find and put a PPGTT mm object.
2656  * @vgpu: a vGPU
2657  * @pdps: guest pdps
2658  *
2659  * This function is used to find a PPGTT mm object from a guest and destroy it.
2660  *
2661  * Returns:
2662  * Zero on success, negative error code if failed.
2663  */
2664 int intel_vgpu_put_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[])
2665 {
2666         struct intel_vgpu_mm *mm;
2667
2668         mm = intel_vgpu_find_ppgtt_mm(vgpu, pdps);
2669         if (!mm) {
2670                 gvt_vgpu_err("fail to find ppgtt instance.\n");
2671                 return -EINVAL;
2672         }
2673         intel_vgpu_mm_put(mm);
2674         return 0;
2675 }
2676
2677 /**
2678  * intel_gvt_init_gtt - initialize mm components of a GVT device
2679  * @gvt: GVT device
2680  *
2681  * This function is called at the initialization stage, to initialize
2682  * the mm components of a GVT device.
2683  *
2684  * Returns:
2685  * zero on success, negative error code if failed.
2686  */
2687 int intel_gvt_init_gtt(struct intel_gvt *gvt)
2688 {
2689         int ret;
2690         void *page;
2691         struct device *dev = gvt->gt->i915->drm.dev;
2692         dma_addr_t daddr;
2693
2694         gvt_dbg_core("init gtt\n");
2695
2696         gvt->gtt.pte_ops = &gen8_gtt_pte_ops;
2697         gvt->gtt.gma_ops = &gen8_gtt_gma_ops;
2698
2699         page = (void *)get_zeroed_page(GFP_KERNEL);
2700         if (!page) {
2701                 gvt_err("fail to allocate scratch ggtt page\n");
2702                 return -ENOMEM;
2703         }
2704
2705         daddr = dma_map_page(dev, virt_to_page(page), 0,
2706                         4096, DMA_BIDIRECTIONAL);
2707         if (dma_mapping_error(dev, daddr)) {
2708                 gvt_err("fail to dmamap scratch ggtt page\n");
2709                 __free_page(virt_to_page(page));
2710                 return -ENOMEM;
2711         }
2712
2713         gvt->gtt.scratch_page = virt_to_page(page);
2714         gvt->gtt.scratch_mfn = (unsigned long)(daddr >> I915_GTT_PAGE_SHIFT);
2715
2716         if (enable_out_of_sync) {
2717                 ret = setup_spt_oos(gvt);
2718                 if (ret) {
2719                         gvt_err("fail to initialize SPT oos\n");
2720                         dma_unmap_page(dev, daddr, 4096, DMA_BIDIRECTIONAL);
2721                         __free_page(gvt->gtt.scratch_page);
2722                         return ret;
2723                 }
2724         }
2725         INIT_LIST_HEAD(&gvt->gtt.ppgtt_mm_lru_list_head);
2726         mutex_init(&gvt->gtt.ppgtt_mm_lock);
2727         return 0;
2728 }
2729
2730 /**
2731  * intel_gvt_clean_gtt - clean up mm components of a GVT device
2732  * @gvt: GVT device
2733  *
2734  * This function is called at the driver unloading stage, to clean up
2735  * the mm components of a GVT device.
2736  *
2737  */
2738 void intel_gvt_clean_gtt(struct intel_gvt *gvt)
2739 {
2740         struct device *dev = gvt->gt->i915->drm.dev;
2741         dma_addr_t daddr = (dma_addr_t)(gvt->gtt.scratch_mfn <<
2742                                         I915_GTT_PAGE_SHIFT);
2743
2744         dma_unmap_page(dev, daddr, 4096, DMA_BIDIRECTIONAL);
2745
2746         __free_page(gvt->gtt.scratch_page);
2747
2748         if (enable_out_of_sync)
2749                 clean_spt_oos(gvt);
2750 }
2751
2752 /**
2753  * intel_vgpu_invalidate_ppgtt - invalidate PPGTT instances
2754  * @vgpu: a vGPU
2755  *
2756  * This function is called when invalidate all PPGTT instances of a vGPU.
2757  *
2758  */
2759 void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu)
2760 {
2761         struct list_head *pos, *n;
2762         struct intel_vgpu_mm *mm;
2763
2764         list_for_each_safe(pos, n, &vgpu->gtt.ppgtt_mm_list_head) {
2765                 mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.list);
2766                 if (mm->type == INTEL_GVT_MM_PPGTT) {
2767                         mutex_lock(&vgpu->gvt->gtt.ppgtt_mm_lock);
2768                         list_del_init(&mm->ppgtt_mm.lru_list);
2769                         mutex_unlock(&vgpu->gvt->gtt.ppgtt_mm_lock);
2770                         if (mm->ppgtt_mm.shadowed)
2771                                 invalidate_ppgtt_mm(mm);
2772                 }
2773         }
2774 }
2775
2776 /**
2777  * intel_vgpu_reset_ggtt - reset the GGTT entry
2778  * @vgpu: a vGPU
2779  * @invalidate_old: invalidate old entries
2780  *
2781  * This function is called at the vGPU create stage
2782  * to reset all the GGTT entries.
2783  *
2784  */
2785 void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old)
2786 {
2787         struct intel_gvt *gvt = vgpu->gvt;
2788         const struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
2789         struct intel_gvt_gtt_entry entry = {.type = GTT_TYPE_GGTT_PTE};
2790         struct intel_gvt_gtt_entry old_entry;
2791         u32 index;
2792         u32 num_entries;
2793
2794         pte_ops->set_pfn(&entry, gvt->gtt.scratch_mfn);
2795         pte_ops->set_present(&entry);
2796
2797         index = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT;
2798         num_entries = vgpu_aperture_sz(vgpu) >> PAGE_SHIFT;
2799         while (num_entries--) {
2800                 if (invalidate_old) {
2801                         ggtt_get_host_entry(vgpu->gtt.ggtt_mm, &old_entry, index);
2802                         ggtt_invalidate_pte(vgpu, &old_entry);
2803                 }
2804                 ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++);
2805         }
2806
2807         index = vgpu_hidden_gmadr_base(vgpu) >> PAGE_SHIFT;
2808         num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT;
2809         while (num_entries--) {
2810                 if (invalidate_old) {
2811                         ggtt_get_host_entry(vgpu->gtt.ggtt_mm, &old_entry, index);
2812                         ggtt_invalidate_pte(vgpu, &old_entry);
2813                 }
2814                 ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++);
2815         }
2816
2817         ggtt_invalidate(gvt->gt);
2818 }
2819
2820 /**
2821  * intel_gvt_restore_ggtt - restore all vGPU's ggtt entries
2822  * @gvt: intel gvt device
2823  *
2824  * This function is called at driver resume stage to restore
2825  * GGTT entries of every vGPU.
2826  *
2827  */
2828 void intel_gvt_restore_ggtt(struct intel_gvt *gvt)
2829 {
2830         struct intel_vgpu *vgpu;
2831         struct intel_vgpu_mm *mm;
2832         int id;
2833         gen8_pte_t pte;
2834         u32 idx, num_low, num_hi, offset;
2835
2836         /* Restore dirty host ggtt for all vGPUs */
2837         idr_for_each_entry(&(gvt)->vgpu_idr, vgpu, id) {
2838                 mm = vgpu->gtt.ggtt_mm;
2839
2840                 num_low = vgpu_aperture_sz(vgpu) >> PAGE_SHIFT;
2841                 offset = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT;
2842                 for (idx = 0; idx < num_low; idx++) {
2843                         pte = mm->ggtt_mm.host_ggtt_aperture[idx];
2844                         if (pte & GEN8_PAGE_PRESENT)
2845                                 write_pte64(vgpu->gvt->gt->ggtt, offset + idx, pte);
2846                 }
2847
2848                 num_hi = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT;
2849                 offset = vgpu_hidden_gmadr_base(vgpu) >> PAGE_SHIFT;
2850                 for (idx = 0; idx < num_hi; idx++) {
2851                         pte = mm->ggtt_mm.host_ggtt_hidden[idx];
2852                         if (pte & GEN8_PAGE_PRESENT)
2853                                 write_pte64(vgpu->gvt->gt->ggtt, offset + idx, pte);
2854                 }
2855         }
2856 }