Sometimes engine reset fails because the engine resumes from an incorrect RING_HEAD. Engine head failed to set to zero even after writing into it. This is a timing issue and we experimented different values and found out that 20ms delay works best based on testing. So, add a 20ms delay to let engine resumes from correct RING_HEAD. Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13650 Signed-off-by: Nitin Gote <nitin.r.gote@xxxxxxxxx> --- drivers/gpu/drm/i915/gt/intel_ring_submission.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c index 6e9977b2d180..5576f000e965 100644 --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c @@ -365,6 +365,13 @@ static void reset_prepare(struct intel_engine_cs *engine) ENGINE_READ_FW(engine, RING_HEAD), ENGINE_READ_FW(engine, RING_TAIL), ENGINE_READ_FW(engine, RING_START)); + /* + * Sometimes engine head failed to set to zero even after writing into it. + * Use 20ms delay to let engine resumes from correct RING_HEAD. + * Experimented different values and determined that 20ms works best + * based on testing. + */ + mdelay(20); if (!stop_ring(engine)) { drm_err(&engine->i915->drm, "failed to set %s head to zero " -- 2.25.1