[Intel-gfx] [PATCH v3 3/3] drm/i915/gen9: Fix PCODE polling during SAGV disabling

Lyude Paul lyude at redhat.com
Wed Nov 30 02:48:41 UTC 2016


One tiny nitpick below

On Mon, 2016-11-28 at 13:12 +0200, Imre Deak wrote:
> According to the previous patch, it's possible atm that we call
> intel_do_sagv_disable() only once during the 1ms period and time out
> if
> that call fails. As opposed to this the spec says that we need to
> keep
> retrying this request for a 1ms duration, so let's do this similarly
> to
> the CDCLK change notification request.
> 
> Cc: Lyude <cpaul at redhat.com>
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_reg.h |  1 -
>  drivers/gpu/drm/i915/intel_pm.c | 33 +++++++----------------------
> ----
>  2 files changed, 7 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_reg.h
> b/drivers/gpu/drm/i915/i915_reg.h
> index f542cbc..c7458b7 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -7434,7 +7434,6 @@ enum {
>  #define	  HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL	0x1A
>  #define   GEN9_PCODE_SAGV_CONTROL		0x21
>  #define     GEN9_SAGV_DISABLE			0x0
> -#define     GEN9_SAGV_IS_DISABLED		0x1
>  #define     GEN9_SAGV_ENABLE			0x3
>  #define   GEN9_PCODE_REQUEST_DONE		0x1
>  #define GEN6_PCODE_DATA				_MMIO(0x13812
> 8)
> diff --git a/drivers/gpu/drm/i915/intel_pm.c
> b/drivers/gpu/drm/i915/intel_pm.c
> index edd68f3..43b0b40 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -2954,24 +2954,10 @@ intel_enable_sagv(struct drm_i915_private
> *dev_priv)
>  	return 0;
>  }
>  
> -static int
> -intel_do_sagv_disable(struct drm_i915_private *dev_priv)
> -{
> -	int ret;
> -	uint32_t temp = GEN9_SAGV_DISABLE;
> -
> -	ret = sandybridge_pcode_read(dev_priv,
> GEN9_PCODE_SAGV_CONTROL,
> -				     &temp);
> -	if (ret)
> -		return ret;
> -	else
> -		return temp & GEN9_SAGV_IS_DISABLED;
> -}
> -
>  int
>  intel_disable_sagv(struct drm_i915_private *dev_priv)
>  {
> -	int ret, result;
> +	int ret;
>  
>  	if (!intel_has_sagv(dev_priv))
>  		return 0;
> @@ -2981,27 +2967,22 @@ intel_disable_sagv(struct drm_i915_private
> *dev_priv)
>  
>  	DRM_DEBUG_KMS("Disabling the SAGV\n");
>  	mutex_lock(&dev_priv->rps.hw_lock);
> -
I'd leave the whitespace here.

Other then that:

	Reviewed-by: Lyude <lyude at redhat.com>
>  	/* bspec says to keep retrying for at least 1 ms */
> -	ret = wait_for(result = intel_do_sagv_disable(dev_priv), 1);
> +	ret = skl_pcode_request(dev_priv, GEN9_PCODE_SAGV_CONTROL,
> +				GEN9_SAGV_DISABLE);
>  	mutex_unlock(&dev_priv->rps.hw_lock);
>  
> -	if (ret == -ETIMEDOUT) {
> -		DRM_ERROR("Request to disable SAGV timed out\n");
> -		return -ETIMEDOUT;
> -	}
> -
>  	/*
>  	 * Some skl systems, pre-release machines in particular,
>  	 * don't actually have an SAGV.
>  	 */
> -	if (IS_SKYLAKE(dev_priv) && result == -ENXIO) {
> +	if (IS_SKYLAKE(dev_priv) && ret == -ENXIO) {
>  		DRM_DEBUG_DRIVER("No SAGV found on system,
> ignoring\n");
>  		dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED;
>  		return 0;
> -	} else if (result < 0) {
> -		DRM_ERROR("Failed to disable the SAGV\n");
> -		return result;
> +	} else if (ret < 0) {
> +		DRM_ERROR("Failed to disable the SAGV (%d)\n", ret);
> +		return ret;
>  	}
>  
>  	dev_priv->sagv_status = I915_SAGV_DISABLED;
-- 
Cheers,
	Lyude


More information about the Intel-gfx mailing list