Assert for hardware idleness when we assign to execlist port,
if for some reason we get off the tracks on sw tracking.

Cc: Chris Wilson <ch...@chris-wilson.co.uk>
Signed-off-by: Mika Kuoppala <mika.kuopp...@intel.com>
---
 drivers/gpu/drm/i915/intel_engine_cs.c  | 10 ++++++++++
 drivers/gpu/drm/i915/intel_lrc.c        |  4 +++-
 drivers/gpu/drm/i915/intel_ringbuffer.h |  1 +
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c 
b/drivers/gpu/drm/i915/intel_engine_cs.c
index 69a6416..ba09420 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -524,3 +524,13 @@ void intel_engine_get_instdone(struct intel_engine_cs 
*engine,
                break;
        }
 }
+
+bool intel_engine_idle(struct intel_engine_cs *engine)
+{
+       struct drm_i915_private *dev_priv = engine->i915;
+
+       if (INTEL_GEN(engine->i915) > 2)
+               return I915_READ_MODE(engine) & MODE_IDLE;
+
+       return true;
+}
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index b21dbd4..3d909e3 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -347,9 +347,11 @@ static void execlists_submit_ports(struct intel_engine_cs 
*engine)
        u64 desc[2];
 
        GEM_BUG_ON(port[0].count > 1);
-       if (!port[0].count)
+       if (!port[0].count) {
+               GEM_BUG_ON(!intel_engine_idle(engine));
                execlists_context_status_change(port[0].request,
                                                INTEL_CONTEXT_SCHEDULE_IN);
+       }
        desc[0] = execlists_update_context(port[0].request);
        GEM_BUG_ONLY(port[0].context_id = upper_32_bits(desc[0]));
        port[0].count++;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h 
b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 896838c..a319df9 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -603,6 +603,7 @@ bool intel_engine_add_wait(struct intel_engine_cs *engine,
 void intel_engine_remove_wait(struct intel_engine_cs *engine,
                              struct intel_wait *wait);
 void intel_engine_enable_signaling(struct drm_i915_gem_request *request);
+bool intel_engine_idle(struct intel_engine_cs *engine);
 
 static inline bool intel_engine_has_waiter(const struct intel_engine_cs 
*engine)
 {
-- 
2.7.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to