diff options
| author | Changbin Du <changbin.du@intel.com> | 2018-03-27 03:35:15 -0400 |
|---|---|---|
| committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2018-03-30 02:47:18 -0400 |
| commit | f4c43db356198d8091442f593871b0beb5c139b2 (patch) | |
| tree | b346ab474ad5e031edc00c8579a3bc4730591d9a | |
| parent | 7598e8700e9a507496660219924ca8c5aa3088d6 (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.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/gtt.h | 2 |
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 | */ |
| 2349 | void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu) | 2350 | void 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 | ||
| 194 | extern int intel_vgpu_init_gtt(struct intel_vgpu *vgpu); | 194 | extern int intel_vgpu_init_gtt(struct intel_vgpu *vgpu); |
| 195 | extern void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu); | 195 | extern void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu); |
| 196 | void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu); | 196 | void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old); |
| 197 | void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu); | 197 | void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu); |
| 198 | 198 | ||
| 199 | extern int intel_gvt_init_gtt(struct intel_gvt *gvt); | 199 | extern int intel_gvt_init_gtt(struct intel_gvt *gvt); |
