[PATCH] platform/x86/amd/pmf: check slider data reads

From: Kang Chen

Date: Tue Nov 03 2026 - 07:13:43 EST


amd_pmf_load_apts_defaults_sps_v2() ignores the return value of
apts_get_static_slider_granular_v2() and copies fields from an
uninitialized stack buffer when the APTS call fails.
amd_pmf_load_defaults_sps_v2() has the same problem with
apmf_get_static_slider_granular_v2(), and
amd_pmf_load_defaults_sps() has it with
apmf_get_static_slider_granular() on the v1 interface. The APTS and
SPS buffers come from firmware, and the helpers are allowed to reject
malformed buffers, so a failure would copy uninitialized stack data
into the cached defaults.

Skip failed APTS entries, as the destination is zeroed before the loop,
and leave the SPS defaults zeroed when the read fails on both
interfaces.

Fixes: 3eecb434d7f2 ("platform/x86/amd/pmf: Add support to get sps default APTS index values")
Fixes: 48d38f569261 ("platform/x86/amd/pmf: Add support to get APTS index numbers for static slider")
Signed-off-by: Kang Chen <k.chen@xxxxxxxxxxxxxxxx>
---
drivers/platform/x86/amd/pmf/sps.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/platform/x86/amd/pmf/sps.c b/drivers/platform/x86/amd/pmf/sps.c
index b0031afae33b..fffd24ca589b 100644
--- a/drivers/platform/x86/amd/pmf/sps.c
+++ b/drivers/platform/x86/amd/pmf/sps.c
@@ -132,7 +132,9 @@ static void amd_pmf_load_apts_defaults_sps_v2(struct amd_pmf_dev *pdev)
ps = apts_config_store.val;

for (i = 0; i < APTS_MAX_STATES; i++) {
- apts_get_static_slider_granular_v2(pdev, &output, i);
+ if (apts_get_static_slider_granular_v2(pdev, &output, i))
+ continue;
+
ps[i].table_version = output.val.table_version;
ps[i].fan_table_idx = output.val.fan_table_idx;
ps[i].pmf_ppt = output.val.pmf_ppt;
@@ -151,7 +153,8 @@ static void amd_pmf_load_defaults_sps_v2(struct amd_pmf_dev *dev)
unsigned int i, j;

memset(&config_store_v2, 0, sizeof(config_store_v2));
- apmf_get_static_slider_granular_v2(dev, &output);
+ if (apmf_get_static_slider_granular_v2(dev, &output))
+ return;

config_store_v2.size = output.size;

@@ -169,7 +172,8 @@ static void amd_pmf_load_defaults_sps(struct amd_pmf_dev *dev)
int i, j, idx = 0;

memset(&config_store, 0, sizeof(config_store));
- apmf_get_static_slider_granular(dev, &output);
+ if (apmf_get_static_slider_granular(dev, &output))
+ return;

for (i = 0; i < POWER_SOURCE_MAX; i++) {
for (j = 0; j < POWER_MODE_MAX; j++) {
--
2.34.1