There is a critical section between intel_pipe_update_start() and intel_pipe_update_end() where we only program hardware registers, should not take any lock and complete as fast as possible.
The previous approach used to remove the local_irq_enable/disable() in this critical, but that increases the probability that the time sensitive section does not complete in 100 µs, potentially causing the hardware to hang. I went through all the lockdep splats that occurred in CI, and fixed them 1 by 1 until there were none left. This additionally improves latency by not removing any locks in the fastpath. In intel_de.h the implicit DMC wakelock was added, ideally we can get rid of it, but for now we can simply use the same _fw variants as are needed on i915. I believe this series is enough to make xe and perhaps good enough to make i915's display RT safe. Changes since v1: - Fix compilation on i915. - Submit to intel-gfx ml too.s Cc: Mario Kleiner <[email protected]> Cc: Mike Galbraith <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Sebastian Andrzej Siewior <[email protected]> Cc: Clark Williams <[email protected]> Cc: Steven Rostedt <[email protected]> Maarten Lankhorst (6): drm/i915/display: Make get_vblank_counter use intel_de_read_fw() drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset drm/i915/display: Move vblank put until after critical section drm/i915/display: Remove locking from intel_vblank_evade critical section drm/i915/display: Make icl_dsi_frame_update use _fw too drm/i915/display: Enable interrupts earlier on PREEMPT_RT Mike Galbraith (1): drm/i915: Use preempt_disable/enable_rt() where recommended drivers/gpu/drm/i915/display/icl_dsi.c | 4 +- drivers/gpu/drm/i915/display/intel_crtc.c | 10 +++ drivers/gpu/drm/i915/display/intel_cursor.c | 8 +- drivers/gpu/drm/i915/display/intel_de.h | 6 ++ drivers/gpu/drm/i915/display/intel_display.c | 36 ++++----- drivers/gpu/drm/i915/display/intel_vblank.c | 80 ++++++++++++------- drivers/gpu/drm/i915/display/intel_vrr.c | 16 ++-- .../drm/xe/compat-i915-headers/intel_uncore.h | 2 + 8 files changed, 103 insertions(+), 59 deletions(-) -- 2.51.0
