> -----Original Message-----
> From: Intel-xe <intel-xe-boun...@lists.freedesktop.org> On Behalf Of Jouni
> Högander
> Sent: Wednesday, August 13, 2025 12:36 PM
> To: intel-gfx@lists.freedesktop.org; intel...@lists.freedesktop.org
> Cc: Hogander, Jouni <jouni.hogan...@intel.com>
> Subject: [PATCH 3/4] drm/i915/alpm: Replace hardcoded LFPS cycle with
> proper calculation
> 
> Currently LFPS is hadcoded for different port clocks. Replace this with proper
> calculation.
> 
> Signed-off-by: Jouni Högander <jouni.hogan...@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_alpm.c | 90 ++++++++++-------------
>  1 file changed, 38 insertions(+), 52 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c
> b/drivers/gpu/drm/i915/display/intel_alpm.c
> index ae556a885c2a..b2123305f128 100644
> --- a/drivers/gpu/drm/i915/display/intel_alpm.c
> +++ b/drivers/gpu/drm/i915/display/intel_alpm.c
> @@ -58,58 +58,43 @@ static int get_silence_period_symbols(const struct
> intel_crtc_state *crtc_state)
>               1000 / 1000;
>  }
> 
> -/*
> - * See Bspec: 71632 for the table
> - *
> - * Half cycle duration:
> - *
> - * Link rates 1.62 - 4.32 and tLFPS_Cycle = 70 ns
> - * FLOOR( (Link Rate * tLFPS_Cycle) / (2 * 10) )
> - *
> - * Link rates 5.4 - 8.1
> - * PORT_ALPM_LFPS_CTL[ LFPS Cycle Count ] = 10
> - * LFPS Period chosen is the mid-point of the min:max values from the table
> - * FLOOR( LFPS Period in Symbol clocks /
> - * (2 * PORT_ALPM_LFPS_CTL[ LFPS Cycle Count ]) )
> - */
> -static bool _lnl_get_lfps_half_cycle(int link_rate, int *lfps_half_cycle)
> +static int get_lfps_cycle_min_max_time(const struct intel_crtc_state
> *crtc_state,
> +                                    int *min, int *max)
>  {
> -     switch (link_rate) {
> -     case 162000:
> -             *lfps_half_cycle = 5;
> -             break;
> -     case 216000:
> -             *lfps_half_cycle = 7;
> -             break;
> -     case 243000:
> -             *lfps_half_cycle = 8;
> -             break;
> -     case 270000:
> -             *lfps_half_cycle = 9;
> -             break;
> -     case 324000:
> -             *lfps_half_cycle = 11;
> -             break;
> -     case 432000:
> -             *lfps_half_cycle = 15;
> -             break;
> -     case 540000:
> -             *lfps_half_cycle = 12;
> -             break;
> -     case 648000:
> -             *lfps_half_cycle = 15;
> -             break;
> -     case 675000:
> -             *lfps_half_cycle = 15;
> -             break;
> -     case 810000:
> -             *lfps_half_cycle = 19;
> -             break;
> -     default:
> -             *lfps_half_cycle = -1;
> -             return false;
> +     if (crtc_state->port_clock < 540000) {
> +             *min = 65 * LFPS_CYCLE_COUNT;
> +             *max = 75 * LFPS_CYCLE_COUNT;
> +     } else if (crtc_state->port_clock <= 810000) {
> +             *min = 140;
> +             *max = 800;
> +     } else {
> +             *min = *max = -1;
> +             return -1;
>       }
> -     return true;
> +
> +     return 0;
> +}
> +
> +static int get_lfps_cycle_time(const struct intel_crtc_state
> +*crtc_state) {
> +     int tlfps_cycle_min, tlfps_cycle_max, ret;
> +
> +     ret = get_lfps_cycle_min_max_time(crtc_state, &tlfps_cycle_min,
> +                                       &tlfps_cycle_max);
> +     if (ret)
> +             return ret;
> +
> +     return tlfps_cycle_min +  (tlfps_cycle_max - tlfps_cycle_min) / 2; }
> +
> +static int get_lfps_half_cycle_clocks(const struct intel_crtc_state
> +*crtc_state) {
> +     int lfps_cycle_time = get_lfps_cycle_time(crtc_state);
> +
> +     if (lfps_cycle_time < 0)
> +             return -1;
> +
> +     return lfps_cycle_time * crtc_state->port_clock / 1000 / 1000 / 20;

What 20 means above? if it is derived from LFPS cycle count then good to use 
LFPS_CYCLE_COUNT macro.

Regards,
Animesh

>  }
> 
>  /*
> @@ -161,8 +146,9 @@ _lnl_compute_aux_less_alpm_params(struct
> intel_dp *intel_dp,
>       aux_less_wake_lines = intel_usecs_to_scanlines(&crtc_state-
> >hw.adjusted_mode,
>                                                      aux_less_wake_time);
>       silence_period = get_silence_period_symbols(crtc_state);
> -     if (!_lnl_get_lfps_half_cycle(crtc_state->port_clock,
> -                                   &lfps_half_cycle))
> +
> +     lfps_half_cycle = get_lfps_half_cycle_clocks(crtc_state);
> +     if (lfps_half_cycle < 0)
>               return false;
> 
>       if (aux_less_wake_lines > ALPM_CTL_AUX_LESS_WAKE_TIME_MASK
> ||
> --
> 2.43.0

Reply via email to