]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/i915/alpm: Calculate silence period
authorJouni Högander <jouni.hogander@intel.com>
Fri, 29 Aug 2025 05:39:25 +0000 (08:39 +0300)
committerJouni Högander <jouni.hogander@intel.com>
Fri, 5 Sep 2025 05:35:45 +0000 (08:35 +0300)
Calculate silence period instead of hardcoding it in switch case.

Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Animesh Manna <animesh.manna@intel.com>
Link: https://lore.kernel.org/r/20250829053929.3585636-2-jouni.hogander@intel.com
drivers/gpu/drm/i915/display/intel_alpm.c

index dfdde8e4eabe46dc6c4bc7e6b6176a5bd1f1333b..e48a4218c163b58cfc13155d33c93b1f2131f3c7 100644 (file)
 #include "intel_psr.h"
 #include "intel_psr_regs.h"
 
+#define SILENCE_PERIOD_MIN_TIME        80
+#define SILENCE_PERIOD_MAX_TIME        180
+#define SILENCE_PERIOD_TIME    (SILENCE_PERIOD_MIN_TIME +      \
+                               (SILENCE_PERIOD_MAX_TIME -      \
+                                SILENCE_PERIOD_MIN_TIME) / 2)
+
 bool intel_alpm_aux_wake_supported(struct intel_dp *intel_dp)
 {
        return intel_dp->alpm_dpcd & DP_ALPM_CAP;
@@ -44,11 +50,15 @@ void intel_alpm_init(struct intel_dp *intel_dp)
        mutex_init(&intel_dp->alpm_parameters.lock);
 }
 
+static int get_silence_period_symbols(const struct intel_crtc_state *crtc_state)
+{
+       return SILENCE_PERIOD_TIME * intel_dp_link_symbol_clock(crtc_state->port_clock) /
+               1000 / 1000;
+}
+
 /*
  * See Bspec: 71632 for the table
  *
- * Silence_period = tSilence,Min + ((tSilence,Max - tSilence,Min) / 2)
- *
  * Half cycle duration:
  *
  * Link rates 1.62 - 4.32 and tLFPS_Cycle = 70 ns
@@ -60,53 +70,41 @@ void intel_alpm_init(struct intel_dp *intel_dp)
  * FLOOR( LFPS Period in Symbol clocks /
  * (2 * PORT_ALPM_LFPS_CTL[ LFPS Cycle Count ]) )
  */
-static bool _lnl_get_silence_period_and_lfps_half_cycle(int link_rate,
-                                                       int *silence_period,
-                                                       int *lfps_half_cycle)
+static bool _lnl_get_lfps_half_cycle(int link_rate, int *lfps_half_cycle)
 {
        switch (link_rate) {
        case 162000:
-               *silence_period = 20;
                *lfps_half_cycle = 5;
                break;
        case 216000:
-               *silence_period = 27;
                *lfps_half_cycle = 7;
                break;
        case 243000:
-               *silence_period = 31;
                *lfps_half_cycle = 8;
                break;
        case 270000:
-               *silence_period = 34;
                *lfps_half_cycle = 9;
                break;
        case 324000:
-               *silence_period = 41;
                *lfps_half_cycle = 11;
                break;
        case 432000:
-               *silence_period = 56;
                *lfps_half_cycle = 15;
                break;
        case 540000:
-               *silence_period = 69;
                *lfps_half_cycle = 12;
                break;
        case 648000:
-               *silence_period = 84;
                *lfps_half_cycle = 15;
                break;
        case 675000:
-               *silence_period = 87;
                *lfps_half_cycle = 15;
                break;
        case 810000:
-               *silence_period = 104;
                *lfps_half_cycle = 19;
                break;
        default:
-               *silence_period = *lfps_half_cycle = -1;
+               *lfps_half_cycle = -1;
                return false;
        }
        return true;
@@ -160,10 +158,9 @@ _lnl_compute_aux_less_alpm_params(struct intel_dp *intel_dp,
                _lnl_compute_aux_less_wake_time(crtc_state->port_clock);
        aux_less_wake_lines = intel_usecs_to_scanlines(&crtc_state->hw.adjusted_mode,
                                                       aux_less_wake_time);
-
-       if (!_lnl_get_silence_period_and_lfps_half_cycle(crtc_state->port_clock,
-                                                        &silence_period,
-                                                        &lfps_half_cycle))
+       silence_period = get_silence_period_symbols(crtc_state);
+       if (!_lnl_get_lfps_half_cycle(crtc_state->port_clock,
+                                     &lfps_half_cycle))
                return false;
 
        if (aux_less_wake_lines > ALPM_CTL_AUX_LESS_WAKE_TIME_MASK ||