drm/amd/display: Add GPINT retries to ips_query_residency_info
authorOvidiu Bunea <Ovidiu.Bunea@amd.com>
Thu, 8 May 2025 21:41:37 +0000 (17:41 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 16 May 2025 17:38:59 +0000 (13:38 -0400)
[why & how]
GPINTs can timeout without returning any data. Since this path is
only for testing purposes, it should retry several times to ensure
data is collected.

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Ovidiu Bunea <Ovidiu.Bunea@amd.com>
Signed-off-by: Tom Chung <chiahsuan.chung@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/dc_dmub_srv.c

index 1c6e71eaea3c3bbed8eeb5eced84553cd82b2e51..afbcf866520e0232f8ddd4ed7a71c05cc0ab1f51 100644 (file)
@@ -39,6 +39,7 @@
 
 #define CTX dc_dmub_srv->ctx
 #define DC_LOGGER CTX->logger
+#define GPINT_RETRY_NUM 20
 
 static void dc_dmub_srv_construct(struct dc_dmub_srv *dc_srv, struct dc *dc,
                                  struct dmub_srv *dmub)
@@ -1888,11 +1889,14 @@ void dc_dmub_srv_ips_query_residency_info(struct dc_dmub_srv *dc_dmub_srv, struc
        if (command_code == DMUB_GPINT__INVALID_COMMAND)
                return;
 
-       // send gpint commands and wait for ack
-       if (!dc_wake_and_execute_gpint(dc_dmub_srv->ctx, DMUB_GPINT__GET_IPS_RESIDENCY_PERCENT,
-                                     (uint16_t)(output->ips_mode),
-                                      &output->residency_percent, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
-               output->residency_percent = 0;
+       for (i = 0; i < GPINT_RETRY_NUM; i++) {
+               // false could mean GPINT timeout, in which case we should retry
+               if (dc_wake_and_execute_gpint(dc_dmub_srv->ctx, DMUB_GPINT__GET_IPS_RESIDENCY_PERCENT,
+                                             (uint16_t)(output->ips_mode), &output->residency_percent,
+                                             DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
+                       break;
+               udelay(100);
+       }
 
        if (!dc_wake_and_execute_gpint(dc_dmub_srv->ctx, DMUB_GPINT__GET_IPS_RESIDENCY_ENTRY_COUNTER,
                                      (uint16_t)(output->ips_mode),