Commit 15501287 authored by Chris Wilson's avatar Chris Wilson

drm/i915/execlists: Drop request-before-CS assertion

When we migrated to execlists, one of the conditions we wanted to test
for was whether the breadcrumb seqno was being written before the
breadcumb interrupt was delivered. This was following on from issues
observed on previous generations which were not so strongly ordered. With
the removal of the missed interrupt detection, we have not reliable
means of detecting the out-of-order seqno/interrupt but instead tried to
assert that the relationship between the CS event interrupt and the
breadwrite should be strongly ordered. However, Icelake proves it is
possible for the HW implementation to forget about minor little details
such as write ordering and so the order between *processing* the CS
event and the breadcrumb is unreliable.

Remove the unreliable assertion, but leave a debug telltale in case we
have reason to suspect.

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/1658Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200422141749.28709-1-chris@chris-wilson.co.uk
parent cb593e5d
......@@ -2384,13 +2384,6 @@ gen8_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb)
return *csb & (GEN8_CTX_STATUS_IDLE_ACTIVE | GEN8_CTX_STATUS_PREEMPTED);
}
static inline void flush_hwsp(const struct i915_request *rq)
{
mb();
clflush((void *)READ_ONCE(rq->hwsp_seqno));
mb();
}
static void process_csb(struct intel_engine_cs *engine)
{
struct intel_engine_execlists * const execlists = &engine->execlists;
......@@ -2498,7 +2491,11 @@ static void process_csb(struct intel_engine_cs *engine)
* We rely on the hardware being strongly
* ordered, that the breadcrumb write is
* coherent (visible from the CPU) before the
* user interrupt and CSB is processed.
* user interrupt is processed. One might assume
* that the breadcrumb write being before the
* user interrupt and the CS event for the context
* switch would therefore be before the CS event
* itself...
*/
if (GEM_SHOW_DEBUG() &&
!i915_request_completed(*execlists->active)) {
......@@ -2506,19 +2503,8 @@ static void process_csb(struct intel_engine_cs *engine)
const u32 *regs __maybe_unused =
rq->context->lrc_reg_state;
/*
* Flush the breadcrumb before crying foul.
*
* Since we have hit this on icl and seen the
* breadcrumb advance as we print out the debug
* info (so the problem corrected itself without
* lasting damage), and we know that icl suffers
* from missing global observation points in
* execlists, presume that affects even more
* coherency.
*/
flush_hwsp(rq);
ENGINE_TRACE(engine,
"context completed before request!\n");
ENGINE_TRACE(engine,
"ring:{start:0x%08x, head:%04x, tail:%04x, ctl:%08x, mode:%08x}\n",
ENGINE_READ(engine, RING_START),
......@@ -2538,11 +2524,6 @@ static void process_csb(struct intel_engine_cs *engine)
regs[CTX_RING_START],
regs[CTX_RING_HEAD],
regs[CTX_RING_TAIL]);
/* Still? Declare it caput! */
if (!i915_request_completed(rq) &&
!reset_in_progress(execlists))
GEM_BUG_ON("context completed before request");
}
execlists_schedule_out(*execlists->active++);
......
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