drm/amd/display: Add retires when read DPCD
authorJoan Lee <joan.lee@amd.com>
Wed, 15 May 2024 02:23:01 +0000 (10:23 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Jun 2024 15:06:18 +0000 (11:06 -0400)
[why & how]
Sometimes read DPCD return fail while result not retrieved yet. Add
retries mechanism in Replay handle hpd irq to get real result.

Reviewed-by: Jerry Zuo <jerry.zuo@amd.com>
Acked-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Signed-off-by: Joan Lee <joan.lee@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_irq_handler.c

index 659b8064d3618cfce95f0e221e44c8a33ade327a..5f087e930cb6c099f921609b803d2351dce966f7 100644 (file)
@@ -189,16 +189,30 @@ static void handle_hpd_irq_replay_sink(struct dc_link *link)
        union dpcd_replay_configuration replay_configuration = {0};
        /*AMD Replay version reuse DP_PSR_ERROR_STATUS for REPLAY_ERROR status.*/
        union psr_error_status replay_error_status = {0};
+       bool ret = false;
+       int retries = 0;
 
        if (!link->replay_settings.replay_feature_enabled)
                return;
 
-       dm_helpers_dp_read_dpcd(
-               link->ctx,
-               link,
-               DP_SINK_PR_REPLAY_STATUS,
-               &replay_configuration.raw,
-               sizeof(replay_configuration.raw));
+       while (retries < 10) {
+               ret = dm_helpers_dp_read_dpcd(
+                       link->ctx,
+                       link,
+                       DP_SINK_PR_REPLAY_STATUS,
+                       &replay_configuration.raw,
+                       sizeof(replay_configuration.raw));
+
+               if (ret)
+                       break;
+
+               retries++;
+       }
+
+       if (!ret)
+               DC_LOG_WARNING("[%s][%d] DPCD read addr.0x%x failed with %d retries\n",
+                                       __func__, __LINE__,
+                                       DP_SINK_PR_REPLAY_STATUS, retries);
 
        dm_helpers_dp_read_dpcd(
                link->ctx,