drm/i915/gt: Replace open-coded intel_engine_stop_cs()
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 13 Jan 2021 20:47:09 +0000 (20:47 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 13 Jan 2021 22:35:58 +0000 (22:35 +0000)
In the legacy ringbuffer submission, we still had an open-coded version
of intel_engine_stop_cs() with one additional verification step. Transfer
that verification to intel_engine_stop_cs() itself, and call it.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210113204709.15020-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_engine_cs.c
drivers/gpu/drm/i915/gt/intel_ring_submission.c

index f531207..fa76602 100644 (file)
@@ -1054,8 +1054,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;
index 657afd8..20f4272 100644 (file)
@@ -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));