drm/amd/pm: send unload command to smu during modprobe -r amdgpu
authorKenneth Feng <kenneth.feng@amd.com>
Thu, 22 Jan 2026 10:04:01 +0000 (18:04 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 12 Feb 2026 20:20:07 +0000 (15:20 -0500)
Send unload command to smu during modprobe -r amdgpu for smu 13/14.
1. This can fix the high voltage/temperatue issue after driver is unloaded.
2. Reloading driver could fail but with the debug port based mode1 reset
during driver is reloaded, it is good and safe.

Signed-off-by: Kenneth Feng <kenneth.feng@amd.com>
Reviewed-by: Yang Wang <kevinyang.wang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c

index 9758221..0a0109b 100644 (file)
@@ -4652,9 +4652,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
                        dev_info(adev->dev, "Pending hive reset.\n");
                        amdgpu_set_init_level(adev,
                                              AMDGPU_INIT_LEVEL_MINIMAL_XGMI);
-               } else if (amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 10) &&
-                                  !amdgpu_device_has_display_hardware(adev)) {
-                                       r = psp_gpu_reset(adev);
                } else {
                                tmp = amdgpu_reset_method;
                                /* It should do a default reset when loading or reloading the driver,
index 9f52b7b..18ece5c 100644 (file)
@@ -810,7 +810,7 @@ static int smu_early_init(struct amdgpu_ip_block *ip_block)
        smu->adev = adev;
        smu->pm_enabled = !!amdgpu_dpm;
        smu->is_apu = false;
-       smu->smu_baco.state = SMU_BACO_STATE_NONE;
+       smu->smu_baco.state = SMU_BACO_STATE_EXIT;
        smu->smu_baco.platform_support = false;
        smu->smu_baco.maco_support = false;
        smu->user_dpm_profile.fan_mode = -1;
@@ -2120,9 +2120,8 @@ static int smu_reset_mp1_state(struct smu_context *smu)
        int ret = 0;
 
        if ((!adev->in_runpm) && (!adev->in_suspend) &&
-               (!amdgpu_in_reset(adev)) && amdgpu_ip_version(adev, MP1_HWIP, 0) ==
-                                                                       IP_VERSION(13, 0, 10) &&
-               !amdgpu_device_has_display_hardware(adev))
+               (!amdgpu_in_reset(adev)) && !smu->is_apu &&
+                       amdgpu_ip_version(adev, MP1_HWIP, 0) >= IP_VERSION(13, 0, 0))
                ret = smu_set_mp1_state(smu, PP_MP1_STATE_UNLOAD);
 
        return ret;
index 512493a..a6303d0 100644 (file)
@@ -536,7 +536,6 @@ enum smu_reset_mode {
 enum smu_baco_state {
        SMU_BACO_STATE_ENTER = 0,
        SMU_BACO_STATE_EXIT,
-       SMU_BACO_STATE_NONE,
 };
 
 struct smu_baco_context {
index 784a1af..468d51f 100644 (file)
@@ -2768,13 +2768,7 @@ static int smu_v13_0_0_set_mp1_state(struct smu_context *smu,
 
        switch (mp1_state) {
        case PP_MP1_STATE_UNLOAD:
-               ret = smu_cmn_send_smc_msg_with_param(smu,
-                                                                                         SMU_MSG_PrepareMp1ForUnload,
-                                                                                         0x55, NULL);
-
-               if (!ret && smu->smu_baco.state == SMU_BACO_STATE_EXIT)
-                       ret = smu_v13_0_disable_pmfw_state(smu);
-
+               ret = smu_cmn_set_mp1_state(smu, mp1_state);
                break;
        default:
                /* Ignore others */