Skip to content

Commit

Permalink
drm/amd/display: Adjust DP 8b10b LT exit behavior
Browse files Browse the repository at this point in the history
[Why]
Polling SINK_STATUS DPCD can cause some non-DP2.0 LTTPR hubs to hang and
no longer respond to AUX.

[How]
As a workaround for the problem hubs, and also to more closely match
DP spec 8b10b behavior, don't poll for intra-hop AUX reply indication
on 8b10b-encoded links.

Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Ilya Bakoulin <Ilya.Bakoulin@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
  • Loading branch information
Ilya Bakoulin authored and Hongkun Zhang committed Nov 29, 2022
1 parent b9bc498 commit 9e27d50
Showing 1 changed file with 11 additions and 9 deletions.
20 changes: 11 additions & 9 deletions drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1915,20 +1915,22 @@ enum dc_status dpcd_configure_lttpr_mode(struct dc_link *link, struct link_train
return status;
}

static void dpcd_exit_training_mode(struct dc_link *link)
static void dpcd_exit_training_mode(struct dc_link *link, enum dp_link_encoding encoding)
{
uint8_t sink_status = 0;
uint8_t i;

/* clear training pattern set */
dpcd_set_training_pattern(link, DP_TRAINING_PATTERN_VIDEOIDLE);

/* poll for intra-hop disable */
for (i = 0; i < 10; i++) {
if ((core_link_read_dpcd(link, DP_SINK_STATUS, &sink_status, 1) == DC_OK) &&
(sink_status & DP_INTRA_HOP_AUX_REPLY_INDICATION) == 0)
break;
udelay(1000);
if (encoding == DP_128b_132b_ENCODING) {
/* poll for intra-hop disable */
for (i = 0; i < 10; i++) {
if ((core_link_read_dpcd(link, DP_SINK_STATUS, &sink_status, 1) == DC_OK) &&
(sink_status & DP_INTRA_HOP_AUX_REPLY_INDICATION) == 0)
break;
udelay(1000);
}
}
}

Expand Down Expand Up @@ -2652,7 +2654,7 @@ enum link_training_result dc_link_dp_perform_link_training(
&lt_settings);

/* reset previous training states */
dpcd_exit_training_mode(link);
dpcd_exit_training_mode(link, encoding);

/* configure link prior to entering training mode */
dpcd_configure_lttpr_mode(link, &lt_settings);
Expand All @@ -2675,7 +2677,7 @@ enum link_training_result dc_link_dp_perform_link_training(
ASSERT(0);

/* exit training mode */
dpcd_exit_training_mode(link);
dpcd_exit_training_mode(link, encoding);

/* switch to video idle */
if ((status == LINK_TRAINING_SUCCESS) || !skip_video_pattern)
Expand Down

0 comments on commit 9e27d50

Please sign in to comment.