Commit 293f8c0f authored by Chris Wilson's avatar Chris Wilson

drm/i915: Use b->irq_enable() as predicate for mock engine

Since commit  d4ccceb0 ("drm/i915/icl: Ringbuffer interrupt handling")
we have required a mechanism to avoid touching the interrupt hardware
for breadcrumbs, superseding our mock interface for selftests.

The residual problem (ideas welcome) is in probing the mock ring
registers for ring_is_idle. Hmm, maybe we should just install
mock handlers for i915->uncore.mmio__write and friends? Only problem
being is that we would to truly mock some expected reads. :(

References: d4ccceb0 ("drm/i915/icl: Ringbuffer interrupt handling")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190118112225.13780-1-chris@chris-wilson.co.uk
parent 8d714185
...@@ -287,25 +287,16 @@ static bool __intel_breadcrumbs_enable_irq(struct intel_breadcrumbs *b) ...@@ -287,25 +287,16 @@ static bool __intel_breadcrumbs_enable_irq(struct intel_breadcrumbs *b)
if (b->irq_armed) if (b->irq_armed)
return false; return false;
/* The breadcrumb irq will be disarmed on the interrupt after the /*
* The breadcrumb irq will be disarmed on the interrupt after the
* waiters are signaled. This gives us a single interrupt window in * waiters are signaled. This gives us a single interrupt window in
* which we can add a new waiter and avoid the cost of re-enabling * which we can add a new waiter and avoid the cost of re-enabling
* the irq. * the irq.
*/ */
b->irq_armed = true; b->irq_armed = true;
if (I915_SELFTEST_ONLY(b->mock)) { /*
/* For our mock objects we want to avoid interaction * Since we are waiting on a request, the GPU should be busy
* with the real hardware (which is not set up). So
* we simply pretend we have enabled the powerwell
* and the irq, and leave it up to the mock
* implementation to call intel_engine_wakeup()
* itself when it wants to simulate a user interrupt,
*/
return true;
}
/* Since we are waiting on a request, the GPU should be busy
* and should have its own rpm reference. This is tracked * and should have its own rpm reference. This is tracked
* by i915->gt.awake, we can forgo holding our own wakref * by i915->gt.awake, we can forgo holding our own wakref
* for the interrupt as before i915->gt.awake is released (when * for the interrupt as before i915->gt.awake is released (when
......
...@@ -917,6 +917,9 @@ static bool ring_is_idle(struct intel_engine_cs *engine) ...@@ -917,6 +917,9 @@ static bool ring_is_idle(struct intel_engine_cs *engine)
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
bool idle = true; bool idle = true;
if (I915_SELFTEST_ONLY(!engine->mmio_base))
return true;
/* If the whole device is asleep, the engine must be idle */ /* If the whole device is asleep, the engine must be idle */
wakeref = intel_runtime_pm_get_if_in_use(dev_priv); wakeref = intel_runtime_pm_get_if_in_use(dev_priv);
if (!wakeref) if (!wakeref)
...@@ -955,9 +958,6 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine) ...@@ -955,9 +958,6 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
if (!intel_engine_signaled(engine, intel_engine_last_submit(engine))) if (!intel_engine_signaled(engine, intel_engine_last_submit(engine)))
return false; return false;
if (I915_SELFTEST_ONLY(engine->breadcrumbs.mock))
return true;
/* Waiting to drain ELSP? */ /* Waiting to drain ELSP? */
if (READ_ONCE(engine->execlists.active)) { if (READ_ONCE(engine->execlists.active)) {
struct tasklet_struct *t = &engine->execlists.tasklet; struct tasklet_struct *t = &engine->execlists.tasklet;
...@@ -983,10 +983,7 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine) ...@@ -983,10 +983,7 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
return false; return false;
/* Ring stopped? */ /* Ring stopped? */
if (!ring_is_idle(engine)) return ring_is_idle(engine);
return false;
return true;
} }
bool intel_engines_are_idle(struct drm_i915_private *dev_priv) bool intel_engines_are_idle(struct drm_i915_private *dev_priv)
......
...@@ -398,7 +398,6 @@ struct intel_engine_cs { ...@@ -398,7 +398,6 @@ struct intel_engine_cs {
unsigned int irq_count; unsigned int irq_count;
bool irq_armed : 1; bool irq_armed : 1;
I915_SELFTEST_DECLARE(bool mock : 1);
} breadcrumbs; } breadcrumbs;
struct { struct {
......
...@@ -201,7 +201,6 @@ struct intel_engine_cs *mock_engine(struct drm_i915_private *i915, ...@@ -201,7 +201,6 @@ struct intel_engine_cs *mock_engine(struct drm_i915_private *i915,
i915_timeline_set_subclass(&engine->base.timeline, TIMELINE_ENGINE); i915_timeline_set_subclass(&engine->base.timeline, TIMELINE_ENGINE);
intel_engine_init_breadcrumbs(&engine->base); intel_engine_init_breadcrumbs(&engine->base);
engine->base.breadcrumbs.mock = true; /* prevent touching HW for irqs */
/* fake hw queue */ /* fake hw queue */
spin_lock_init(&engine->hw_lock); spin_lock_init(&engine->hw_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment