[PATCH 02/14] drm/i915/psr: Add HBR3 support

José Roberto de Souza jose.souza at intel.com
Tue Sep 18 01:09:15 UTC 2018


As in the regular link trainning, if the sink and source supports
HBR3, TP4 should be used as link pattern training.

Cc: Manasi Navare <manasi.d.navare at intel.com>
Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan at intel.com>
Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h               |  7 +++++
 drivers/gpu/drm/i915/intel_dp_link_training.c |  2 +-
 drivers/gpu/drm/i915/intel_drv.h              |  1 +
 drivers/gpu/drm/i915/intel_psr.c              | 28 ++++++++++++++-----
 4 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 4948b352bf4c..d4343d151056 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4132,6 +4132,7 @@ enum {
 #define   EDP_PSR_MIN_LINK_ENTRY_TIME_2_LINES	(2 << 25)
 #define   EDP_PSR_MIN_LINK_ENTRY_TIME_0_LINES	(3 << 25)
 #define   EDP_PSR_MAX_SLEEP_TIME_SHIFT		20
+#define   EDP_PSR_TP4_SEL			13 /* ICL+ */
 #define   EDP_PSR_SKIP_AUX_EXIT			(1 << 12)
 #define   EDP_PSR_TP1_TP2_SEL			(0 << 11)
 #define   EDP_PSR_TP1_TP3_SEL			(1 << 11)
@@ -4140,6 +4141,12 @@ enum {
 #define   EDP_PSR_TP2_TP3_TIME_100us		(1 << 8)
 #define   EDP_PSR_TP2_TP3_TIME_2500us		(2 << 8)
 #define   EDP_PSR_TP2_TP3_TIME_0us		(3 << 8)
+#define   EDP_PSR_TP4_TIME_SHIFT		(6)
+#define   EDP_PSR_TP4_TIME_MASK			(0xC0) /* ICL+ */
+#define   EDP_PSR_TP4_TIME_500us		(0 << EDP_PSR_TP4_TIME_SHIFT) /* ICL+ */
+#define   EDP_PSR_TP4_TIME_100us		(1 << EDP_PSR_TP4_TIME_SHIFT) /* ICL+ */
+#define   EDP_PSR_TP4_TIME_2500us		(2 << EDP_PSR_TP4_TIME_SHIFT) /* ICL+ */
+#define   EDP_PSR_TP4_TIME_0us			(3 << EDP_PSR_TP4_TIME_SHIFT) /* ICL+ */
 #define   EDP_PSR_TP1_TIME_500us		(0 << 4)
 #define   EDP_PSR_TP1_TIME_100us		(1 << 4)
 #define   EDP_PSR_TP1_TIME_2500us		(2 << 4)
diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c b/drivers/gpu/drm/i915/intel_dp_link_training.c
index a9f40985a621..d967d9fb41d3 100644
--- a/drivers/gpu/drm/i915/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/intel_dp_link_training.c
@@ -238,7 +238,7 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
  * or for 1.4 devices that support it, training Pattern 3 for HBR2
  * or 1.2 devices that support it, Training Pattern 2 otherwise.
  */
-static u32 intel_dp_training_pattern(struct intel_dp *intel_dp)
+u32 intel_dp_training_pattern(struct intel_dp *intel_dp)
 {
 	bool source_tps3, sink_tps3, source_tps4, sink_tps4;
 
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index bf1c38728a59..76d158024192 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1691,6 +1691,7 @@ int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
 					    int link_rate, uint8_t lane_count);
 void intel_dp_start_link_train(struct intel_dp *intel_dp);
 void intel_dp_stop_link_train(struct intel_dp *intel_dp);
+u32 intel_dp_training_pattern(struct intel_dp *intel_dp);
 int intel_dp_retrain_link(struct intel_encoder *encoder,
 			  struct drm_modeset_acquire_ctx *ctx);
 void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode);
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
index b6838b525502..b82debd5573b 100644
--- a/drivers/gpu/drm/i915/intel_psr.c
+++ b/drivers/gpu/drm/i915/intel_psr.c
@@ -385,20 +385,34 @@ static void hsw_activate_psr1(struct intel_dp *intel_dp)
 	else
 		val |= EDP_PSR_TP1_TIME_2500us;
 
-	if (dev_priv->vbt.psr.tp2_tp3_wakeup_time_us == 0)
+	if (dev_priv->vbt.psr.tp2_tp3_wakeup_time_us == 0) {
 		val |=  EDP_PSR_TP2_TP3_TIME_0us;
-	else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time_us <= 100)
+		if (INTEL_GEN(dev_priv) >= 11)
+			val |= EDP_PSR_TP4_TIME_0us;
+	} else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time_us <= 100) {
 		val |= EDP_PSR_TP2_TP3_TIME_100us;
-	else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time_us <= 500)
+		if (INTEL_GEN(dev_priv) >= 11)
+			val |= EDP_PSR_TP4_TIME_100us;
+	} else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time_us <= 500) {
 		val |= EDP_PSR_TP2_TP3_TIME_500us;
-	else
+		if (INTEL_GEN(dev_priv) >= 11)
+			val |= EDP_PSR_TP4_TIME_500us;
+	} else {
 		val |= EDP_PSR_TP2_TP3_TIME_2500us;
+		if (INTEL_GEN(dev_priv) >= 11)
+			val |= EDP_PSR_TP4_TIME_2500us;
+	}
 
-	if (intel_dp_source_supports_hbr2(intel_dp) &&
-	    drm_dp_tps3_supported(intel_dp->dpcd))
+	switch (intel_dp_training_pattern(intel_dp)) {
+	case DP_TRAINING_PATTERN_4:
+		val |= EDP_PSR_TP4_SEL;
+		break;
+	case DP_TRAINING_PATTERN_3:
 		val |= EDP_PSR_TP1_TP3_SEL;
-	else
+		break;
+	default:
 		val |= EDP_PSR_TP1_TP2_SEL;
+	}
 
 	if (INTEL_GEN(dev_priv) >= 8)
 		val |= EDP_PSR_CRC_ENABLE;
-- 
2.19.0



More information about the Intel-gfx-trybot mailing list