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

drm/amd/display: minor dp link training refactor

[how]
The change includes some dp link training refactors:
1. break down is_ch_eq_done to checking individual conditions in
its own function.
2. update dpcd_set_training_pattern to take in dc_dp_training_pattern
as input.
3. moving lttpr mode struct definition into link_service_types.h
Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Reviewed-by: default avatarGeorge Shen <George.Shen@amd.com>
Acked-by: default avatarStylon Wang <stylon.wang@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4469201b
...@@ -108,10 +108,50 @@ static void wait_for_training_aux_rd_interval( ...@@ -108,10 +108,50 @@ static void wait_for_training_aux_rd_interval(
wait_in_micro_secs); wait_in_micro_secs);
} }
static enum dpcd_training_patterns
dc_dp_training_pattern_to_dpcd_training_pattern(
struct dc_link *link,
enum dc_dp_training_pattern pattern)
{
enum dpcd_training_patterns dpcd_tr_pattern =
DPCD_TRAINING_PATTERN_VIDEOIDLE;
switch (pattern) {
case DP_TRAINING_PATTERN_SEQUENCE_1:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_1;
break;
case DP_TRAINING_PATTERN_SEQUENCE_2:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_2;
break;
case DP_TRAINING_PATTERN_SEQUENCE_3:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_3;
break;
case DP_TRAINING_PATTERN_SEQUENCE_4:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_4;
break;
case DP_TRAINING_PATTERN_VIDEOIDLE:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_VIDEOIDLE;
break;
default:
ASSERT(0);
DC_LOG_HW_LINK_TRAINING("%s: Invalid HW Training pattern: %d\n",
__func__, pattern);
break;
}
return dpcd_tr_pattern;
}
static void dpcd_set_training_pattern( static void dpcd_set_training_pattern(
struct dc_link *link, struct dc_link *link,
union dpcd_training_pattern dpcd_pattern) enum dc_dp_training_pattern training_pattern)
{ {
union dpcd_training_pattern dpcd_pattern = { {0} };
dpcd_pattern.v1_4.TRAINING_PATTERN_SET =
dc_dp_training_pattern_to_dpcd_training_pattern(
link, training_pattern);
core_link_write_dpcd( core_link_write_dpcd(
link, link,
DP_TRAINING_PATTERN_SET, DP_TRAINING_PATTERN_SET,
...@@ -240,37 +280,6 @@ static void dpcd_set_link_settings( ...@@ -240,37 +280,6 @@ static void dpcd_set_link_settings(
} }
} }
static enum dpcd_training_patterns
dc_dp_training_pattern_to_dpcd_training_pattern(
struct dc_link *link,
enum dc_dp_training_pattern pattern)
{
enum dpcd_training_patterns dpcd_tr_pattern =
DPCD_TRAINING_PATTERN_VIDEOIDLE;
switch (pattern) {
case DP_TRAINING_PATTERN_SEQUENCE_1:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_1;
break;
case DP_TRAINING_PATTERN_SEQUENCE_2:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_2;
break;
case DP_TRAINING_PATTERN_SEQUENCE_3:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_3;
break;
case DP_TRAINING_PATTERN_SEQUENCE_4:
dpcd_tr_pattern = DPCD_TRAINING_PATTERN_4;
break;
default:
ASSERT(0);
DC_LOG_HW_LINK_TRAINING("%s: Invalid HW Training pattern: %d\n",
__func__, pattern);
break;
}
return dpcd_tr_pattern;
}
static uint8_t dc_dp_initialize_scrambling_data_symbols( static uint8_t dc_dp_initialize_scrambling_data_symbols(
struct dc_link *link, struct dc_link *link,
enum dc_dp_training_pattern pattern) enum dc_dp_training_pattern pattern)
...@@ -433,20 +442,30 @@ static bool is_cr_done(enum dc_lane_count ln_count, ...@@ -433,20 +442,30 @@ static bool is_cr_done(enum dc_lane_count ln_count,
} }
static bool is_ch_eq_done(enum dc_lane_count ln_count, static bool is_ch_eq_done(enum dc_lane_count ln_count,
union lane_status *dpcd_lane_status, union lane_status *dpcd_lane_status)
union lane_align_status_updated *lane_status_updated)
{ {
bool done = true;
uint32_t lane; uint32_t lane;
if (!lane_status_updated->bits.INTERLANE_ALIGN_DONE) for (lane = 0; lane < (uint32_t)(ln_count); lane++)
return false; if (!dpcd_lane_status[lane].bits.CHANNEL_EQ_DONE_0)
else { done = false;
for (lane = 0; lane < (uint32_t)(ln_count); lane++) { return done;
if (!dpcd_lane_status[lane].bits.SYMBOL_LOCKED_0 || }
!dpcd_lane_status[lane].bits.CHANNEL_EQ_DONE_0)
return false; static bool is_symbol_locked(enum dc_lane_count ln_count,
} union lane_status *dpcd_lane_status)
} {
return true; bool locked = true;
uint32_t lane;
for (lane = 0; lane < (uint32_t)(ln_count); lane++)
if (!dpcd_lane_status[lane].bits.SYMBOL_LOCKED_0)
locked = false;
return locked;
}
static inline bool is_interlane_aligned(union lane_align_status_updated align_status)
{
return align_status.bits.INTERLANE_ALIGN_DONE == 1;
} }
static void update_drive_settings( static void update_drive_settings(
...@@ -848,10 +867,9 @@ static bool perform_post_lt_adj_req_sequence( ...@@ -848,10 +867,9 @@ static bool perform_post_lt_adj_req_sequence(
if (!is_cr_done(lane_count, dpcd_lane_status)) if (!is_cr_done(lane_count, dpcd_lane_status))
return false; return false;
if (!is_ch_eq_done( if (!is_ch_eq_done(lane_count, dpcd_lane_status) ||
lane_count, !is_symbol_locked(lane_count, dpcd_lane_status) ||
dpcd_lane_status, !is_interlane_aligned(dpcd_lane_status_updated))
&dpcd_lane_status_updated))
return false; return false;
for (lane = 0; lane < (uint32_t)(lane_count); lane++) { for (lane = 0; lane < (uint32_t)(lane_count); lane++) {
...@@ -1005,9 +1023,9 @@ static enum link_training_result perform_channel_equalization_sequence( ...@@ -1005,9 +1023,9 @@ static enum link_training_result perform_channel_equalization_sequence(
return LINK_TRAINING_EQ_FAIL_CR; return LINK_TRAINING_EQ_FAIL_CR;
/* 6. check CHEQ done*/ /* 6. check CHEQ done*/
if (is_ch_eq_done(lane_count, if (is_ch_eq_done(lane_count, dpcd_lane_status) &&
dpcd_lane_status, is_symbol_locked(lane_count, dpcd_lane_status) &&
&dpcd_lane_status_updated)) is_interlane_aligned(dpcd_lane_status_updated))
return LINK_TRAINING_SUCCESS; return LINK_TRAINING_SUCCESS;
/* 7. update VS/PE/PC2 in lt_settings*/ /* 7. update VS/PE/PC2 in lt_settings*/
...@@ -1569,7 +1587,6 @@ enum link_training_result dc_link_dp_perform_link_training( ...@@ -1569,7 +1587,6 @@ enum link_training_result dc_link_dp_perform_link_training(
{ {
enum link_training_result status = LINK_TRAINING_SUCCESS; enum link_training_result status = LINK_TRAINING_SUCCESS;
struct link_training_settings lt_settings; struct link_training_settings lt_settings;
union dpcd_training_pattern dpcd_pattern = { { 0 } };
bool fec_enable; bool fec_enable;
uint8_t repeater_cnt; uint8_t repeater_cnt;
...@@ -1635,8 +1652,7 @@ enum link_training_result dc_link_dp_perform_link_training( ...@@ -1635,8 +1652,7 @@ enum link_training_result dc_link_dp_perform_link_training(
} }
/* 3. set training not in progress*/ /* 3. set training not in progress*/
dpcd_pattern.v1_4.TRAINING_PATTERN_SET = DPCD_TRAINING_PATTERN_VIDEOIDLE; dpcd_set_training_pattern(link, DP_TRAINING_PATTERN_VIDEOIDLE);
dpcd_set_training_pattern(link, dpcd_pattern);
if ((status == LINK_TRAINING_SUCCESS) || !skip_video_pattern) { if ((status == LINK_TRAINING_SUCCESS) || !skip_video_pattern) {
status = perform_link_training_int(link, status = perform_link_training_int(link,
&lt_settings, &lt_settings,
......
...@@ -95,6 +95,7 @@ enum dc_dp_training_pattern { ...@@ -95,6 +95,7 @@ enum dc_dp_training_pattern {
DP_TRAINING_PATTERN_SEQUENCE_2, DP_TRAINING_PATTERN_SEQUENCE_2,
DP_TRAINING_PATTERN_SEQUENCE_3, DP_TRAINING_PATTERN_SEQUENCE_3,
DP_TRAINING_PATTERN_SEQUENCE_4, DP_TRAINING_PATTERN_SEQUENCE_4,
DP_TRAINING_PATTERN_VIDEOIDLE,
}; };
struct dc_link_settings { struct dc_link_settings {
......
...@@ -36,12 +36,6 @@ enum dc_link_fec_state { ...@@ -36,12 +36,6 @@ enum dc_link_fec_state {
dc_link_fec_enabled dc_link_fec_enabled
}; };
enum lttpr_mode {
LTTPR_MODE_NON_LTTPR,
LTTPR_MODE_TRANSPARENT,
LTTPR_MODE_NON_TRANSPARENT,
};
struct dc_link_status { struct dc_link_status {
bool link_active; bool link_active;
struct dpcd_caps *dpcd_caps; struct dpcd_caps *dpcd_caps;
......
...@@ -72,6 +72,12 @@ enum link_training_result { ...@@ -72,6 +72,12 @@ enum link_training_result {
LINK_TRAINING_ABORT, LINK_TRAINING_ABORT,
}; };
enum lttpr_mode {
LTTPR_MODE_NON_LTTPR,
LTTPR_MODE_TRANSPARENT,
LTTPR_MODE_NON_TRANSPARENT,
};
struct link_training_settings { struct link_training_settings {
struct dc_link_settings link_settings; struct dc_link_settings link_settings;
struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX]; struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX];
......
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