drm/amd/display: skip error logging when DMUB is inactive from S3
authorSamson Tam <samson.tam@amd.com>
Wed, 6 Dec 2023 02:25:36 +0000 (21:25 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Dec 2023 19:59:01 +0000 (14:59 -0500)
[Why]
On resume from S3, while DMUB is inactive, DMUB queue and execute
calls will not work.  Skip reporting errors in these scenarios

[How]
Add new return code during DMUB queue and execute calls when DMUB
is in S3 state. Skip logging errors in these scenarios

Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
Acked-by: Wayne Lin <wayne.lin@amd.com>
Signed-off-by: Samson Tam <samson.tam@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
drivers/gpu/drm/amd/display/dmub/dmub_srv.h
drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c

index 1a4d615ccdec117b9409e2d2bdee60e7be3b2981..eb6f5640f19ae487a6e30782da9c481053fdeb54 100644 (file)
@@ -140,7 +140,10 @@ bool dc_dmub_srv_cmd_list_queue_execute(struct dc_dmub_srv *dc_dmub_srv,
 
                if (status == DMUB_STATUS_QUEUE_FULL) {
                        /* Execute and wait for queue to become empty again. */
-                       dmub_srv_cmd_execute(dmub);
+                       status = dmub_srv_cmd_execute(dmub);
+                       if (status == DMUB_STATUS_POWER_STATE_D3)
+                               return false;
+
                        dmub_srv_wait_for_idle(dmub, 100000);
 
                        /* Requeue the command. */
@@ -148,16 +151,20 @@ bool dc_dmub_srv_cmd_list_queue_execute(struct dc_dmub_srv *dc_dmub_srv,
                }
 
                if (status != DMUB_STATUS_OK) {
-                       DC_ERROR("Error queueing DMUB command: status=%d\n", status);
-                       dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+                       if (status != DMUB_STATUS_POWER_STATE_D3) {
+                               DC_ERROR("Error queueing DMUB command: status=%d\n", status);
+                               dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+                       }
                        return false;
                }
        }
 
        status = dmub_srv_cmd_execute(dmub);
        if (status != DMUB_STATUS_OK) {
-               DC_ERROR("Error starting DMUB execution: status=%d\n", status);
-               dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+               if (status != DMUB_STATUS_POWER_STATE_D3) {
+                       DC_ERROR("Error starting DMUB execution: status=%d\n", status);
+                       dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+               }
                return false;
        }
 
@@ -218,7 +225,10 @@ bool dc_dmub_srv_cmd_run_list(struct dc_dmub_srv *dc_dmub_srv, unsigned int coun
 
                if (status == DMUB_STATUS_QUEUE_FULL) {
                        /* Execute and wait for queue to become empty again. */
-                       dmub_srv_cmd_execute(dmub);
+                       status = dmub_srv_cmd_execute(dmub);
+                       if (status == DMUB_STATUS_POWER_STATE_D3)
+                               return false;
+
                        dmub_srv_wait_for_idle(dmub, 100000);
 
                        /* Requeue the command. */
@@ -226,16 +236,20 @@ bool dc_dmub_srv_cmd_run_list(struct dc_dmub_srv *dc_dmub_srv, unsigned int coun
                }
 
                if (status != DMUB_STATUS_OK) {
-                       DC_ERROR("Error queueing DMUB command: status=%d\n", status);
-                       dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+                       if (status != DMUB_STATUS_POWER_STATE_D3) {
+                               DC_ERROR("Error queueing DMUB command: status=%d\n", status);
+                               dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+                       }
                        return false;
                }
        }
 
        status = dmub_srv_cmd_execute(dmub);
        if (status != DMUB_STATUS_OK) {
-               DC_ERROR("Error starting DMUB execution: status=%d\n", status);
-               dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+               if (status != DMUB_STATUS_POWER_STATE_D3) {
+                       DC_ERROR("Error starting DMUB execution: status=%d\n", status);
+                       dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+               }
                return false;
        }
 
index d1a4ed6f5916ebe2df689faa7337211e42c2359b..c78c9224ab6060493a454683423c9d2a3b27e9a1 100644 (file)
@@ -86,6 +86,7 @@ enum dmub_status {
        DMUB_STATUS_TIMEOUT,
        DMUB_STATUS_INVALID,
        DMUB_STATUS_HW_FAILURE,
+       DMUB_STATUS_POWER_STATE_D3
 };
 
 /* enum dmub_asic - dmub asic identifier */
index 53ac1c66dd86ef8d1b8376973669e7e35cc2ad3e..9ad738805320deeba210f6c103459617e553768f 100644 (file)
@@ -768,7 +768,7 @@ enum dmub_status dmub_srv_cmd_queue(struct dmub_srv *dmub,
                return DMUB_STATUS_INVALID;
 
        if (dmub->power_state != DMUB_POWER_STATE_D0)
-               return DMUB_STATUS_INVALID;
+               return DMUB_STATUS_POWER_STATE_D3;
 
        if (dmub->inbox1_rb.rptr > dmub->inbox1_rb.capacity ||
            dmub->inbox1_rb.wrpt > dmub->inbox1_rb.capacity) {
@@ -789,7 +789,7 @@ enum dmub_status dmub_srv_cmd_execute(struct dmub_srv *dmub)
                return DMUB_STATUS_INVALID;
 
        if (dmub->power_state != DMUB_POWER_STATE_D0)
-               return DMUB_STATUS_INVALID;
+               return DMUB_STATUS_POWER_STATE_D3;
 
        /**
         * Read back all the queued commands to ensure that they've