[Intel-gfx] [PATCH] drm/i915: Distinguish between timeout and error in sideband transactions

Jani Nikula jani.nikula at intel.com
Mon Feb 27 16:34:26 UTC 2017


On Thu, 23 Feb 2017, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> After initiating a sideband transaction, we only want to wait for the
> transaction to become idle. If, as we are, we wait for both the busy
> and error flag to clear, if an error is raised we just spin until the
> timeout. Once the hw is idle, we can then check to see if the hw flagged
> an error, and report it distinctly.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Jani Nikula <jani.nikula at intel.com>

Much better indeed.

Reviewed-by: Jani Nikula <jani.nikula at intel.com>

(The pedantic nitpick is that response status is really two bits, and
you could read them both and fail if they're not zero. But meh.)

> ---
>  drivers/gpu/drm/i915/intel_sideband.c | 20 ++++++++++++++++----
>  1 file changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_sideband.c b/drivers/gpu/drm/i915/intel_sideband.c
> index 9f782b5eb6e6..41712ea9f5f8 100644
> --- a/drivers/gpu/drm/i915/intel_sideband.c
> +++ b/drivers/gpu/drm/i915/intel_sideband.c
> @@ -216,6 +216,7 @@ u32 intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg,
>  	}
>  
>  	I915_WRITE(SBI_ADDR, (reg << 16));
> +	I915_WRITE(SBI_DATA, 0);
>  
>  	if (destination == SBI_ICLK)
>  		value = SBI_CTL_DEST_ICLK | SBI_CTL_OP_CRRD;
> @@ -225,10 +226,15 @@ u32 intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg,
>  
>  	if (intel_wait_for_register(dev_priv,
>  				    SBI_CTL_STAT,
> -				    SBI_BUSY | SBI_RESPONSE_FAIL,
> +				    SBI_BUSY,
>  				    0,
>  				    100)) {
> -		DRM_ERROR("timeout waiting for SBI to complete read transaction\n");
> +		DRM_ERROR("timeout waiting for SBI to complete read\n");
> +		return 0;
> +
> +	}
> +	if (I915_READ(SBI_CTL_STAT) & SBI_RESPONSE_FAIL) {
> +		DRM_ERROR("error during SBI read of reg %x\n", reg);
>  		return 0;
>  	}
>  
> @@ -260,10 +266,16 @@ void intel_sbi_write(struct drm_i915_private *dev_priv, u16 reg, u32 value,
>  
>  	if (intel_wait_for_register(dev_priv,
>  				    SBI_CTL_STAT,
> -				    SBI_BUSY | SBI_RESPONSE_FAIL,
> +				    SBI_BUSY,
>  				    0,
>  				    100)) {
> -		DRM_ERROR("timeout waiting for SBI to complete write transaction\n");
> +		DRM_ERROR("timeout waiting for SBI to complete write\n");
> +		return;
> +	}
> +
> +	if (I915_READ(SBI_CTL_STAT) & SBI_RESPONSE_FAIL) {
> +		DRM_ERROR("error during SBI write of %x to reg %x\n",
> +			  value, reg);
>  		return;
>  	}
>  }

-- 
Jani Nikula, Intel Open Source Technology Center


More information about the Intel-gfx mailing list