drm/amd/pm: fixes a random hang in S4 for SMU v13.0.4/11
authorjsg <jsg@openbsd.org>
Thu, 18 Apr 2024 00:52:17 +0000 (00:52 +0000)
committerjsg <jsg@openbsd.org>
Thu, 18 Apr 2024 00:52:17 +0000 (00:52 +0000)
From Tim Huang
1e3b8874d55c0c28378beb9007494a7a9269a5f5 in linux-6.6.y/6.6.28
31729e8c21ecfd671458e02b6511eb68c2225113 in mainline linux

sys/dev/pci/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c

index 626591f..1d1917e 100644 (file)
@@ -226,8 +226,18 @@ 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_s0ix)
+       if (!en && !adev->in_s0ix) {
+               /* 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);
+       }
 
        return ret;
 }