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

drm/amd/display: lower lane count first when CR done partially fails in EQ

[why]
According to DP specs, in EQ DONE phase of link training, we
should lower lane count when at least one CR DONE bit is set to 1, while
lower link rate when all CR DONE bits are 0s. However in our code, we will
treat both cases as latter. This is not exactly correct based on the specs
expectation.

[how]
Check lane0 CR DONE bit when it is still set but CR DONE fails,
we treat it as a partial CR DONE failure in EQ DONE phase, we
will follow the same fallback flow as when ED DONE fails in EQ
DONE phase.
Reviewed-by: default avatarGeorge Shen <George.Shen@amd.com>
Acked-by: default avatarHamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9731dd4c
...@@ -1326,7 +1326,9 @@ static enum link_training_result perform_channel_equalization_sequence( ...@@ -1326,7 +1326,9 @@ static enum link_training_result perform_channel_equalization_sequence(
/* 5. check CR done*/ /* 5. check CR done*/
if (!dp_is_cr_done(lane_count, dpcd_lane_status)) if (!dp_is_cr_done(lane_count, dpcd_lane_status))
return LINK_TRAINING_EQ_FAIL_CR; return dpcd_lane_status[0].bits.CR_DONE_0 ?
LINK_TRAINING_EQ_FAIL_CR_PARTIAL :
LINK_TRAINING_EQ_FAIL_CR;
/* 6. check CHEQ done*/ /* 6. check CHEQ done*/
if (dp_is_ch_eq_done(lane_count, dpcd_lane_status) && if (dp_is_ch_eq_done(lane_count, dpcd_lane_status) &&
...@@ -1882,6 +1884,9 @@ static void print_status_message( ...@@ -1882,6 +1884,9 @@ static void print_status_message(
case LINK_TRAINING_EQ_FAIL_CR: case LINK_TRAINING_EQ_FAIL_CR:
lt_result = "CR failed in EQ"; lt_result = "CR failed in EQ";
break; break;
case LINK_TRAINING_EQ_FAIL_CR_PARTIAL:
lt_result = "CR failed in EQ partially";
break;
case LINK_TRAINING_EQ_FAIL_EQ: case LINK_TRAINING_EQ_FAIL_EQ:
lt_result = "EQ failed"; lt_result = "EQ failed";
break; break;
...@@ -3612,11 +3617,6 @@ static bool decide_fallback_link_setting( ...@@ -3612,11 +3617,6 @@ static bool decide_fallback_link_setting(
struct dc_link_settings *cur, struct dc_link_settings *cur,
enum link_training_result training_result) enum link_training_result training_result)
{ {
if (!cur)
return false;
if (!max)
return false;
if (dp_get_link_encoding_format(max) == DP_128b_132b_ENCODING || if (dp_get_link_encoding_format(max) == DP_128b_132b_ENCODING ||
link->dc->debug.force_dp2_lt_fallback_method) link->dc->debug.force_dp2_lt_fallback_method)
return decide_fallback_link_setting_max_bw_policy(link, max, cur, return decide_fallback_link_setting_max_bw_policy(link, max, cur,
...@@ -3646,6 +3646,7 @@ static bool decide_fallback_link_setting( ...@@ -3646,6 +3646,7 @@ static bool decide_fallback_link_setting(
break; break;
} }
case LINK_TRAINING_EQ_FAIL_EQ: case LINK_TRAINING_EQ_FAIL_EQ:
case LINK_TRAINING_EQ_FAIL_CR_PARTIAL:
{ {
if (!reached_minimum_lane_count(cur->lane_count)) { if (!reached_minimum_lane_count(cur->lane_count)) {
cur->lane_count = reduce_lane_count(cur->lane_count); cur->lane_count = reduce_lane_count(cur->lane_count);
......
...@@ -67,6 +67,8 @@ enum link_training_result { ...@@ -67,6 +67,8 @@ enum link_training_result {
LINK_TRAINING_CR_FAIL_LANE23, LINK_TRAINING_CR_FAIL_LANE23,
/* CR DONE bit is cleared during EQ step */ /* CR DONE bit is cleared during EQ step */
LINK_TRAINING_EQ_FAIL_CR, LINK_TRAINING_EQ_FAIL_CR,
/* CR DONE bit is cleared but LANE0_CR_DONE is set during EQ step */
LINK_TRAINING_EQ_FAIL_CR_PARTIAL,
/* other failure during EQ step */ /* other failure during EQ step */
LINK_TRAINING_EQ_FAIL_EQ, LINK_TRAINING_EQ_FAIL_EQ,
LINK_TRAINING_LQA_FAIL, LINK_TRAINING_LQA_FAIL,
......
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