]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/pm: Fix mode2 reset ACK handling on aldebaran v2
authorSrinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Tue, 14 Apr 2026 08:40:21 +0000 (14:10 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 17 Apr 2026 18:50:26 +0000 (14:50 -0400)
aldebaran_mode2_reset() sends a mode2 reset message and waits for
an acknowledgment from the SMU.

The current ACK handling is incorrect.

The wait loop runs only when ret is -ETIME. But after a successful
async send, ret is 0. Because of this, the loop is skipped and the
code does not wait for the reset acknowledgment.

Also, the code checks for ret != 1 after calling
smu_msg_wait_response(). However, smu_msg_wait_response() returns
0 on success and negative error codes on failure. So checking
against 1 is wrong.

Return -EOPNOTSUPP when the firmware does not support this reset
message.

Fix this by setting ret to -ETIME before entering the wait loop,
checking for ret != 0 after getting the SMU response, and returning
-EOPNOTSUPP when the firmware does not support the message.

v2:
- Update ACK check to use ret != 0 instead of ret != 1, since
  smu_msg_wait_response() returns 0 on success (Feifei)
- Remove unnecessary handling for ret == 0

Fixes: e42569d02acb ("drm/amd/pm: Modify mode2 msg sequence on aldebaran")
Reported-by: Dan Carpenter <error27@gmail.com>
Cc: Feifei Xu <Feifei.Xu@amd.com>
Cc: Lijo Lazar <lijo.lazar@amd.com>
Cc: Hawking Zhang <Hawking.Zhang@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Reviewed-by: Feifei Xu <Feifei.Xu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c

index dc056f1e4b64fc836173022b62760d024ec3848d..7f386ff0c872d8d2281a451d200763c15323f5b5 100644 (file)
@@ -1846,6 +1846,7 @@ static int aldebaran_mode2_reset(struct smu_context *smu)
                amdgpu_device_load_pci_state(adev->pdev);
 
                dev_dbg(adev->dev, "wait for reset ack\n");
+               ret = -ETIME;
                while (ret == -ETIME && timeout)  {
                        ret = smu_msg_wait_response(ctl, 0);
                        /* Wait a bit more time for getting ACK */
@@ -1855,7 +1856,7 @@ static int aldebaran_mode2_reset(struct smu_context *smu)
                                continue;
                        }
 
-                       if (ret != 1) {
+                       if (ret != 0) {
                                dev_err(adev->dev, "failed to send mode2 message \tparam: 0x%08x response %#x\n",
                                                SMU_RESET_MODE_2, ret);
                                goto out;
@@ -1865,10 +1866,9 @@ static int aldebaran_mode2_reset(struct smu_context *smu)
        } else {
                dev_err(adev->dev, "smu fw 0x%x does not support MSG_GfxDeviceDriverReset MSG\n",
                                smu->smc_fw_version);
+               ret = -EOPNOTSUPP;
        }
 
-       if (ret == 1)
-               ret = 0;
 out:
        mutex_unlock(&ctl->lock);