]> git.hungrycats.org Git - linux/commitdiff
drm/amd/pm: Use uploaded size for legacy custom PPTable
authorYang Wang <kevinyang.wang@amd.com>
Tue, 23 Jun 2026 03:36:20 +0000 (11:36 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 1 Jul 2026 15:23:43 +0000 (11:23 -0400)
The legacy powerplay path used to allocate hardcode_pp_table from
the original VBIOS PPTable size, copy only the uploaded bytes into it,
and keep soft_pp_table_size unchanged. If a custom PPTable is shorter
than the original table, later code can still treat the stale tail as
valid table data.

Treat the uploaded buffer as the complete custom PPTable: duplicate the
uploaded buffer directly, replace hardcode_pp_table atomically, and set
soft_pp_table_size to the uploaded size.

Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c

index 6f5c27bdc1e91234fa915a591c480ac5311fb355..7c70e228a5bae9ade48731a1681c4503bf21c1ec 100644 (file)
@@ -660,25 +660,20 @@ static int amd_powerplay_reset(void *handle)
 static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)
 {
        struct pp_hwmgr *hwmgr = handle;
+       void *hardcode_pp_table;
        int ret = -ENOMEM;
 
-       if (!hwmgr || !hwmgr->pm_en)
-               return -EINVAL;
-
-       if (size > hwmgr->soft_pp_table_size)
+       if (!hwmgr || !hwmgr->pm_en || !buf || !size || size > U32_MAX)
                return -EINVAL;
 
-       if (!hwmgr->hardcode_pp_table) {
-               hwmgr->hardcode_pp_table = kmemdup(hwmgr->soft_pp_table,
-                                                  hwmgr->soft_pp_table_size,
-                                                  GFP_KERNEL);
-               if (!hwmgr->hardcode_pp_table)
-                       return ret;
-       }
-
-       memcpy(hwmgr->hardcode_pp_table, buf, size);
+       hardcode_pp_table = kmemdup(buf, size, GFP_KERNEL);
+       if (!hardcode_pp_table)
+               return ret;
 
+       kfree(hwmgr->hardcode_pp_table);
+       hwmgr->hardcode_pp_table = hardcode_pp_table;
        hwmgr->soft_pp_table = hwmgr->hardcode_pp_table;
+       hwmgr->soft_pp_table_size = size;
 
        ret = amd_powerplay_reset(handle);
        if (ret)