summaryrefslogtreecommitdiff
path: root/msm/dp/dp_ctrl.c
diff options
context:
space:
mode:
authorAjay Singh Parmar <aparmar@codeaurora.org>2019-08-12 17:29:54 -0700
committerAjay Singh Parmar <aparmar@codeaurora.org>2019-08-19 14:36:17 -0700
commit8fb6f8936395048d556cbfd51ec40c0c89407ba7 (patch)
tree2886104c7b7ff6cdbfd783aa0322cfc1d2f484f5 /msm/dp/dp_ctrl.c
parentdc6f198f9949f85ef71447248a68498c26e619c0 (diff)
downloaddisplay-drivers-8fb6f8936395048d556cbfd51ec40c0c89407ba7.tar.gz
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 <aparmar@codeaurora.org>
Diffstat (limited to 'msm/dp/dp_ctrl.c')
-rw-r--r--msm/dp/dp_ctrl.c50
1 files changed, 43 insertions, 7 deletions
diff --git a/msm/dp/dp_ctrl.c b/msm/dp/dp_ctrl.c
index f5745181..e0a8d1e3 100644
--- a/msm/dp/dp_ctrl.c
+++ b/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)