DF-3686 / fix.diff
--- a/sys/dev/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/sys/dev/drm/amd/powerplay/hwmgr/smu7_hwmgr.c @@ -944,13 +944,18 @@ static int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr) { struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); + int result; smu7_reset_dpm_tables(hwmgr); if (hwmgr->pp_table_version == PP_TABLE_V1) - smu7_setup_dpm_tables_v1(hwmgr); + result = smu7_setup_dpm_tables_v1(hwmgr); else if (hwmgr->pp_table_version == PP_TABLE_V0) - smu7_setup_dpm_tables_v0(hwmgr); + result = smu7_setup_dpm_tables_v0(hwmgr); + else + result = 0; + if (result) + return result; smu7_setup_default_pcie_table(hwmgr); @@ -2734,7 +2739,9 @@ int32_t tmp_sclk; int32_t count; - if (golden_dpm_table->mclk_table.count < 1) + if (golden_dpm_table->mclk_table.count < 1 || + golden_dpm_table->sclk_table.count < 1 || + golden_dpm_table->pcie_speed_table.count < 1) return -EINVAL; percentage = 100 * golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count - 1].value / @@ -3591,7 +3598,8 @@ } if (i >= sclk_table->count) { - if (sclk > sclk_table->dpm_levels[i-1].value) { + if (sclk_table->count > 0 && + sclk > sclk_table->dpm_levels[i-1].value) { data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_SCLK; sclk_table->dpm_levels[i-1].value = sclk; } @@ -3611,7 +3619,8 @@ } if (i >= mclk_table->count) { - if (mclk > mclk_table->dpm_levels[i-1].value) { + if (mclk_table->count > 0 && + mclk > mclk_table->dpm_levels[i-1].value) { data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_MCLK; mclk_table->dpm_levels[i-1].value = mclk; } @@ -4531,8 +4540,14 @@ struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table); struct smu7_single_dpm_table *golden_sclk_table = &(data->golden_dpm_table.sclk_table); - int value = sclk_table->dpm_levels[sclk_table->count - 1].value; - int golden_value = golden_sclk_table->dpm_levels + int value, golden_value; + + if (!sclk_table->count || !golden_sclk_table->count || + !golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) + return -EINVAL; + + value = sclk_table->dpm_levels[sclk_table->count - 1].value; + golden_value = golden_sclk_table->dpm_levels [golden_sclk_table->count - 1].value; value -= golden_value; @@ -4573,8 +4588,14 @@ struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table); struct smu7_single_dpm_table *golden_mclk_table = &(data->golden_dpm_table.mclk_table); - int value = mclk_table->dpm_levels[mclk_table->count - 1].value; - int golden_value = golden_mclk_table->dpm_levels + int value, golden_value; + + if (!mclk_table->count || !golden_mclk_table->count || + !golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value) + return -EINVAL; + + value = mclk_table->dpm_levels[mclk_table->count - 1].value; + golden_value = golden_mclk_table->dpm_levels [golden_mclk_table->count - 1].value; value -= golden_value; |