[PATCH] drm/i915/gvt: Skip writing 0 to HWSP during D3 resume

Zhenyu Wang zhenyuw at linux.intel.com
Tue Sep 8 09:15:18 UTC 2020


On 2020.08.19 09:09:53 +0800, Colin Xu wrote:
> Guest driver may reset HWSP to 0 as init value during D3->D0:
> The full sequence is:
> - Boot ->D0
> - Update HWSP
> - D0->D3
> - ...In D3 state...
> - D3->D0
> - DMLR reset.
> - Set engine HWSP to 0.
> - Set engine ring mode to 0.
> - Set engine HWSP to correct value.
> - Set engine ring mode to correct value.
> Ring mode is masked register so set 0 won't take effect.
> However HWPS addr 0 is considered as invalid GGTT address which will
> report error like:
> gvt: vgpu 1: write invalid HWSP address, reg:0x2080, value:0x0
>

So looks this is to handle that wrong error message but function is
still same, right?

> During vGPU in D3, per-engine HWSP gpa remains valid so we can skip
> update HWSP in this case.
> Check both pv_notified and previous engine HWSP gpa, if pv already
> notified and previous HWSP gpa is valid, we skip this HWSP init and
> let later HWSP write update the correct value. We also need zero out
> per-engine HWSP gpa on engine reset to make sure hws_pga is valid.
> 
> Signed-off-by: Colin Xu <colin.xu at intel.com>
> ---
>  drivers/gpu/drm/i915/gvt/handlers.c | 30 ++++++++++++++++++++---------
>  drivers/gpu/drm/i915/gvt/vgpu.c     |  7 +++++++
>  2 files changed, 28 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
> index 840572add2d4..72860aaf1656 100644
> --- a/drivers/gpu/drm/i915/gvt/handlers.c
> +++ b/drivers/gpu/drm/i915/gvt/handlers.c
> @@ -1489,12 +1489,6 @@ static int hws_pga_write(struct intel_vgpu *vgpu, unsigned int offset,
>  	const struct intel_engine_cs *engine =
>  		intel_gvt_render_mmio_to_engine(vgpu->gvt, offset);
>  
> -	if (!intel_gvt_ggtt_validate_range(vgpu, value, I915_GTT_PAGE_SIZE)) {
> -		gvt_vgpu_err("write invalid HWSP address, reg:0x%x, value:0x%x\n",
> -			      offset, value);
> -		return -EINVAL;
> -	}
> -
>  	/*
>  	 * Need to emulate all the HWSP register write to ensure host can
>  	 * update the VM CSB status correctly. Here listed registers can
> @@ -1505,9 +1499,27 @@ static int hws_pga_write(struct intel_vgpu *vgpu, unsigned int offset,
>  			     offset);
>  		return -EINVAL;
>  	}
> -	vgpu->hws_pga[engine->id] = value;
> -	gvt_dbg_mmio("VM(%d) write: 0x%x to HWSP: 0x%x\n",
> -		     vgpu->id, value, offset);
> +
> +	if (!intel_gvt_ggtt_validate_range(vgpu, value, I915_GTT_PAGE_SIZE)) {
> +		u32 old = vgpu->hws_pga[engine->id];
> +
> +		/* Skip zero out RING_HWS_PGA during D3 resume */
> +		if (vgpu->pv_notified && value == 0 &&
> +		    intel_gvt_ggtt_validate_range(vgpu, old,
> +						  I915_GTT_PAGE_SIZE)) {
> +			gvt_dbg_mmio("Skip zero out HWSP address, reg:0x%x, "
> +				     "value:0x%x\n", offset, value);
> +
> +		} else {
> +			gvt_vgpu_err("write invalid HWSP address, reg:0x%x, "
> +				     "value:0x%x\n", offset, value);
> +			return -EINVAL;
> +		}
> +	} else {
> +		vgpu->hws_pga[engine->id] = value;
> +		gvt_dbg_mmio("VM(%d) write: 0x%x to HWSP: 0x%x\n",
> +			     vgpu->id, value, offset);
> +	}
>  
>  	return intel_vgpu_default_mmio_write(vgpu, offset, &value, bytes);
>  }
> diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
> index 8fa9b31a2484..e0e073045d83 100644
> --- a/drivers/gpu/drm/i915/gvt/vgpu.c
> +++ b/drivers/gpu/drm/i915/gvt/vgpu.c
> @@ -558,6 +558,9 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr,
>  	intel_vgpu_reset_submission(vgpu, resetting_eng);
>  	/* full GPU reset or device model level reset */
>  	if (engine_mask == ALL_ENGINES || dmlr) {
> +		struct intel_engine_cs *engine;
> +		intel_engine_mask_t tmp;
> +
>  		intel_vgpu_select_submission_ops(vgpu, ALL_ENGINES, 0);
>  		if (engine_mask == ALL_ENGINES)
>  			intel_vgpu_invalidate_ppgtt(vgpu);
> @@ -588,6 +591,10 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr,
>  			else
>  				vgpu->pv_notified = false;
>  		}
> +
> +		for_each_engine_masked(engine, gvt->gt, engine_mask, tmp) {
> +			vgpu->hws_pga[engine->id] = 0;
> +		}
>  	}
>  
>  	vgpu->resetting_eng = 0;
> -- 
> 2.28.0
> 
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev

-- 

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gvt-dev/attachments/20200908/90bd040c/attachment.sig>


More information about the intel-gvt-dev mailing list