diff options
author | Ajay Singh Parmar <aparmar@codeaurora.org> | 2019-08-12 17:29:54 -0700 |
---|---|---|
committer | Ajay Singh Parmar <aparmar@codeaurora.org> | 2019-08-19 14:36:17 -0700 |
commit | 8fb6f8936395048d556cbfd51ec40c0c89407ba7 (patch) | |
tree | 2886104c7b7ff6cdbfd783aa0322cfc1d2f484f5 /msm/dp/dp_ctrl.c | |
parent | dc6f198f9949f85ef71447248a68498c26e619c0 (diff) | |
download | display-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.c | 50 |
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) |