mirror of
https://github.com/torvalds/linux.git
synced 2026-09-27 19:42:03 +02:00
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:
parent
c7acedb2db
commit
9cef693bce
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user