diff mbox series

[3/6] drm/i915/psr: Calculate aux less switch to active latency

Message ID 20240215104934.2395239-4-jouni.hogander@intel.com (mailing list archive)
State New, archived
Headers show
Series ALPM AUX-Less | expand

Commit Message

Hogander, Jouni Feb. 15, 2024, 10:49 a.m. UTC
Calculate aux less  switch to active latency and store it into alpm_params
struct.

Bspec: 71477

Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
 .../drm/i915/display/intel_display_types.h    |  1 +
 drivers/gpu/drm/i915/display/intel_psr.c      | 26 ++++++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index a531c1e5af20..df82551a3f42 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1722,6 +1722,7 @@  struct intel_psr {
 		/* LNL and beyond */
 		u8 check_entry_lines;
 		u8 aux_less_wake_lines;
+		u8 switch_to_active_lines;
 	} alpm_parameters;
 
 	ktime_t last_entry_attempt;
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
index b139db67df55..4cefb9ada5db 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -1154,24 +1154,44 @@  static int _lnl_compute_aux_less_wake_time(int port_clock)
 			    num_ml_phy_lock * tml_phy_lock, 1000);
 }
 
+/*
+ * 128b/132b Switch to Active = 32 * (ML_PHY_LOCK Length + 3 + 64) / fLink (in MHz)
+ * Switch to Active Latency = CEILING( t128b/132b Switch to Active / tLine )
+ * ML_PHY_LOCK Length = 396
+ * The "+3" term is the trailing zero padding after the POST_LT_SCRAMBLER_RESET
+ * The "+64" term represents the MTP timeslots
+ */
+static int _lnl_compute_switch_to_active_time(int port_clock)
+{
+	return 32 * (396 + 3 + 64) / (port_clock / 1000);
+}
+
 static int _lnl_compute_aux_less_alpm_params(struct intel_dp *intel_dp,
 					     struct intel_crtc_state *crtc_state)
 {
 	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
-	int aux_less_wake_time, aux_less_wake_lines;
+	int aux_less_wake_time, aux_less_wake_lines, switch_to_active_lines;
 
 	aux_less_wake_time =
 		_lnl_compute_aux_less_wake_time(crtc_state->port_clock / 1000);
 	aux_less_wake_lines = intel_usecs_to_scanlines(&crtc_state->hw.adjusted_mode,
 						       aux_less_wake_time);
 
-	if (aux_less_wake_lines > 32)
+	switch_to_active_lines =
+		intel_usecs_to_scanlines(
+			&crtc_state->hw.adjusted_mode,
+			_lnl_compute_switch_to_active_time(crtc_state->port_clock / 1000));
+
+	if (aux_less_wake_lines > 32 || switch_to_active_lines > 32)
 		return false;
 
-	if (i915->display.params.psr_safest_params)
+	if (i915->display.params.psr_safest_params) {
 		aux_less_wake_lines = 32;
+		switch_to_active_lines = 32;
+	}
 
 	intel_dp->psr.alpm_parameters.aux_less_wake_lines = aux_less_wake_lines;
+	intel_dp->psr.alpm_parameters.switch_to_active_lines = switch_to_active_lines;
 
 	return true;
 }