Commit e72aa36e authored by Wenjing Liu's avatar Wenjing Liu Committed by Alex Deucher

drm/amd/display: fix link training regression for 1 or 2 lane

[why]
We have a regression that cause maximize lane settings to use
uninitialized data from unused lanes.
This will cause link training to fail for 1 or 2 lanes because the lane
adjust is populated incorrectly sometimes.

v2: fix build without CONFIG_DRM_AMD_DC_DCN (Alex)
Reviewed-by: default avatarEric Yang <eric.yang2@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9c92c79b
...@@ -108,6 +108,9 @@ static struct dc_link_settings get_common_supported_link_settings( ...@@ -108,6 +108,9 @@ static struct dc_link_settings get_common_supported_link_settings(
struct dc_link_settings link_setting_b); struct dc_link_settings link_setting_b);
static void maximize_lane_settings(const struct link_training_settings *lt_settings, static void maximize_lane_settings(const struct link_training_settings *lt_settings,
struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX]); struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX]);
static void override_lane_settings(const struct link_training_settings *lt_settings,
struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX]);
static uint32_t get_cr_training_aux_rd_interval(struct dc_link *link, static uint32_t get_cr_training_aux_rd_interval(struct dc_link *link,
const struct dc_link_settings *link_settings) const struct dc_link_settings *link_settings)
{ {
...@@ -734,15 +737,13 @@ void dp_decide_lane_settings( ...@@ -734,15 +737,13 @@ void dp_decide_lane_settings(
} }
#endif #endif
} }
/* we find the maximum of the requested settings across all lanes*/
/* and set this maximum for all lanes*/
dp_hw_to_dpcd_lane_settings(lt_settings, hw_lane_settings, dpcd_lane_settings); dp_hw_to_dpcd_lane_settings(lt_settings, hw_lane_settings, dpcd_lane_settings);
if (lt_settings->disallow_per_lane_settings) { if (lt_settings->disallow_per_lane_settings) {
/* we find the maximum of the requested settings across all lanes*/ /* we find the maximum of the requested settings across all lanes*/
/* and set this maximum for all lanes*/ /* and set this maximum for all lanes*/
maximize_lane_settings(lt_settings, hw_lane_settings); maximize_lane_settings(lt_settings, hw_lane_settings);
override_lane_settings(lt_settings, hw_lane_settings);
if (lt_settings->always_match_dpcd_with_hw_lane_settings) if (lt_settings->always_match_dpcd_with_hw_lane_settings)
dp_hw_to_dpcd_lane_settings(lt_settings, hw_lane_settings, dpcd_lane_settings); dp_hw_to_dpcd_lane_settings(lt_settings, hw_lane_settings, dpcd_lane_settings);
...@@ -833,6 +834,34 @@ static void maximize_lane_settings(const struct link_training_settings *lt_setti ...@@ -833,6 +834,34 @@ static void maximize_lane_settings(const struct link_training_settings *lt_setti
} }
} }
static void override_lane_settings(const struct link_training_settings *lt_settings,
struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX])
{
uint32_t lane;
if (lt_settings->voltage_swing == NULL &&
lt_settings->pre_emphasis == NULL &&
#if defined(CONFIG_DRM_AMD_DC_DCN)
lt_settings->ffe_preset == NULL &&
#endif
lt_settings->post_cursor2 == NULL)
return;
for (lane = 1; lane < LANE_COUNT_DP_MAX; lane++) {
if (lt_settings->voltage_swing)
lane_settings[lane].VOLTAGE_SWING = *lt_settings->voltage_swing;
if (lt_settings->pre_emphasis)
lane_settings[lane].PRE_EMPHASIS = *lt_settings->pre_emphasis;
if (lt_settings->post_cursor2)
lane_settings[lane].POST_CURSOR2 = *lt_settings->post_cursor2;
#if defined(CONFIG_DRM_AMD_DC_DCN)
if (lt_settings->ffe_preset)
lane_settings[lane].FFE_PRESET = *lt_settings->ffe_preset;
#endif
}
}
enum dc_status dp_get_lane_status_and_lane_adjust( enum dc_status dp_get_lane_status_and_lane_adjust(
struct dc_link *link, struct dc_link *link,
const struct link_training_settings *link_training_setting, const struct link_training_settings *link_training_setting,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment