From: Lu Yao <[email protected]> commit 3a8a05477cda ("drm/amdgpu/pm/powerplay: bounds-check voltage index in SMU7 lookup") and commit 6fa33f594e46 ("drm/amdgpu/pm/powerplay: bounds-check voltage index in Vega10 lookup") added the same block.
Move the pattern into PP_CHECK_VOLTAGE_INDEX(). Signed-off-by: Lu Yao <[email protected]> --- .../drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c | 28 +++++---------- .../drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c | 35 ++++++------------- .../gpu/drm/amd/pm/powerplay/inc/pp_debug.h | 12 +++++++ 3 files changed, 30 insertions(+), 45 deletions(-) diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c index bdf1e489369e..aafb52bf94ff 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c @@ -2216,24 +2216,18 @@ static int smu7_patch_voltage_dependency_tables_with_lookup_table( if (data->vdd_gfx_control == SMU7_VOLTAGE_CONTROL_BY_SVID2) { for (entry_id = 0; entry_id < sclk_table->count; ++entry_id) { voltage_id = sclk_table->entries[entry_id].vddInd; - if (voltage_id >= table_info->vddgfx_lookup_table->count) { - pr_err("amdgpu: sclk[%u] vddgfx index %u out of bounds (%u)\n", - entry_id, voltage_id, - table_info->vddgfx_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddgfx_lookup_table, voltage_id, + "sclk[%u] vddgfx", entry_id)) return -EINVAL; - } sclk_table->entries[entry_id].vddgfx = table_info->vddgfx_lookup_table->entries[voltage_id].us_vdd; } } else { for (entry_id = 0; entry_id < sclk_table->count; ++entry_id) { voltage_id = sclk_table->entries[entry_id].vddInd; - if (voltage_id >= table_info->vddc_lookup_table->count) { - pr_err("amdgpu: sclk[%u] vddc index %u out of bounds (%u)\n", - entry_id, voltage_id, - table_info->vddc_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddc_lookup_table, voltage_id, + "sclk[%u] vddc", entry_id)) return -EINVAL; - } sclk_table->entries[entry_id].vddc = table_info->vddc_lookup_table->entries[voltage_id].us_vdd; } @@ -2241,24 +2235,18 @@ static int smu7_patch_voltage_dependency_tables_with_lookup_table( for (entry_id = 0; entry_id < mclk_table->count; ++entry_id) { voltage_id = mclk_table->entries[entry_id].vddInd; - if (voltage_id >= table_info->vddc_lookup_table->count) { - pr_err("amdgpu: mclk[%u] vddc index %u out of bounds (%u)\n", - entry_id, voltage_id, - table_info->vddc_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddc_lookup_table, voltage_id, + "mclk[%u] vddc", entry_id)) return -EINVAL; - } mclk_table->entries[entry_id].vddc = table_info->vddc_lookup_table->entries[voltage_id].us_vdd; } for (entry_id = 0; entry_id < mm_table->count; ++entry_id) { voltage_id = mm_table->entries[entry_id].vddcInd; - if (voltage_id >= table_info->vddc_lookup_table->count) { - pr_err("amdgpu: mm[%u] vddc index %u out of bounds (%u)\n", - entry_id, voltage_id, - table_info->vddc_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddc_lookup_table, voltage_id, + "mm[%u] vddc", entry_id)) return -EINVAL; - } mm_table->entries[entry_id].vddc = table_info->vddc_lookup_table->entries[voltage_id].us_vdd; } diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c index 05b1e69116fd..96783710afe3 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c @@ -691,12 +691,9 @@ static int vega10_patch_voltage_dependency_tables_with_lookup_table( for (entry_id = 0; entry_id < vdt->count; entry_id++) { voltage_id = vdt->entries[entry_id].vddInd; - if (voltage_id >= table_info->vddc_lookup_table->count) { - pr_err("amdgpu: clk_dep[%u][%u] vddc index %u out of bounds (%u)\n", - i, entry_id, voltage_id, - table_info->vddc_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddc_lookup_table, voltage_id, + "clk_dep[%u][%u] vddc", i, entry_id)) return -EINVAL; - } vdt->entries[entry_id].vddc = table_info->vddc_lookup_table->entries[voltage_id].us_vdd; } @@ -704,44 +701,32 @@ static int vega10_patch_voltage_dependency_tables_with_lookup_table( for (entry_id = 0; entry_id < mm_table->count; ++entry_id) { voltage_id = mm_table->entries[entry_id].vddcInd; - if (voltage_id >= table_info->vddc_lookup_table->count) { - pr_err("amdgpu: mm[%u] vddc index %u out of bounds (%u)\n", - entry_id, voltage_id, - table_info->vddc_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddc_lookup_table, voltage_id, + "mm[%u] vddc", entry_id)) return -EINVAL; - } mm_table->entries[entry_id].vddc = table_info->vddc_lookup_table->entries[voltage_id].us_vdd; } for (entry_id = 0; entry_id < mclk_table->count; ++entry_id) { voltage_id = mclk_table->entries[entry_id].vddInd; - if (voltage_id >= table_info->vddc_lookup_table->count) { - pr_err("amdgpu: mclk[%u] vddc index %u out of bounds (%u)\n", - entry_id, voltage_id, - table_info->vddc_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddc_lookup_table, voltage_id, + "mclk[%u] vddc", entry_id)) return -EINVAL; - } mclk_table->entries[entry_id].vddc = table_info->vddc_lookup_table->entries[voltage_id].us_vdd; voltage_id = mclk_table->entries[entry_id].vddciInd; - if (voltage_id >= table_info->vddci_lookup_table->count) { - pr_err("amdgpu: mclk[%u] vddci index %u out of bounds (%u)\n", - entry_id, voltage_id, - table_info->vddci_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddci_lookup_table, voltage_id, + "mclk[%u] vddci", entry_id)) return -EINVAL; - } mclk_table->entries[entry_id].vddci = table_info->vddci_lookup_table->entries[voltage_id].us_vdd; voltage_id = mclk_table->entries[entry_id].mvddInd; - if (voltage_id >= table_info->vddmem_lookup_table->count) { - pr_err("amdgpu: mclk[%u] vddmem index %u out of bounds (%u)\n", - entry_id, voltage_id, - table_info->vddmem_lookup_table->count); + if (PP_VOLTAGE_INDEX_OOB(table_info->vddmem_lookup_table, voltage_id, + "mclk[%u] vddmem", entry_id)) return -EINVAL; - } mclk_table->entries[entry_id].mvdd = table_info->vddmem_lookup_table->entries[voltage_id].us_vdd; } diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/pp_debug.h b/drivers/gpu/drm/amd/pm/powerplay/inc/pp_debug.h index cea65093b6ad..efe5f6df8c9b 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/inc/pp_debug.h +++ b/drivers/gpu/drm/amd/pm/powerplay/inc/pp_debug.h @@ -54,6 +54,18 @@ pr_debug(fmt, ##__VA_ARGS__); \ } while (0) +/* Reports and returns true when index does not fit into the lookup table. */ +#define PP_VOLTAGE_INDEX_OOB(lookup_table, index, fmt, ...) \ +({ \ + typeof(lookup_table) __lookup = (lookup_table); \ + typeof(index) __idx = (index); \ + bool __oob = __idx >= __lookup->count; \ + \ + if (__oob) \ + pr_err(fmt " index %u out of bounds (%u)\n", \ + ##__VA_ARGS__, __idx, __lookup->count); \ + __oob; \ +}) #define GET_FLEXIBLE_ARRAY_MEMBER_ADDR(type, member, ptr, n) \ (type *)((char *)&(ptr)->member + (sizeof(type) * (n))) -- 2.25.1
