]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Update DMCUB loading sequence for DCN3.5
authorNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Fri, 9 May 2025 15:18:26 +0000 (11:18 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 3 Jun 2025 19:36:19 +0000 (15:36 -0400)
[Why]
New sequence from HW for reset and firmware reloading has been
provided that aims to stabilize the reload sequence in the case the
firmware is hung or has outstanding requests.

[How]
Update the sequence to remove the DMUIF reset and the redundant
writes in the release.

Reviewed-by: Ovidiu Bunea <ovidiu.bunea@amd.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@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_dcn35.c

index 72a0f078cd1a589f86c512a51082cde31474a391..2884977a3dd2f03f82a71e16ce6ff728b1b1979a 100644 (file)
@@ -92,19 +92,15 @@ void dmub_dcn35_reset(struct dmub_srv *dmub)
        uint32_t in_reset, is_enabled, scratch, i, pwait_mode;
 
        REG_GET(DMCUB_CNTL2, DMCUB_SOFT_RESET, &in_reset);
+       REG_GET(DMCUB_CNTL, DMCUB_ENABLE, &is_enabled);
 
-       if (in_reset == 0) {
+       if (in_reset == 0 && is_enabled != 0) {
                cmd.bits.status = 1;
                cmd.bits.command_code = DMUB_GPINT__STOP_FW;
                cmd.bits.param = 0;
 
                dmub->hw_funcs.set_gpint(dmub, cmd);
 
-               /**
-                * Timeout covers both the ACK and the wait
-                * for remaining work to finish.
-                */
-
                for (i = 0; i < timeout; ++i) {
                        if (dmub->hw_funcs.is_gpint_acked(dmub, cmd))
                                break;
@@ -130,11 +126,9 @@ void dmub_dcn35_reset(struct dmub_srv *dmub)
                /* Force reset in case we timed out, DMCUB is likely hung. */
        }
 
-       REG_GET(DMCUB_CNTL, DMCUB_ENABLE, &is_enabled);
-
        if (is_enabled) {
                REG_UPDATE(DMCUB_CNTL2, DMCUB_SOFT_RESET, 1);
-               REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 1);
+               udelay(1);
                REG_UPDATE(DMCUB_CNTL, DMCUB_ENABLE, 0);
        }
 
@@ -160,11 +154,7 @@ void dmub_dcn35_reset_release(struct dmub_srv *dmub)
                     LONO_SOCCLK_GATE_DISABLE, 1,
                     LONO_DMCUBCLK_GATE_DISABLE, 1);
 
-       REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 1);
-       udelay(1);
        REG_UPDATE_2(DMCUB_CNTL, DMCUB_ENABLE, 1, DMCUB_TRACEPORT_EN, 1);
-       REG_UPDATE(DMCUB_CNTL2, DMCUB_SOFT_RESET, 1);
-       udelay(1);
        REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 0);
        REG_UPDATE(DMCUB_CNTL2, DMCUB_SOFT_RESET, 0);
 }