aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChangbin Du <changbin.du@intel.com>2018-03-27 03:35:15 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2018-03-30 02:47:18 -0400
commitf4c43db356198d8091442f593871b0beb5c139b2 (patch)
treeb346ab474ad5e031edc00c8579a3bc4730591d9a
parent7598e8700e9a507496660219924ca8c5aa3088d6 (diff)
drm/i915/gvt: Cancel dma map when resetting ggtt entries
Ditto, don't forget ggtt entries during reset. Signed-off-by: Changbin Du <changbin.du@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/gvt/gtt.c22
-rw-r--r--drivers/gpu/drm/i915/gvt/gtt.h2
2 files changed, 18 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
index 8c9477c272be..78e55aafc8bc 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.c
+++ b/drivers/gpu/drm/i915/gvt/gtt.c
@@ -2056,7 +2056,7 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
2056 return PTR_ERR(gtt->ggtt_mm); 2056 return PTR_ERR(gtt->ggtt_mm);
2057 } 2057 }
2058 2058
2059 intel_vgpu_reset_ggtt(vgpu); 2059 intel_vgpu_reset_ggtt(vgpu, false);
2060 2060
2061 return create_scratch_page_tree(vgpu); 2061 return create_scratch_page_tree(vgpu);
2062} 2062}
@@ -2341,17 +2341,19 @@ void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu)
2341/** 2341/**
2342 * intel_vgpu_reset_ggtt - reset the GGTT entry 2342 * intel_vgpu_reset_ggtt - reset the GGTT entry
2343 * @vgpu: a vGPU 2343 * @vgpu: a vGPU
2344 * @invalidate_old: invalidate old entries
2344 * 2345 *
2345 * This function is called at the vGPU create stage 2346 * This function is called at the vGPU create stage
2346 * to reset all the GGTT entries. 2347 * to reset all the GGTT entries.
2347 * 2348 *
2348 */ 2349 */
2349void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu) 2350void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old)
2350{ 2351{
2351 struct intel_gvt *gvt = vgpu->gvt; 2352 struct intel_gvt *gvt = vgpu->gvt;
2352 struct drm_i915_private *dev_priv = gvt->dev_priv; 2353 struct drm_i915_private *dev_priv = gvt->dev_priv;
2353 struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops; 2354 struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
2354 struct intel_gvt_gtt_entry entry = {.type = GTT_TYPE_GGTT_PTE}; 2355 struct intel_gvt_gtt_entry entry = {.type = GTT_TYPE_GGTT_PTE};
2356 struct intel_gvt_gtt_entry old_entry;
2355 u32 index; 2357 u32 index;
2356 u32 num_entries; 2358 u32 num_entries;
2357 2359
@@ -2360,13 +2362,23 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu)
2360 2362
2361 index = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT; 2363 index = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT;
2362 num_entries = vgpu_aperture_sz(vgpu) >> PAGE_SHIFT; 2364 num_entries = vgpu_aperture_sz(vgpu) >> PAGE_SHIFT;
2363 while (num_entries--) 2365 while (num_entries--) {
2366 if (invalidate_old) {
2367 ggtt_get_host_entry(vgpu->gtt.ggtt_mm, &old_entry, index);
2368 ggtt_invalidate_pte(vgpu, &old_entry);
2369 }
2364 ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++); 2370 ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++);
2371 }
2365 2372
2366 index = vgpu_hidden_gmadr_base(vgpu) >> PAGE_SHIFT; 2373 index = vgpu_hidden_gmadr_base(vgpu) >> PAGE_SHIFT;
2367 num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT; 2374 num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT;
2368 while (num_entries--) 2375 while (num_entries--) {
2376 if (invalidate_old) {
2377 ggtt_get_host_entry(vgpu->gtt.ggtt_mm, &old_entry, index);
2378 ggtt_invalidate_pte(vgpu, &old_entry);
2379 }
2369 ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++); 2380 ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++);
2381 }
2370 2382
2371 ggtt_invalidate(dev_priv); 2383 ggtt_invalidate(dev_priv);
2372} 2384}
@@ -2386,5 +2398,5 @@ void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu)
2386 * removing the shadow pages. 2398 * removing the shadow pages.
2387 */ 2399 */
2388 intel_vgpu_destroy_all_ppgtt_mm(vgpu); 2400 intel_vgpu_destroy_all_ppgtt_mm(vgpu);
2389 intel_vgpu_reset_ggtt(vgpu); 2401 intel_vgpu_reset_ggtt(vgpu, true);
2390} 2402}
diff --git a/drivers/gpu/drm/i915/gvt/gtt.h b/drivers/gpu/drm/i915/gvt/gtt.h
index a8b369cd352b..3792f2b7f4ff 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.h
+++ b/drivers/gpu/drm/i915/gvt/gtt.h
@@ -193,7 +193,7 @@ struct intel_vgpu_gtt {
193 193
194extern int intel_vgpu_init_gtt(struct intel_vgpu *vgpu); 194extern int intel_vgpu_init_gtt(struct intel_vgpu *vgpu);
195extern void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu); 195extern void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu);
196void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu); 196void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old);
197void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu); 197void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu);
198 198
199extern int intel_gvt_init_gtt(struct intel_gvt *gvt); 199extern int intel_gvt_init_gtt(struct intel_gvt *gvt);