]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/pm: apply SMU 13.0.10 workaround during MP1 unload
authorYang Wang <kevinyang.wang@amd.com>
Thu, 21 May 2026 14:36:37 +0000 (22:36 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 3 Jun 2026 18:50:40 +0000 (14:50 -0400)
On SMU v13.0.10, sending PrepareMp1ForUnload with the default
parameter may leave the device in an inaccessible state. This can
affect runtime power management and partial PnP flows.
e.g: kexec, driver unload, boco/d3cold.

Pass the required workaround parameter 0x55, when preparing MP1 for
unload on SMU v13.0.10, keep the existing behavior for other SMU
versions.

Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5133
Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 4e8ee1afeedb8d24dd22cdd5ae9f98a6d76ebe4b)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c

index 0a7f5fa3c1d319f9f106e941d424265576afff28..fa861ec4d7003ece6452110c238cd06384cd30b7 100644 (file)
@@ -2801,11 +2801,19 @@ static void smu_v13_0_0_i2c_control_fini(struct smu_context *smu)
 static int smu_v13_0_0_set_mp1_state(struct smu_context *smu,
                                     enum pp_mp1_state mp1_state)
 {
+       uint32_t param;
        int ret;
 
        switch (mp1_state) {
        case PP_MP1_STATE_UNLOAD:
-               ret = smu_cmn_set_mp1_state(smu, mp1_state);
+               /*
+                * NOTE: Param 0x55 comes from PMFW 80.31.0, ignored in older versions.
+                * No PMFW version check required.
+                */
+               param = amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 10) ?
+                       0x55 : 0x00;
+               ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_PrepareMp1ForUnload,
+                                                     param, NULL);
                break;
        default:
                /* Ignore others */