[PATCH v4 3/5] drm/i915/psr: Calculate IO wake and fast wake lines for DISPLAY_VER < 12

Hogander, Jouni jouni.hogander at intel.com
Fri Mar 8 08:28:27 UTC 2024


On Thu, 2024-03-07 at 19:16 +0200, Ville Syrjälä wrote:
> On Wed, Mar 06, 2024 at 10:34:25AM +0200, Jouni Högander wrote:
> > Bspec mentions 50 us for IO wake time and 32 us for fast wake time.
> > 32 us
> > is most probably wrong as it doesn't meet the specification as fast
> > wake
> > time is calculated in Bspec like this:
> > 
> > 10..16 us (precharge) + 8 us (preamble) + 4 us (phy_wake) + 20 us
> > (tfw_exit_latency)
> > 
> > Instead of using these constants calculate IO wake and fast wake
> > for
> > DISPLAY_VER < 12 as well.
> > 
> > v2:
> >   - initialize io/fast_wake_time for display version < 9
> > 
> > Signed-off-by: Jouni Högander <jouni.hogander at intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_psr.c | 34 ++++++++++++++++++--
> > ----
> >  1 file changed, 26 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> > b/drivers/gpu/drm/i915/display/intel_psr.c
> > index 905208e1c771..e1df0ece9fa3 100644
> > --- a/drivers/gpu/drm/i915/display/intel_psr.c
> > +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> > @@ -1150,9 +1150,25 @@ static bool _lnl_compute_alpm_params(struct
> > intel_dp *intel_dp,
> >         return true;
> >  }
> >  
> > -static int get_io_buffer_wake_time(void)
> > +/*
> > + * From Bspec:
> > + *
> > + * For DISPLAY_VER >= 12
> > + * 10 us
> > + *
> > + * For DISPLAY_VER < 12
> > + * This is not directly mentioned in Bspec. There are 50 us io
> > wake time and 32
> > + * us fast wake time. Clearly preharge pulses are not (improperly)
> > included in
> > + * 32 us fast wake time. 50 us - 32 us = 18 us.
> > + */
> > +static int get_io_buffer_wake_time(const struct intel_crtc_state
> > *crtc_state)
> >  {
> > -       return 10;
> > +       struct drm_i915_private *i915 = to_i915(crtc_state-
> > >uapi.crtc->dev);
> > +
> > +       if (DISPLAY_VER(i915) < 12)
> > +               return 18;
> > +       else
> > +               return 10;
> >  }
> >  
> >  static bool _compute_alpm_params(struct intel_dp *intel_dp,
> > @@ -1162,8 +1178,8 @@ static bool _compute_alpm_params(struct
> > intel_dp *intel_dp,
> >         int io_wake_lines, io_wake_time, fast_wake_lines,
> > fast_wake_time;
> >         u8 max_wake_lines;
> >  
> > -       if (DISPLAY_VER(i915) >= 12) {
> > -               int io_buffer_wake_time =
> > get_io_buffer_wake_time();
> > +       if (DISPLAY_VER(i915) >= 9) {
> > +               int io_buffer_wake_time =
> > get_io_buffer_wake_time(crtc_state);
> >                 int tfw_exit_latency = 20; /* eDP spec */
> >                 int phy_wake = 4;          /* eDP spec */
> >                 int preamble = 8;          /* eDP spec */
> > @@ -1173,15 +1189,17 @@ static bool _compute_alpm_params(struct
> > intel_dp *intel_dp,
> >                         phy_wake + tfw_exit_latency;
> >                 fast_wake_time = precharge + preamble + phy_wake +
> >                         tfw_exit_latency;
> > -
> > -               /* TODO: Check how we can use ALPM_CTL fast wake
> > extended field */
> > -               max_wake_lines = 12;
> >         } else {
> >                 io_wake_time = 50;
> >                 fast_wake_time = 32;
> > -               max_wake_lines = 8;
> 
> Isn't the whole else branch dead code now?

Yes, that shouldn't actually happen (due to transcoder_has_psr2). Maybe
best way is to remove if and else. I will change that unless you have
better idea.

BR,

Jouni Högander

> 
> >         }
> >  
> > +       if (DISPLAY_VER(i915) >= 12)
> > +               /* TODO: Check how we can use ALPM_CTL fast wake
> > extended field */
> > +               max_wake_lines = 12;
> > +       else
> > +               max_wake_lines = 8;
> > +
> >         io_wake_lines = intel_usecs_to_scanlines(
> >                 &crtc_state->hw.adjusted_mode, io_wake_time);
> >         fast_wake_lines = intel_usecs_to_scanlines(
> > -- 
> > 2.34.1
> 



More information about the Intel-gfx mailing list