]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/display: Increase AUX Intra-Hop Done Max Wait Duration
authorMichael Strauss <michael.strauss@amd.com>
Wed, 19 Mar 2025 22:04:01 +0000 (18:04 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 28 Jul 2025 20:40:31 +0000 (16:40 -0400)
[WHY]
In the worst case, AUX intra-hop done can take hundreds of milliseconds as
each retimer in a link might have to wait a full AUX_RD_INTERVAL to send
LT abort downstream.

[HOW]
Wait 300ms for each retimer in a link to allow time to propagate a LT abort
without infinitely waiting on intra-hop done.
For no-retimer case, keep the max duration at 10ms.

Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Michael Strauss <michael.strauss@amd.com>
Signed-off-by: Ivan Lipski <ivan.lipski@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/link/protocols/link_dp_training.c

index 2dc1a660e50450e5fb717608fe32610a8d6ff720..134093ce5a8e83fd63e927933d8d9fc33a7df1d6 100644 (file)
@@ -1018,7 +1018,12 @@ static enum link_training_result dpcd_exit_training_mode(struct dc_link *link, e
 {
        enum dc_status status;
        uint8_t sink_status = 0;
-       uint8_t i;
+       uint32_t i;
+       uint8_t lttpr_count = dp_parse_lttpr_repeater_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt);
+       uint32_t intra_hop_disable_time_ms = (lttpr_count > 0 ? lttpr_count * 300 : 10);
+
+       // Each hop could theoretically take over 256ms (max 128b/132b AUX RD INTERVAL)
+       // To be safe, allow 300ms per LTTPR and 10ms for no LTTPR case
 
        /* clear training pattern set */
        status = dpcd_set_training_pattern(link, DP_TRAINING_PATTERN_VIDEOIDLE);
@@ -1028,7 +1033,7 @@ static enum link_training_result dpcd_exit_training_mode(struct dc_link *link, e
 
        if (encoding == DP_128b_132b_ENCODING) {
                /* poll for intra-hop disable */
-               for (i = 0; i < 10; i++) {
+               for (i = 0; i < intra_hop_disable_time_ms; 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;