> -----Original Message----- > From: Intel-gfx <[email protected]> On Behalf Of Ville > Syrjala > Sent: Thursday, November 20, 2025 12:23 AM > To: [email protected] > Cc: [email protected] > Subject: [PATCH 2/2] Revert "drm/i915/dp: change aux_ctl reg read to polling > read" > > From: Ville Syrjälä <[email protected]> > > This reverts commit 5a9b0c7418448ed3766f61ba0a71d08f259c3181. > > The switch from AUX interrupts to pollign was very hand-wavy. > Yes, there have been some situations in CI on a few platforms where the AUX > hardware seemingly forgets to signal the timeout, but those have been > happening after we switched to polling as well. So I don't think we have any > conclusive evidence that polling actually helps here. > > Someone really should root cause the actual problem, and see if there is a > proper workaround we could implemnt (eg. disabling clock gating/etc.). In the > meantime just go back to using the interrupt for AUX completion. > > If the hardware fails to signal the timeout we will just hit the > wait_event_timeout() software timeout instead. I suppose we could try to tune > the software timeout to more closely match the expected hardware timeout. > Might need to use > wait_event_hrtimeout() or something to avoid jiffies granularity issues... > > The AUX polling is also a hinderance towards using poll_timeout_us() because > we have a very long timeout, but would need a fairly short polling interval to > keep AUX transfer reasonably fast. Someone would need to come up with good > numbers in a somewhat scientific way. > Upon multiple rounds of validation based on the results polling had improvements when compared with the interrupt mechanism. We can optimize more by using poll_timeout, I am afraid that reverting back to interrupts may end up with more failures.
Thanks and Regards, Arun R Murthy -------------------- > Signed-off-by: Ville Syrjälä <[email protected]> > --- > drivers/gpu/drm/i915/display/intel_dp_aux.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux.c > b/drivers/gpu/drm/i915/display/intel_dp_aux.c > index 809799f63e32..d1a93e4a59b5 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_aux.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux.c > @@ -6,6 +6,7 @@ > #include <drm/drm_print.h> > > #include "intel_de.h" > +#include "intel_display_jiffies.h" > #include "intel_display_types.h" > #include "intel_display_utils.h" > #include "intel_dp.h" > @@ -60,16 +61,17 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp) > i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg(intel_dp); > const unsigned int timeout_ms = 10; > u32 status; > - int ret; > + bool done; > > - ret = intel_de_wait_ms(display, ch_ctl, > - DP_AUX_CH_CTL_SEND_BUSY, 0, > - timeout_ms, &status); > +#define C (((status = intel_de_read_notrace(display, ch_ctl)) & > DP_AUX_CH_CTL_SEND_BUSY) == 0) > + done = wait_event_timeout(display->gmbus.wait_queue, C, > + msecs_to_jiffies_timeout(timeout_ms)); > > - if (ret == -ETIMEDOUT) > + if (!done) > drm_err(display->drm, > "%s: did not complete or timeout within %ums (status > 0x%08x)\n", > intel_dp->aux.name, timeout_ms, status); > +#undef C > > return status; > } > -- > 2.49.1
