drm/amd/display: Modify DCN401 DMUB reset & halt sequence
authorDillon Varone <dillon.varone@amd.com>
Fri, 9 May 2025 15:31:46 +0000 (11:31 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 16 May 2025 17:38:56 +0000 (13:38 -0400)
[WHY&HOW]
If DMCUB is already disabled or reset, no need to send the halt command
again.

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Dillon Varone <dillon.varone@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/dmub/src/dmub_dcn401.c

index 731ca9b6a6cfc74f147052fdc92793f8f8aae759..2575dbc448f70953f449afbceba401f8d86b6487 100644 (file)
@@ -66,24 +66,20 @@ void dmub_dcn401_reset(struct dmub_srv *dmub)
        const uint32_t timeout_us = 1 * 1000 * 1000; //1s
        const uint32_t poll_delay_us = 1; //1us
        uint32_t i = 0;
-       uint32_t in_reset, scratch, pwait_mode;
+       uint32_t enabled, in_reset, scratch, pwait_mode;
 
-       REG_GET(DMCUB_CNTL2, DMCUB_SOFT_RESET, &in_reset);
+       REG_GET(DMCUB_CNTL,
+                       DMCUB_ENABLE, &enabled);
+       REG_GET(DMCUB_CNTL2,
+                       DMCUB_SOFT_RESET, &in_reset);
 
-       if (in_reset == 0) {
+       if (enabled && in_reset == 0) {
                cmd.bits.status = 1;
                cmd.bits.command_code = DMUB_GPINT__STOP_FW;
                cmd.bits.param = 0;
 
                dmub->hw_funcs.set_gpint(dmub, cmd);
 
-               for (i = 0; i < timeout_us; i++) {
-                       if (dmub->hw_funcs.is_gpint_acked(dmub, cmd))
-                               break;
-
-                       udelay(poll_delay_us);
-               }
-
                for (; i < timeout_us; i++) {
                        scratch = dmub->hw_funcs.get_gpint_response(dmub);
                        if (scratch == DMUB_GPINT__STOP_FW_RESPONSE)