[PATCH 04/61] drm/i915/gt: Replace open-coded intel_engine_stop_cs()

Mika Kuoppala mika.kuoppala at linux.intel.com
Wed Jan 13 16:37:20 UTC 2021


Chris Wilson <chris at chris-wilson.co.uk> writes:

> In the legacy ringbuffer submission, we still had an open-coded version
> of intel_engine_stop_cs() with one addition verification step. Transfer
> that verification to intel_engine_stop_cs() itself, and call it.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>

> ---
>  drivers/gpu/drm/i915/gt/intel_engine_cs.c     | 15 +++++++++--
>  .../gpu/drm/i915/gt/intel_ring_submission.c   | 25 +------------------
>  2 files changed, 14 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> index 1847d3c2ea99..58c900a12c13 100644
> --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> @@ -1048,8 +1048,19 @@ int intel_engine_stop_cs(struct intel_engine_cs *engine)
>  
>  	ENGINE_TRACE(engine, "\n");
>  	if (__intel_engine_stop_cs(engine, 1000, stop_timeout(engine))) {
> -		ENGINE_TRACE(engine, "timed out on STOP_RING -> IDLE\n");
> -		err = -ETIMEDOUT;
> +		ENGINE_TRACE(engine,
> +			     "timed out on STOP_RING -> IDLE; HEAD:%04x, TAIL:%04x\n",
> +			     ENGINE_READ_FW(engine, RING_HEAD) & HEAD_ADDR,
> +			     ENGINE_READ_FW(engine, RING_TAIL) & TAIL_ADDR);
> +
> +		/*
> +		 * Sometimes we observe that the idle flag is not
> +		 * set even though the ring is empty. So double
> +		 * check before giving up.
> +		 */
> +		if ((ENGINE_READ_FW(engine, RING_HEAD) & HEAD_ADDR) !=
> +		    (ENGINE_READ_FW(engine, RING_TAIL) & TAIL_ADDR))
> +			err = -ETIMEDOUT;
>  	}
>  
>  	return err;
> diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> index 657afd8ebc14..20f42722be8b 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> @@ -159,30 +159,7 @@ static void ring_setup_status_page(struct intel_engine_cs *engine)
>  
>  static bool stop_ring(struct intel_engine_cs *engine)
>  {
> -	struct drm_i915_private *dev_priv = engine->i915;
> -
> -	if (INTEL_GEN(dev_priv) > 2) {
> -		ENGINE_WRITE(engine,
> -			     RING_MI_MODE, _MASKED_BIT_ENABLE(STOP_RING));
> -		if (intel_wait_for_register(engine->uncore,
> -					    RING_MI_MODE(engine->mmio_base),
> -					    MODE_IDLE,
> -					    MODE_IDLE,
> -					    1000)) {
> -			drm_err(&dev_priv->drm,
> -				"%s : timed out trying to stop ring\n",
> -				engine->name);
> -
> -			/*
> -			 * Sometimes we observe that the idle flag is not
> -			 * set even though the ring is empty. So double
> -			 * check before giving up.
> -			 */
> -			if (ENGINE_READ(engine, RING_HEAD) !=
> -			    ENGINE_READ(engine, RING_TAIL))
> -				return false;
> -		}
> -	}
> +	intel_engine_stop_cs(engine);
>  
>  	ENGINE_WRITE(engine, RING_HEAD, ENGINE_READ(engine, RING_TAIL));
>  
> -- 
> 2.20.1
>
> _______________________________________________
> Intel-gfx-trybot mailing list
> Intel-gfx-trybot at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx-trybot


More information about the Intel-gfx-trybot mailing list