diff options
author | Chuanxiao Dong <chuanxiao.dong@intel.com> | 2017-06-02 03:34:24 -0400 |
---|---|---|
committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2017-06-08 01:59:18 -0400 |
commit | af2c6399aabeb7a7107657a469cb2f16b55dfbae (patch) | |
tree | 1d9df06ed59c0bd8c7963381625f37d260b4d189 | |
parent | 9b7bd65ecdf347b33c37d73b610fd85774b12e87 (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.c | 15 |
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 | ||
247 | static 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 | |||
247 | static void write_pte64(struct drm_i915_private *dev_priv, | 254 | static 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 | ||
258 | static inline struct intel_gvt_gtt_entry *gtt_get_entry64(void *pt, | 262 | static 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 | /** |