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

Colin Xu Colin.Xu at intel.com
Wed Sep 9 02:51:04 UTC 2020


On 2020-09-09 10:04, Zhenyu Wang wrote:
> On 2020.09.09 08:37:53 +0800, Colin Xu wrote:
>> On 2020-09-08 17:15, Zhenyu Wang wrote:
>>> 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?
>> Yes that's right. Current logic can guarantee that only correct HWSP write
>> from guest are accepted by GVT. Invalid HWSP address will be dropped and
>> won't be submitted to HW. During resume, correct HWSP will be updated
>> eventually updated. If pv_notified is set, the intermediate HWSP zero-out
>> can be ignored until hit next reset.
> Might just move that error into debug message instead of putting
> effort on tracking guest state without much gain..
Sometimes such invalid HWSP addr write msg may still be helpful. If put 
them into gvt_dbg_mmio without considering different case, may miss the 
information. So this change put real error into gvt_vgpu_err, but put 
expected zero out to gvt_dbg_mmio.
>
>>>> 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
>> -- 
>> Best Regards,
>> Colin Xu
>>
-- 
Best Regards,
Colin Xu



More information about the intel-gvt-dev mailing list