]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amd: Fix shutdown (again) on some SMU v13.0.4/11 platforms
authorMario Limonciello <mario.limonciello@amd.com>
Sun, 26 May 2024 12:59:08 +0000 (07:59 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Jun 2024 17:41:56 +0000 (13:41 -0400)
commit cd94d1b182d2 ("dm/amd/pm: Fix problems with reboot/shutdown for
some SMU 13.0.4/13.0.11 users") attempted to fix shutdown issues
that were reported since commit 31729e8c21ec ("drm/amd/pm: fixes a
random hang in S4 for SMU v13.0.4/11") but caused issues for some
people.

Adjust the workaround flow to properly only apply in the S4 case:
-> For shutdown go through SMU_MSG_PrepareMp1ForUnload
-> For S4 go through SMU_MSG_GfxDeviceDriverReset and
   SMU_MSG_PrepareMp1ForUnload

Reported-and-tested-by: lectrode <electrodexsnet@gmail.com>
Closes: https://github.com/void-linux/void-packages/issues/50417
Cc: stable@vger.kernel.org
Fixes: cd94d1b182d2 ("dm/amd/pm: Fix problems with reboot/shutdown for some SMU 13.0.4/13.0.11 users")
Reviewed-by: Tim Huang <Tim.Huang@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c

index bc241b593db1555444c51e5b8c5d6a12f697a8c9..b6257f34a7c657ba43c012184fa6f09eeb0d7897 100644 (file)
@@ -226,15 +226,17 @@ static int smu_v13_0_4_system_features_control(struct smu_context *smu, bool en)
        struct amdgpu_device *adev = smu->adev;
        int ret = 0;
 
-       if (!en && adev->in_s4) {
-               /* Adds a GFX reset as workaround just before sending the
-                * MP1_UNLOAD message to prevent GC/RLC/PMFW from entering
-                * an invalid state.
-                */
-               ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GfxDeviceDriverReset,
-                                                     SMU_RESET_MODE_2, NULL);
-               if (ret)
-                       return ret;
+       if (!en && !adev->in_s0ix) {
+               if (adev->in_s4) {
+                       /* Adds a GFX reset as workaround just before sending the
+                        * MP1_UNLOAD message to prevent GC/RLC/PMFW from entering
+                        * an invalid state.
+                        */
+                       ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GfxDeviceDriverReset,
+                                                             SMU_RESET_MODE_2, NULL);
+                       if (ret)
+                               return ret;
+               }
 
                ret = smu_cmn_send_smc_msg(smu, SMU_MSG_PrepareMp1ForUnload, NULL);
        }