[Intel-gfx] [PATCH 13/36] drm/i915: Merge sandybridge_pcode_(read|write)

Imre Deak imre.deak at intel.com
Wed Mar 14 15:20:45 UTC 2018


On Wed, Mar 14, 2018 at 09:37:25AM +0000, Chris Wilson wrote:
> These routines are identical except in the nature of the value parameter.
> For writes it is a pure in-param, but for a read, we need an out-param.
> Since they differ in a single line, merge the two routines into one.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/intel_pm.c | 114 ++++++++++++++--------------------------
>  1 file changed, 40 insertions(+), 74 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 6d5003b521f2..6259c95ce293 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -9159,12 +9159,10 @@ void intel_init_pm(struct drm_i915_private *dev_priv)
>  	}
>  }
>  
> -static inline int gen6_check_mailbox_status(struct drm_i915_private *dev_priv)
> +static inline int gen6_check_mailbox_status(struct drm_i915_private *dev_priv,
> +					    u32 mbox)
>  {
> -	uint32_t flags =
> -		I915_READ_FW(GEN6_PCODE_MAILBOX) & GEN6_PCODE_ERROR_MASK;
> -
> -	switch (flags) {
> +	switch (mbox & GEN6_PCODE_ERROR_MASK) {
>  	case GEN6_PCODE_SUCCESS:
>  		return 0;
>  	case GEN6_PCODE_UNIMPLEMENTED_CMD:
> @@ -9177,17 +9175,15 @@ static inline int gen6_check_mailbox_status(struct drm_i915_private *dev_priv)
>  	case GEN6_PCODE_TIMEOUT:
>  		return -ETIMEDOUT;
>  	default:
> -		MISSING_CASE(flags);
> +		MISSING_CASE(mbox & GEN6_PCODE_ERROR_MASK);
>  		return 0;
>  	}
>  }
>  
> -static inline int gen7_check_mailbox_status(struct drm_i915_private *dev_priv)
> +static inline int gen7_check_mailbox_status(struct drm_i915_private *dev_priv,
> +					    u32 mbox)
>  {
> -	uint32_t flags =
> -		I915_READ_FW(GEN6_PCODE_MAILBOX) & GEN6_PCODE_ERROR_MASK;
> -
> -	switch (flags) {
> +	switch (mbox & GEN6_PCODE_ERROR_MASK) {
>  	case GEN6_PCODE_SUCCESS:
>  		return 0;
>  	case GEN6_PCODE_ILLEGAL_CMD:
> @@ -9199,18 +9195,21 @@ static inline int gen7_check_mailbox_status(struct drm_i915_private *dev_priv)
>  	case GEN7_PCODE_MIN_FREQ_TABLE_GT_RATIO_OUT_OF_RANGE:
>  		return -EOVERFLOW;
>  	default:
> -		MISSING_CASE(flags);
> +		MISSING_CASE(mbox & GEN6_PCODE_ERROR_MASK);
>  		return 0;
>  	}
>  }
>  
> -static int __sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val)
> +static int __sandybridge_pcode_rw(struct drm_i915_private *dev_priv,
> +				  u32 mbox, u32 *val,
> +				  int fast_timeout_us,
> +				  int slow_timeout_ms,
> +				  bool is_read)
>  {
> -	int status;
> -
>  	lockdep_assert_held(&dev_priv->sb_lock);
>  
> -	/* GEN6_PCODE_* are outside of the forcewake domain, we can
> +	/*
> +	 * GEN6_PCODE_* are outside of the forcewake domain, we can
>  	 * use te fw I915_READ variants to reduce the amount of work
>  	 * required when reading/writing.
>  	 */
> @@ -9224,69 +9223,36 @@ static int __sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox,
>  
>  	if (__intel_wait_for_register_fw(dev_priv,
>  					 GEN6_PCODE_MAILBOX, GEN6_PCODE_READY, 0,
> -					 500, 0, NULL))
> +					 fast_timeout_us,
> +					 slow_timeout_ms,
> +					 &mbox))
>  		return -ETIMEDOUT;
>  
> -	*val = I915_READ_FW(GEN6_PCODE_DATA);
> -	I915_WRITE_FW(GEN6_PCODE_DATA, 0);
> +	if (is_read)
> +		*val = I915_READ_FW(GEN6_PCODE_DATA);

