diff --git a/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c --- a/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c +++ b/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c @@ -1807,6 +1807,13 @@ soft_min_level = mask ? (ffs(mask) - 1) : 0; soft_max_level = mask ? (fls(mask) - 1) : 0; + if (soft_min_level >= data->dpm_table.gfx_table.count || + soft_max_level >= data->dpm_table.gfx_table.count) { + pr_err("PP_SCLK mask 0x%08x exceeds dpm levels %d\n", + mask, data->dpm_table.gfx_table.count); + return -EINVAL; + } + data->dpm_table.gfx_table.dpm_state.soft_min_level = data->dpm_table.gfx_table.dpm_levels[soft_min_level].value; data->dpm_table.gfx_table.dpm_state.soft_max_level = @@ -1827,6 +1834,13 @@ soft_min_level = mask ? (ffs(mask) - 1) : 0; soft_max_level = mask ? (fls(mask) - 1) : 0; + if (soft_min_level >= data->dpm_table.mem_table.count || + soft_max_level >= data->dpm_table.mem_table.count) { + pr_err("PP_MCLK mask 0x%08x exceeds dpm levels %d\n", + mask, data->dpm_table.mem_table.count); + return -EINVAL; + } + data->dpm_table.mem_table.dpm_state.soft_min_level = data->dpm_table.mem_table.dpm_levels[soft_min_level].value; data->dpm_table.mem_table.dpm_state.soft_max_level =