drm/i915/execlists: Workaround switching back to a completed context
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 27 Mar 2020 20:14:33 +0000 (20:14 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 27 Mar 2020 20:53:26 +0000 (20:53 +0000)
commit35f3fd8182ba26e766f7b814e903acf19d01bbb5
tree827e6a6246590fcb3672816995ec707d3e292017
parent05d756b0c3b8b56e682e2e23801057d85b423846
drm/i915/execlists: Workaround switching back to a completed context

In what seems remarkably similar to the w/a required to not reload an
idle context with HEAD==TAIL, it appears we must prevent the HW from
switching to an idle context in ELSP[1], while simultaneously trying to
preempt the HW to run another context and a continuation of the idle
context (which is no longer idle).

We can achieve this by preventing the context from completing while we
reload a new ELSP (by applying ring_set_paused(1) across the whole of
dequeue), except this eventually fails due to a lite-restore into a
waiting semaphore does not generate an ACK. Instead, we try to avoid
making the GPU do anything too challenging and not submit a new ELSP
while the interrupts + CSB events appear to have fallen behind the
completed contexts. We expect it to catch up shortly so we queue another
tasklet execution and hope for the best.

Closes: https://gitlab.freedesktop.org/drm/intel/issues/1501
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200327201433.21864-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_lrc.c