[PATCH 5/5] drm/i915/gt: Replace ring probe for engine_is_idle with i915_sched query
Chris Wilson
chris at chris-wilson.co.uk
Sun Feb 7 01:44:12 UTC 2021
Now that we have a means to query whether the backend has an active
request, replace the ring_is_idle() check.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/gt/intel_engine_cs.c | 41 ++++++-----------------
1 file changed, 11 insertions(+), 30 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 28d2a121f2c0..577ebd4a324f 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -1175,31 +1175,6 @@ void intel_engine_get_instdone(const struct intel_engine_cs *engine,
}
}
-static bool ring_is_idle(struct intel_engine_cs *engine)
-{
- bool idle = true;
-
- if (I915_SELFTEST_ONLY(!engine->mmio_base))
- return true;
-
- if (!intel_engine_pm_get_if_awake(engine))
- return true;
-
- /* First check that no commands are left in the ring */
- if ((ENGINE_READ(engine, RING_HEAD) & HEAD_ADDR) !=
- (ENGINE_READ(engine, RING_TAIL) & TAIL_ADDR))
- idle = false;
-
- /* No bit for gen2, so assume the CS parser is idle */
- if (INTEL_GEN(engine->i915) > 2 &&
- !(ENGINE_READ(engine, RING_MI_MODE) & MODE_IDLE))
- idle = false;
-
- intel_engine_pm_put(engine);
-
- return idle;
-}
-
/**
* intel_engine_is_idle() - Report if the engine has finished process all work
* @engine: the intel_engine_cs
@@ -1210,14 +1185,12 @@ static bool ring_is_idle(struct intel_engine_cs *engine)
bool intel_engine_is_idle(struct intel_engine_cs *engine)
{
struct i915_sched *se = intel_engine_get_scheduler(engine);
+ struct i915_request *rq = NULL;
/* More white lies, if wedged, hw state is inconsistent */
if (intel_gt_is_wedged(engine->gt))
return true;
- if (!intel_engine_pm_is_awake(engine))
- return true;
-
/* Waiting to drain ELSP? */
synchronize_hardirq(to_pci_dev(engine->i915->drm.dev)->irq);
i915_sched_flush(se);
@@ -1226,8 +1199,16 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
if (!i915_sched_is_idle(se))
return false;
- /* Ring stopped? */
- return ring_is_idle(engine);
+ /* Execution complete? */
+ if (intel_engine_pm_get_if_awake(engine)) {
+ spin_lock_irq(&se->lock);
+ rq = i915_sched_get_active_request(se);
+ spin_unlock_irq(&se->lock);
+
+ intel_engine_pm_put(engine);
+ }
+
+ return !rq;
}
bool intel_engines_are_idle(struct intel_gt *gt)
--
2.20.1
More information about the Intel-gfx-trybot
mailing list