platform/x86/amd/pmc: Restore msg_port on amd_stb_s2d_init() error paths

dev->msg_port is switched to MSG_PORT_S2D before issuing the S2D SMU
commands but is only restored to MSG_PORT_PMC on the success path.  The
early "return -EIO" and "return -ENOMEM" leave the port stuck on
MSG_PORT_S2D, so all subsequent SMU communication - including the s2idle
prepare/restore handlers - is directed at the wrong mailbox.

Consolidate the exit path through a single label so the message port is
always restored.

Fixes: 3d7d407dfb ("platform/x86: amd-pmc: Add support for AMD Spill to DRAM STB feature")
Cc: stable@vger.kernel.org
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://patch.msgid.link/20260721181756.143084-2-mario.limonciello@amd.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
Mario Limonciello 2026-07-21 13:17:51 -05:00 committed by Ilpo Järvinen
parent c7acedb2db
commit 9cef693bce
No known key found for this signature in database
GPG Key ID: 59AC4F6153E5CE31

View File

@ -289,7 +289,7 @@ int amd_stb_s2d_init(struct amd_pmc_dev *dev)
u32 phys_addr_low, phys_addr_hi;
u64 stb_phys_addr;
u32 size = 0;
int ret;
int ret = 0;
if (!enable_stb)
return 0;
@ -307,8 +307,10 @@ int amd_stb_s2d_init(struct amd_pmc_dev *dev)
dev->msg_port = MSG_PORT_S2D;
amd_pmc_send_cmd(dev, S2D_TELEMETRY_SIZE, &size, dev->stb_arg.s2d_msg_id, true);
if (size != S2D_TELEMETRY_BYTES_MAX)
return -EIO;
if (size != S2D_TELEMETRY_BYTES_MAX) {
ret = -EIO;
goto out;
}
/* Get DRAM size */
ret = amd_pmc_send_cmd(dev, S2D_DRAM_SIZE, &dev->dram_size, dev->stb_arg.s2d_msg_id, true);
@ -321,12 +323,16 @@ int amd_stb_s2d_init(struct amd_pmc_dev *dev)
stb_phys_addr = ((u64)phys_addr_hi << 32 | phys_addr_low);
/* Clear msg_port for other SMU operation */
dev->msg_port = MSG_PORT_PMC;
dev->stb_virt_addr = devm_ioremap(dev->dev, stb_phys_addr, dev->dram_size);
if (!dev->stb_virt_addr)
return -ENOMEM;
if (!dev->stb_virt_addr) {
ret = -ENOMEM;
goto out;
}
return 0;
ret = 0;
out:
/* Restore the default message port for subsequent SMU operations */
dev->msg_port = MSG_PORT_PMC;
return ret;
}