drm/i915/gt: Replace open-coded intel_engine_stop_cs()
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gt / intel_engine_cs.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;