On Mon, 04 Aug 2025, Ankit Nautiyal <ankit.k.nauti...@intel.com> wrote:
> Introduce a helper to compute the max link wake latency when using
> Auxless/Aux wake mechanism for PSR/Panel Replay/LOBF features.
>
> This will be used to compute the minimum guardband so that the link wake
> latencies are accounted and these features work smoothly for higher
> refresh rate panels.
>
> Bspec: 70151, 71477
> Signed-off-by: Ankit Nautiyal <ankit.k.nauti...@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_psr.c | 64 ++++++++++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_psr.h |  3 ++
>  2 files changed, 67 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c 
> b/drivers/gpu/drm/i915/display/intel_psr.c
> index 6bd3454bb00e..6cdaff3ccc9f 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> @@ -33,6 +33,7 @@
>  #include "intel_atomic.h"
>  #include "intel_crtc.h"
>  #include "intel_cursor_regs.h"
> +#include "intel_cx0_phy.h"
>  #include "intel_ddi.h"
>  #include "intel_de.h"
>  #include "intel_display_irq.h"
> @@ -4249,3 +4250,66 @@ bool intel_psr_needs_alpm_aux_less(struct intel_dp 
> *intel_dp,
>  {
>       return intel_dp_is_edp(intel_dp) && crtc_state->has_panel_replay;
>  }
> +
> +static
> +int intel_psr_compute_aux_wake_latency(struct intel_dp *intel_dp,
> +                                    struct intel_crtc_state *crtc_state)
> +{
> +#define TFW_EXIT_LATENCY_MS          20000
> +#define FAST_WAKE_LATENCY_MS         12000 /* Preamble: 8us; PHY wake: 4us */
> +     struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
> +     int aux_wake_latency_us;
> +     int io_buffer_wake_ms;
> +
> +     io_buffer_wake_ms = intel_encoder_is_c10phy(encoder) ? 9790 : 14790;
> +
> +     aux_wake_latency_us =
> +             DIV_ROUND_UP(io_buffer_wake_ms + TFW_EXIT_LATENCY_MS + 
> FAST_WAKE_LATENCY_MS, 1000);

See https://lore.kernel.org/r/eeda84457c813151a3459a46a91946b4fbbb9...@intel.com

> +
> +     return aux_wake_latency_us;
> +}
> +
> +static
> +int intel_psr_compute_auxless_latency(struct intel_crtc_state *crtc_state)
> +{
> +#define PHY_ESTABLISHMENT_PERIOD_MS  50000
> +#define LFPS_PERIOD_MS                       800
> +#define SILENCE_MAX_MS                       180
> +     int linkrate_mhz = crtc_state->port_clock / 1000;
> +     int clock_data_switch_ms;
> +     int auxless_latency_us;
> +     int time_ml_phy_lock_ms;
> +     int num_ml_phy_lock;
> +     /*
> +      * TPS4 length = 252
> +      * tML_PHY_LOCK = TPS4 Length * ( 10 / (Link Rate in MHz) )
> +      * Number ML_PHY_LOCK = ( 7 + CEILING(6.5us / tML_PHY_LOCK ) + 1)
> +      * t2 = Number ML_PHY_LOCK * tML_PHY_LOCK
> +      * tCDS term  = 2 * t2
> +      * =>tCDS_term  = 2 * (7 * (252 * (10 /linkrate))+6.5)
> +      */
> +     time_ml_phy_lock_ms = (1000 * 252 * 10) / linkrate_mhz;
> +     num_ml_phy_lock = 7 + DIV_ROUND_UP(6500 * 1000, time_ml_phy_lock_ms) / 
> 1000 + 1;
> +     clock_data_switch_ms = 2 * time_ml_phy_lock_ms * num_ml_phy_lock;
> +
> +     auxless_latency_us = (LFPS_PERIOD_MS  + SILENCE_MAX_MS + 
> PHY_ESTABLISHMENT_PERIOD_MS +
> +                           clock_data_switch_ms) / 1000;
> +
> +     return auxless_latency_us;
> +}
> +
> +int intel_psr_compute_max_link_wake_latency(struct intel_dp *intel_dp,
> +                                         struct intel_crtc_state *crtc_state,
> +                                         bool assume_all_enabled)
> +{
> +     int aux_wake_latency = 0;
> +     int auxless_latency = 0;
> +
> +     if (assume_all_enabled || crtc_state->has_sel_update)
> +             auxless_latency = intel_psr_compute_aux_wake_latency(intel_dp, 
> crtc_state);
> +
> +     if (assume_all_enabled || crtc_state->has_panel_replay)
> +             aux_wake_latency = 
> intel_psr_compute_auxless_latency(crtc_state);
> +
> +     return max(auxless_latency, aux_wake_latency);
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.h 
> b/drivers/gpu/drm/i915/display/intel_psr.h
> index 9b061a22361f..c58d29620b49 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.h
> +++ b/drivers/gpu/drm/i915/display/intel_psr.h
> @@ -81,5 +81,8 @@ void intel_psr_debugfs_register(struct intel_display 
> *display);
>  bool intel_psr_needs_alpm(struct intel_dp *intel_dp, const struct 
> intel_crtc_state *crtc_state);
>  bool intel_psr_needs_alpm_aux_less(struct intel_dp *intel_dp,
>                                  const struct intel_crtc_state *crtc_state);
> +int intel_psr_compute_max_link_wake_latency(struct intel_dp *intel_dp,
> +                                         struct intel_crtc_state *crtc_state,
> +                                         bool assume_all_enabled);
>  
>  #endif /* __INTEL_PSR_H__ */

-- 
Jani Nikula, Intel

Reply via email to