aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuanxiao Dong <chuanxiao.dong@intel.com>2017-06-02 03:34:24 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2017-06-08 01:59:18 -0400
commitaf2c6399aabeb7a7107657a469cb2f16b55dfbae (patch)
tree1d9df06ed59c0bd8c7963381625f37d260b4d189
parent9b7bd65ecdf347b33c37d73b610fd85774b12e87 (diff)
drm/i915/gvt: add gtt_invalidate API to flush the GTT TLB
add gtt_invalidate API to handle the GTT TLB flush instead of hiding in write_pte64 function. This can avoid overkill when using write_pte64 Suggested-by: Zhenyu Wang <zhenyuw@linux.intel.com> Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com> Cc: Zhenyu Wang <zhenyuw@linux.intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/gvt/gtt.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
index c6f0077f590d..66374dba3b1a 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.c
+++ b/drivers/gpu/drm/i915/gvt/gtt.c
@@ -244,15 +244,19 @@ static u64 read_pte64(struct drm_i915_private *dev_priv, unsigned long index)
244 return readq(addr); 244 return readq(addr);
245} 245}
246 246
247static void gtt_invalidate(struct drm_i915_private *dev_priv)
248{
249 mmio_hw_access_pre(dev_priv);
250 I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
251 mmio_hw_access_post(dev_priv);
252}
253
247static void write_pte64(struct drm_i915_private *dev_priv, 254static void write_pte64(struct drm_i915_private *dev_priv,
248 unsigned long index, u64 pte) 255 unsigned long index, u64 pte)
249{ 256{
250 void __iomem *addr = (gen8_pte_t __iomem *)dev_priv->ggtt.gsm + index; 257 void __iomem *addr = (gen8_pte_t __iomem *)dev_priv->ggtt.gsm + index;
251 258
252 writeq(pte, addr); 259 writeq(pte, addr);
253
254 I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
255 POSTING_READ(GFX_FLSH_CNTL_GEN6);
256} 260}
257 261
258static inline struct intel_gvt_gtt_entry *gtt_get_entry64(void *pt, 262static inline struct intel_gvt_gtt_entry *gtt_get_entry64(void *pt,
@@ -1849,6 +1853,7 @@ static int emulate_gtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
1849 } 1853 }
1850 1854
1851 ggtt_set_shadow_entry(ggtt_mm, &m, g_gtt_index); 1855 ggtt_set_shadow_entry(ggtt_mm, &m, g_gtt_index);
1856 gtt_invalidate(gvt->dev_priv);
1852 ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index); 1857 ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
1853 return 0; 1858 return 0;
1854} 1859}
@@ -2301,8 +2306,6 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu)
2301 u32 num_entries; 2306 u32 num_entries;
2302 struct intel_gvt_gtt_entry e; 2307 struct intel_gvt_gtt_entry e;
2303 2308
2304 intel_runtime_pm_get(dev_priv);
2305
2306 memset(&e, 0, sizeof(struct intel_gvt_gtt_entry)); 2309 memset(&e, 0, sizeof(struct intel_gvt_gtt_entry));
2307 e.type = GTT_TYPE_GGTT_PTE; 2310 e.type = GTT_TYPE_GGTT_PTE;
2308 ops->set_pfn(&e, gvt->gtt.scratch_ggtt_mfn); 2311 ops->set_pfn(&e, gvt->gtt.scratch_ggtt_mfn);
@@ -2318,7 +2321,7 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu)
2318 for (offset = 0; offset < num_entries; offset++) 2321 for (offset = 0; offset < num_entries; offset++)
2319 ops->set_entry(NULL, &e, index + offset, false, 0, vgpu); 2322 ops->set_entry(NULL, &e, index + offset, false, 0, vgpu);
2320 2323
2321 intel_runtime_pm_put(dev_priv); 2324 gtt_invalidate(dev_priv);
2322} 2325}
2323 2326
2324/** 2327/**