On Fri, 2026-02-13 at 07:09 +0200, Ville Syrjälä wrote:
> On Thu, Feb 12, 2026 at 08:46:11PM +0200, Luca Coelho wrote:
> > Convert the low-hanging fruits of workaround checks to the workaround
> > framework.  Instead of having display structure checks for the
> > workarounds all over, concentrate the checks in intel_wa.c.
> > 
> > Acked-by: Jani Nikula <[email protected]>
> > Signed-off-by: Luca Coelho <[email protected]>
> > ---
> >  .../gpu/drm/i915/display/intel_display_wa.c   | 15 ++++++++++++--
> >  .../gpu/drm/i915/display/intel_display_wa.h   |  4 ++++
> >  drivers/gpu/drm/i915/display/intel_psr.c      | 20 ++++++++-----------
> >  3 files changed, 25 insertions(+), 14 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.c 
> > b/drivers/gpu/drm/i915/display/intel_display_wa.c
> > index 77ea2e5b8144..783e1383ff89 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_wa.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.c
> > @@ -112,6 +112,13 @@ bool __intel_display_wa(struct intel_display *display, 
> > enum intel_display_wa wa,
> >             return DISPLAY_VER(display) == 20;
> >     case INTEL_DISPLAY_WA_15018326506:
> >             return display->platform.battlemage;
> > +   case INTEL_DISPLAY_WA_16011303918:
> > +   case INTEL_DISPLAY_WA_22011320316:
> > +           return display->platform.alderlake_p &&
> > +                   IS_DISPLAY_STEP(display, STEP_A0, STEP_B0);
> > +   case INTEL_DISPLAY_WA_16011181250:
> > +           return display->platform.rocketlake || 
> > display->platform.alderlake_s ||
> > +                   display->platform.dg2;
> >     case INTEL_DISPLAY_WA_16011342517:
> >             return display->platform.alderlake_p &&
> >                     IS_DISPLAY_STEP(display, STEP_A0, STEP_D0);
> > @@ -121,15 +128,19 @@ bool __intel_display_wa(struct intel_display 
> > *display, enum intel_display_wa wa,
> >             return intel_display_needs_wa_16023588340(display);
> >     case INTEL_DISPLAY_WA_16025573575:
> >             return intel_display_needs_wa_16025573575(display);
> > +   case INTEL_DISPLAY_WA_16025596647:
> > +           return DISPLAY_VER(display) != 20 &&
> > +                   !IS_DISPLAY_VERx100_STEP(display, 3000,
> > +                                            STEP_A0, STEP_B0);
> 
> This one is nuts. It declarates (incorrectly) which platforms don't
> need the w/a. I don't think this sort of thing should be allowed here
> ever.

Yeah, this is bad.  I noticed the inversion (i.e. return who _doesn't_
need, as opposed to how all the other ones, which return who _does_
need the workaroun), but I admit I didn't give it much attention.  I'll
invert it.


> Presumably the only reason it was OK in the old place is because 
> those codepaths were only executed on some new platforms. But
> __intel_display_wa() is so generic that is is clearly meant to
> give correct answers regardless of where it gets called.

I don't think it was okay in the old place either.  It's just confusing
(unless it had a clear comment on why it was like this).

--
Cheers,
Luca.


> >     case INTEL_DISPLAY_WA_18034343758:
> >             return DISPLAY_VER(display) == 20 ||
> >                     (display->platform.pantherlake &&
> >                      IS_DISPLAY_STEP(display, STEP_A0, STEP_B0));
> >     case INTEL_DISPLAY_WA_22010178259:
> >             return DISPLAY_VER(display) == 12;
> > -   case INTEL_DISPLAY_WA_22011320316:
> > +   case INTEL_DISPLAY_WA_22012278275:
> >             return display->platform.alderlake_p &&
> > -                   IS_DISPLAY_STEP(display, STEP_A0, STEP_B0);
> > +                   IS_DISPLAY_STEP(display, STEP_A0, STEP_E0);
> >     case INTEL_DISPLAY_WA_22014263786:
> >             return IS_DISPLAY_VERx100(display, 1100, 1400);
> >     case INTEL_DISPLAY_WA_22021048059:
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.h 
> > b/drivers/gpu/drm/i915/display/intel_display_wa.h
> > index 3d2cf05ffacc..35d8df4c75a2 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_wa.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.h
> > @@ -44,13 +44,17 @@ enum intel_display_wa {
> >     INTEL_DISPLAY_WA_14025769978,
> >     INTEL_DISPLAY_WA_15013987218,
> >     INTEL_DISPLAY_WA_15018326506,
> > +   INTEL_DISPLAY_WA_16011181250,
> > +   INTEL_DISPLAY_WA_16011303918,
> >     INTEL_DISPLAY_WA_16011342517,
> >     INTEL_DISPLAY_WA_16011863758,
> >     INTEL_DISPLAY_WA_16023588340,
> >     INTEL_DISPLAY_WA_16025573575,
> > +   INTEL_DISPLAY_WA_16025596647,
> >     INTEL_DISPLAY_WA_18034343758,
> >     INTEL_DISPLAY_WA_22010178259,
> >     INTEL_DISPLAY_WA_22011320316,
> > +   INTEL_DISPLAY_WA_22012278275,
> >     INTEL_DISPLAY_WA_22012358565,
> >     INTEL_DISPLAY_WA_22014263786,
> >     INTEL_DISPLAY_WA_22021048059,
> > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c 
> > b/drivers/gpu/drm/i915/display/intel_psr.c
> > index 5bea2eda744b..b21e52f0c461 100644
> > --- a/drivers/gpu/drm/i915/display/intel_psr.c
> > +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> > @@ -40,6 +40,7 @@
> >  #include "intel_display_rpm.h"
> >  #include "intel_display_types.h"
> >  #include "intel_display_utils.h"
> > +#include "intel_display_wa.h"
> >  #include "intel_dmc.h"
> >  #include "intel_dp.h"
> >  #include "intel_dp_aux.h"
> > @@ -1082,7 +1083,7 @@ static void hsw_activate_psr2(struct intel_dp 
> > *intel_dp)
> >     }
> >  
> >     /* Wa_22012278275:adl-p */
> > -   if (display->platform.alderlake_p && IS_DISPLAY_STEP(display, STEP_A0, 
> > STEP_E0)) {
> > +   if (intel_display_wa(display, 22012278275)) {
> >             static const u8 map[] = {
> >                     2, /* 5 lines */
> >                     1, /* 6 lines */
> > @@ -1263,7 +1264,7 @@ tgl_dc3co_exitline_compute_config(struct intel_dp 
> > *intel_dp,
> >             return;
> >  
> >     /* Wa_16011303918:adl-p */
> > -   if (display->platform.alderlake_p && IS_DISPLAY_STEP(display, STEP_A0, 
> > STEP_B0))
> > +   if (intel_display_wa(display, 16011303918))
> >             return;
> >  
> >     /*
> > @@ -1540,8 +1541,7 @@ static bool intel_psr2_config_valid(struct intel_dp 
> > *intel_dp,
> >     }
> >  
> >     /* Wa_16011181250 */
> > -   if (display->platform.rocketlake || display->platform.alderlake_s ||
> > -       display->platform.dg2) {
> > +   if (intel_display_wa(display, 16011181250)) {
> >             drm_dbg_kms(display->drm,
> >                         "PSR2 is defeatured for this platform\n");
> >             return false;
> > @@ -1823,8 +1823,7 @@ void intel_psr_set_non_psr_pipes(struct intel_dp 
> > *intel_dp,
> >     u8 active_pipes = 0;
> >  
> >     /* Wa_16025596647 */
> > -   if (DISPLAY_VER(display) != 20 &&
> > -       !IS_DISPLAY_VERx100_STEP(display, 3000, STEP_A0, STEP_B0))
> > +   if (intel_display_wa(display, 16025596647))
> >             return;
> >  
> >     /* Not needed by Panel Replay  */
> > @@ -3973,8 +3972,7 @@ static void psr_dc5_dc6_wa_work(struct work_struct 
> > *work)
> >   */
> >  void intel_psr_notify_dc5_dc6(struct intel_display *display)
> >  {
> > -   if (DISPLAY_VER(display) != 20 &&
> > -       !IS_DISPLAY_VERx100_STEP(display, 3000, STEP_A0, STEP_B0))
> > +   if (intel_display_wa(display, 16025596647))
> >             return;
> >  
> >     schedule_work(&display->psr_dc5_dc6_wa_work);
> > @@ -3989,8 +3987,7 @@ void intel_psr_notify_dc5_dc6(struct intel_display 
> > *display)
> >   */
> >  void intel_psr_dc5_dc6_wa_init(struct intel_display *display)
> >  {
> > -   if (DISPLAY_VER(display) != 20 &&
> > -       !IS_DISPLAY_VERx100_STEP(display, 3000, STEP_A0, STEP_B0))
> > +   if (intel_display_wa(display, 16025596647))
> >             return;
> >  
> >     INIT_WORK(&display->psr_dc5_dc6_wa_work, psr_dc5_dc6_wa_work);
> > @@ -4011,8 +4008,7 @@ void intel_psr_notify_pipe_change(struct 
> > intel_atomic_state *state,
> >     struct intel_display *display = to_intel_display(state);
> >     struct intel_encoder *encoder;
> >  
> > -   if (DISPLAY_VER(display) != 20 &&
> > -       !IS_DISPLAY_VERx100_STEP(display, 3000, STEP_A0, STEP_B0))
> > +   if (intel_display_wa(display, 16025596647))
> >             return;
> >  
> >     for_each_intel_encoder_with_psr(display->drm, encoder) {
> > -- 
> > 2.51.0

Reply via email to