drm/amd/display: Adjust DP 8b10b LT exit behavior
authorIlya Bakoulin <Ilya.Bakoulin@amd.com>
Wed, 2 Nov 2022 19:56:16 +0000 (15:56 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Nov 2022 18:35:15 +0000 (13:35 -0500)
[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>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c

index b772d7f2301cf829bbfa44617f5a7951999d61d6..dedd1246ce5884af51ac87307c65b5fe171cee43 100644 (file)
@@ -1912,7 +1912,7 @@ 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;
@@ -1920,12 +1920,14 @@ static void dpcd_exit_training_mode(struct dc_link *link)
        /* 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);
+               }
        }
 }
 
@@ -2649,7 +2651,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);
@@ -2670,7 +2672,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)