Commit 4d1d699f authored by Michael Strauss's avatar Michael Strauss Committed by Alex Deucher

Revert "drm/amd/display: Refactor LTTPR cap retrieval"

This reverts commit 3b90318d.

[WHY]
Regressions unintentionally caused by change,
reverting until this can be resolved.
Reviewed-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarQingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: default avatarMichael Strauss <michael.strauss@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a32cc817
...@@ -5126,13 +5126,16 @@ static bool dpcd_read_sink_ext_caps(struct dc_link *link) ...@@ -5126,13 +5126,16 @@ static bool dpcd_read_sink_ext_caps(struct dc_link *link)
return true; return true;
} }
void dp_retrieve_lttpr_cap(struct dc_link *link) bool dp_retrieve_lttpr_cap(struct dc_link *link)
{ {
uint8_t lttpr_dpcd_data[8];
bool allow_lttpr_non_transparent_mode = 0; bool allow_lttpr_non_transparent_mode = 0;
bool vbios_lttpr_enable = link->dc->caps.vbios_lttpr_enable;
bool vbios_lttpr_interop = link->dc->caps.vbios_lttpr_aware; bool vbios_lttpr_interop = link->dc->caps.vbios_lttpr_aware;
enum dc_status status = DC_ERROR_UNEXPECTED; enum dc_status status = DC_ERROR_UNEXPECTED;
bool is_lttpr_present = false;
memset(link->lttpr_dpcd_data, '\0', sizeof(link->lttpr_dpcd_data)); memset(lttpr_dpcd_data, '\0', sizeof(lttpr_dpcd_data));
if ((link->dc->config.allow_lttpr_non_transparent_mode.bits.DP2_0 && if ((link->dc->config.allow_lttpr_non_transparent_mode.bits.DP2_0 &&
link->dpcd_caps.channel_coding_cap.bits.DP_128b_132b_SUPPORTED)) { link->dpcd_caps.channel_coding_cap.bits.DP_128b_132b_SUPPORTED)) {
...@@ -5142,116 +5145,82 @@ void dp_retrieve_lttpr_cap(struct dc_link *link) ...@@ -5142,116 +5145,82 @@ void dp_retrieve_lttpr_cap(struct dc_link *link)
allow_lttpr_non_transparent_mode = 1; allow_lttpr_non_transparent_mode = 1;
} }
link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
link->lttpr_support = LTTPR_UNSUPPORTED;
/* /*
* Logic to determine LTTPR support * Logic to determine LTTPR mode
*/ */
if (vbios_lttpr_interop) link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
link->lttpr_support = LTTPR_SUPPORTED; if (vbios_lttpr_enable && vbios_lttpr_interop)
else if (link->dc->config.allow_lttpr_non_transparent_mode.raw == 0 link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
|| !link->dc->caps.extended_aux_timeout_support) else if (!vbios_lttpr_enable && vbios_lttpr_interop) {
link->lttpr_support = LTTPR_UNSUPPORTED; if (allow_lttpr_non_transparent_mode)
else link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
link->lttpr_support = LTTPR_CHECK_EXT_SUPPORT; else
link->lttpr_mode = LTTPR_MODE_TRANSPARENT;
} else if (!vbios_lttpr_enable && !vbios_lttpr_interop) {
if (!allow_lttpr_non_transparent_mode || !link->dc->caps.extended_aux_timeout_support)
link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
else
link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
}
#if defined(CONFIG_DRM_AMD_DC_DCN)
/* Check DP tunnel LTTPR mode debug option. */ /* Check DP tunnel LTTPR mode debug option. */
if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA &&
link->dc->debug.dpia_debug.bits.force_non_lttpr) link->dc->debug.dpia_debug.bits.force_non_lttpr)
link->lttpr_support = LTTPR_UNSUPPORTED; link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
#endif
if (link->lttpr_support > LTTPR_UNSUPPORTED) { if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT || link->lttpr_mode == LTTPR_MODE_TRANSPARENT) {
/* By reading LTTPR capability, RX assumes that we will enable /* By reading LTTPR capability, RX assumes that we will enable
* LTTPR extended aux timeout if LTTPR is present. * LTTPR extended aux timeout if LTTPR is present.
*/ */
status = core_link_read_dpcd( status = core_link_read_dpcd(
link, link,
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV, DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV,
link->lttpr_dpcd_data, lttpr_dpcd_data,
sizeof(link->lttpr_dpcd_data)); sizeof(lttpr_dpcd_data));
}
} link->dpcd_caps.lttpr_caps.revision.raw =
lttpr_dpcd_data[DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV -
bool dp_parse_lttpr_mode(struct dc_link *link) DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
{
bool dpcd_allow_lttpr_non_transparent_mode = false; link->dpcd_caps.lttpr_caps.max_link_rate =
bool is_lttpr_present = false; lttpr_dpcd_data[DP_MAX_LINK_RATE_PHY_REPEATER -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
bool vbios_lttpr_enable = link->dc->caps.vbios_lttpr_enable;
link->dpcd_caps.lttpr_caps.phy_repeater_cnt =
if ((link->dc->config.allow_lttpr_non_transparent_mode.bits.DP2_0 && lttpr_dpcd_data[DP_PHY_REPEATER_CNT -
link->dpcd_caps.channel_coding_cap.bits.DP_128b_132b_SUPPORTED)) { DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
dpcd_allow_lttpr_non_transparent_mode = true;
} else if (link->dc->config.allow_lttpr_non_transparent_mode.bits.DP1_4A && link->dpcd_caps.lttpr_caps.max_lane_count =
!link->dpcd_caps.channel_coding_cap.bits.DP_128b_132b_SUPPORTED) { lttpr_dpcd_data[DP_MAX_LANE_COUNT_PHY_REPEATER -
dpcd_allow_lttpr_non_transparent_mode = true; DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.mode =
lttpr_dpcd_data[DP_PHY_REPEATER_MODE -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.max_ext_timeout =
lttpr_dpcd_data[DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.main_link_channel_coding.raw =
lttpr_dpcd_data[DP_MAIN_LINK_CHANNEL_CODING_PHY_REPEATER -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.supported_128b_132b_rates.raw =
lttpr_dpcd_data[DP_PHY_REPEATER_128B132B_RATES -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
/* Attempt to train in LTTPR transparent mode if repeater count exceeds 8. */
is_lttpr_present = (link->dpcd_caps.lttpr_caps.max_lane_count > 0 &&
link->dpcd_caps.lttpr_caps.max_lane_count <= 4 &&
link->dpcd_caps.lttpr_caps.revision.raw >= 0x14);
if (is_lttpr_present) {
CONN_DATA_DETECT(link, lttpr_dpcd_data, sizeof(lttpr_dpcd_data), "LTTPR Caps: ");
configure_lttpr_mode_transparent(link);
} else
link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
} }
/*
* Logic to determine LTTPR mode
*/
if (link->lttpr_support == LTTPR_SUPPORTED)
if (vbios_lttpr_enable)
link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
else if (dpcd_allow_lttpr_non_transparent_mode)
link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
else
link->lttpr_mode = LTTPR_MODE_TRANSPARENT;
else // lttpr_support == LTTPR_CHECK_EXT_SUPPORT
if (dpcd_allow_lttpr_non_transparent_mode) {
link->lttpr_support = LTTPR_SUPPORTED;
link->lttpr_mode = LTTPR_MODE_NON_TRANSPARENT;
} else {
link->lttpr_support = LTTPR_UNSUPPORTED;
}
if (link->lttpr_support == LTTPR_UNSUPPORTED)
return false;
link->dpcd_caps.lttpr_caps.revision.raw =
link->lttpr_dpcd_data[DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.max_link_rate =
link->lttpr_dpcd_data[DP_MAX_LINK_RATE_PHY_REPEATER -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.phy_repeater_cnt =
link->lttpr_dpcd_data[DP_PHY_REPEATER_CNT -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.max_lane_count =
link->lttpr_dpcd_data[DP_MAX_LANE_COUNT_PHY_REPEATER -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.mode =
link->lttpr_dpcd_data[DP_PHY_REPEATER_MODE -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.max_ext_timeout =
link->lttpr_dpcd_data[DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.main_link_channel_coding.raw =
link->lttpr_dpcd_data[DP_MAIN_LINK_CHANNEL_CODING_PHY_REPEATER -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
link->dpcd_caps.lttpr_caps.supported_128b_132b_rates.raw =
link->lttpr_dpcd_data[DP_PHY_REPEATER_128B132B_RATES -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
/* Attempt to train in LTTPR transparent mode if repeater count exceeds 8. */
is_lttpr_present = (link->dpcd_caps.lttpr_caps.max_lane_count > 0 &&
link->dpcd_caps.lttpr_caps.max_lane_count <= 4 &&
link->dpcd_caps.lttpr_caps.revision.raw >= 0x14);
if (is_lttpr_present) {
CONN_DATA_DETECT(link, link->lttpr_dpcd_data, sizeof(link->lttpr_dpcd_data), "LTTPR Caps: ");
configure_lttpr_mode_transparent(link);
} else
link->lttpr_mode = LTTPR_MODE_NON_LTTPR;
return is_lttpr_present; return is_lttpr_present;
} }
...@@ -5403,8 +5372,7 @@ static bool retrieve_link_cap(struct dc_link *link) ...@@ -5403,8 +5372,7 @@ static bool retrieve_link_cap(struct dc_link *link)
status = wa_try_to_wake_dprx(link, timeout_ms); status = wa_try_to_wake_dprx(link, timeout_ms);
} }
dp_retrieve_lttpr_cap(link); is_lttpr_present = dp_retrieve_lttpr_cap(link);
/* Read DP tunneling information. */ /* Read DP tunneling information. */
status = dpcd_get_tunneling_device_data(link); status = dpcd_get_tunneling_device_data(link);
...@@ -5440,9 +5408,6 @@ static bool retrieve_link_cap(struct dc_link *link) ...@@ -5440,9 +5408,6 @@ static bool retrieve_link_cap(struct dc_link *link)
return false; return false;
} }
if (link->lttpr_support > LTTPR_UNSUPPORTED)
is_lttpr_present = dp_parse_lttpr_mode(link);
if (!is_lttpr_present) if (!is_lttpr_present)
dc_link_aux_try_to_configure_timeout(link->ddc, LINK_AUX_DEFAULT_TIMEOUT_PERIOD); dc_link_aux_try_to_configure_timeout(link->ddc, LINK_AUX_DEFAULT_TIMEOUT_PERIOD);
......
...@@ -129,8 +129,6 @@ struct dc_link { ...@@ -129,8 +129,6 @@ struct dc_link {
bool link_state_valid; bool link_state_valid;
bool aux_access_disabled; bool aux_access_disabled;
bool sync_lt_in_progress; bool sync_lt_in_progress;
uint8_t lttpr_dpcd_data[8];
enum lttpr_support lttpr_support;
enum lttpr_mode lttpr_mode; enum lttpr_mode lttpr_mode;
bool is_internal_display; bool is_internal_display;
......
...@@ -217,8 +217,7 @@ void disable_dp_hpo_output(struct dc_link *link, ...@@ -217,8 +217,7 @@ void disable_dp_hpo_output(struct dc_link *link,
void setup_dp_hpo_stream(struct pipe_ctx *pipe_ctx, bool enable); void setup_dp_hpo_stream(struct pipe_ctx *pipe_ctx, bool enable);
bool is_dp_128b_132b_signal(struct pipe_ctx *pipe_ctx); bool is_dp_128b_132b_signal(struct pipe_ctx *pipe_ctx);
void dp_retrieve_lttpr_cap(struct dc_link *link); bool dp_retrieve_lttpr_cap(struct dc_link *link);
bool dp_apply_lttpr_mode(struct dc_link *link);
void edp_panel_backlight_power_on(struct dc_link *link); void edp_panel_backlight_power_on(struct dc_link *link);
void dp_receiver_power_ctrl(struct dc_link *link, bool on); void dp_receiver_power_ctrl(struct dc_link *link, bool on);
void dp_source_sequence_trace(struct dc_link *link, uint8_t dp_test_mode); void dp_source_sequence_trace(struct dc_link *link, uint8_t dp_test_mode);
......
...@@ -80,12 +80,6 @@ enum link_training_result { ...@@ -80,12 +80,6 @@ enum link_training_result {
DP_128b_132b_CDS_DONE_TIMEOUT, DP_128b_132b_CDS_DONE_TIMEOUT,
}; };
enum lttpr_support {
LTTPR_UNSUPPORTED,
LTTPR_CHECK_EXT_SUPPORT,
LTTPR_SUPPORTED,
};
enum lttpr_mode { enum lttpr_mode {
LTTPR_MODE_NON_LTTPR, LTTPR_MODE_NON_LTTPR,
LTTPR_MODE_TRANSPARENT, LTTPR_MODE_TRANSPARENT,
......
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