瀏覽代碼

disp: msm: dp: fix test pattern selection

Use one level lower test pattern in case the current
test pattern fails to train link. This helps with few
monitors which sometimes fail with a selected test
pattern. Instead of failing the link, try with a lower
test pattern.

CRs-Fixed: 2507729
Change-Id: I394253398f49b03084dc547dacaededa49a9c527
Signed-off-by: Ajay Singh Parmar <[email protected]>
Ajay Singh Parmar 5 年之前
父節點
當前提交
8fb6f89363
共有 1 個文件被更改,包括 43 次插入7 次删除
  1. 43 7
      msm/dp/dp_ctrl.c

+ 43 - 7
msm/dp/dp_ctrl.c

@@ -77,6 +77,7 @@ struct dp_ctrl_private {
 
 	u32 vic;
 	u32 stream_count;
+	u32 training_2_pattern;
 	struct dp_mst_channel_info mst_ch_info;
 };
 
@@ -453,12 +454,7 @@ static int dp_ctrl_link_training_2(struct dp_ctrl_private *ctrl)
 	/* Make sure to clear the current pattern before starting a new one */
 	wmb();
 
-	if (drm_dp_tps4_supported(ctrl->panel->dpcd))
-		dpcd_pattern = DP_TRAINING_PATTERN_4;
-	else if (drm_dp_tps3_supported(ctrl->panel->dpcd))
-		dpcd_pattern = DP_TRAINING_PATTERN_3;
-	else
-		dpcd_pattern = DP_TRAINING_PATTERN_2;
+	dpcd_pattern = ctrl->training_2_pattern;
 
 	while (!atomic_read(&ctrl->aborted)) {
 		/* update hardware with current swing/pre-emp values */
@@ -643,9 +639,39 @@ static void dp_ctrl_disable_link_clock(struct dp_ctrl_private *ctrl)
 	ctrl->power->clk_enable(ctrl->power, DP_LINK_PM, false);
 }
 
+static void dp_ctrl_select_training_pattern(struct dp_ctrl_private *ctrl,
+						bool downgrade)
+{
+	u32 pattern;
+
+	if (drm_dp_tps4_supported(ctrl->panel->dpcd))
+		pattern = DP_TRAINING_PATTERN_4;
+	else if (drm_dp_tps3_supported(ctrl->panel->dpcd))
+		pattern = DP_TRAINING_PATTERN_3;
+	else
+		pattern = DP_TRAINING_PATTERN_2;
+
+	if (!downgrade)
+		goto end;
+
+	switch (pattern) {
+	case DP_TRAINING_PATTERN_4:
+		pattern = DP_TRAINING_PATTERN_3;
+		break;
+	case DP_TRAINING_PATTERN_3:
+		pattern = DP_TRAINING_PATTERN_2;
+		break;
+	default:
+		break;
+	}
+end:
+	ctrl->training_2_pattern = pattern;
+}
+
 static int dp_ctrl_link_setup(struct dp_ctrl_private *ctrl, bool shallow)
 {
 	int rc = -EINVAL;
+	bool downgrade = false;
 	u32 link_train_max_retries = 100;
 	struct dp_catalog_ctrl *catalog;
 	struct dp_link_params *link_params;
@@ -670,6 +696,16 @@ static int dp_ctrl_link_setup(struct dp_ctrl_private *ctrl, bool shallow)
 
 		dp_ctrl_configure_source_link_params(ctrl, true);
 
+		if (!(--link_train_max_retries % 10)) {
+			struct dp_link_params *link = &ctrl->link->link_params;
+
+			link->lane_count = ctrl->initial_lane_count;
+			link->bw_code = ctrl->initial_bw_code;
+			downgrade = true;
+		}
+
+		dp_ctrl_select_training_pattern(ctrl, downgrade);
+
 		rc = dp_ctrl_setup_main_link(ctrl);
 		if (!rc)
 			break;
@@ -686,7 +722,7 @@ static int dp_ctrl_link_setup(struct dp_ctrl_private *ctrl, bool shallow)
 			break;
 		}
 
-		if (!link_train_max_retries-- || atomic_read(&ctrl->aborted))
+		if (!link_train_max_retries || atomic_read(&ctrl->aborted))
 			break;
 
 		if (rc != -EAGAIN)