So we stop clearing GEN6_PCODE_DATA. It gets set before the next pcode
access, so yes looks redundant here. The patch looks ok:

Reviewed-by: Imre Deak <imre.deak at intel.com>

>  
>  	if (INTEL_GEN(dev_priv) > 6)
> -		status = gen7_check_mailbox_status(dev_priv);
> +		return gen7_check_mailbox_status(dev_priv, mbox);
>  	else
> -		status = gen6_check_mailbox_status(dev_priv);
> -
> -	return status;
> +		return gen6_check_mailbox_status(dev_priv, mbox);
>  }
>  
>  int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val)
>  {
> -	int status;
> +	int err;
>  
>  	mutex_lock(&dev_priv->sb_lock);
> -	status = __sandybridge_pcode_read(dev_priv, mbox, val);
> +	err = __sandybridge_pcode_rw(dev_priv, mbox, val,
> +				    500, 0,
> +				    true);
>  	mutex_unlock(&dev_priv->sb_lock);
>  
> -	if (status) {
> +	if (err) {
>  		DRM_DEBUG_DRIVER("warning: pcode (read from mbox %x) mailbox access failed for %ps: %d\n",
> -				 mbox, __builtin_return_address(0), status);
> +				 mbox, __builtin_return_address(0), err);
>  	}
>  
> -	return status;
> -}
> -
> -static int __sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv,
> -					     u32 mbox, u32 val,
> -					     int fast_timeout_us,
> -					     int slow_timeout_ms)
> -{
> -	int status;
> -
> -	/* GEN6_PCODE_* are outside of the forcewake domain, we can
> -	 * use te fw I915_READ variants to reduce the amount of work
> -	 * required when reading/writing.
> -	 */
> -
> -	if (I915_READ_FW(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY)
> -		return -EAGAIN;
> -
> -	I915_WRITE_FW(GEN6_PCODE_DATA, val);
> -	I915_WRITE_FW(GEN6_PCODE_DATA1, 0);
> -	I915_WRITE_FW(GEN6_PCODE_MAILBOX, GEN6_PCODE_READY | mbox);
> -
> -	if (__intel_wait_for_register_fw(dev_priv,
> -					 GEN6_PCODE_MAILBOX, GEN6_PCODE_READY, 0,
> -					 fast_timeout_us, slow_timeout_ms,
> -					 NULL))
> -		return -ETIMEDOUT;
> -
> -	I915_WRITE_FW(GEN6_PCODE_DATA, 0);
> -
> -	if (INTEL_GEN(dev_priv) > 6)
> -		status = gen7_check_mailbox_status(dev_priv);
> -	else
> -		status = gen6_check_mailbox_status(dev_priv);
> -
> -	return status;
> +	return err;
>  }
>  
>  int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv,
> @@ -9294,31 +9260,31 @@ int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv,
>  				    int fast_timeout_us,
>  				    int slow_timeout_ms)
>  {
> -	int status;
> +	int err;
>  
>  	mutex_lock(&dev_priv->sb_lock);
> -	status = __sandybridge_pcode_write_timeout(dev_priv, mbox, val,
> -						   fast_timeout_us,
> -						   slow_timeout_ms);
> +	err = __sandybridge_pcode_rw(dev_priv, mbox, &val,
> +				     fast_timeout_us, slow_timeout_ms,
> +				     false);
>  	mutex_unlock(&dev_priv->sb_lock);
>  
> -	if (status) {
> +	if (err) {
>  		DRM_DEBUG_DRIVER("warning: pcode (write of 0x%08x to mbox %x) mailbox access failed for %ps: %d\n",
> -				 val, mbox, __builtin_return_address(0), status);
> +				 val, mbox, __builtin_return_address(0), err);
>  	}
>  
> -	return status;
> +	return err;
>  }
>  
>  static bool skl_pcode_try_request(struct drm_i915_private *dev_priv, u32 mbox,
>  				  u32 request, u32 reply_mask, u32 reply,
>  				  u32 *status)
>  {
> -	u32 val = request;
> -
> -	*status = __sandybridge_pcode_read(dev_priv, mbox, &val);
> +	*status = __sandybridge_pcode_rw(dev_priv, mbox, &request,
> +					 500, 0,
> +					 true);
>  
> -	return *status || ((val & reply_mask) == reply);
> +	return *status || ((request & reply_mask) == reply);
>  }
>  
>  /**
> -- 
> 2.16.2
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list