DF-3703 / fix.diff
--- a/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c @@ -307,8 +307,12 @@ static int vega10_odn_initial_default_set od_lookup_table = &odn_table->vddc_lookup_table; vddc_lookup_table = table_info->vddc_lookup_table; - for (i = 0; i < vddc_lookup_table->count; i++) + od_lookup_table->count = vddc_lookup_table->count > + MAX_REGULAR_DPM_NUMBER ? + MAX_REGULAR_DPM_NUMBER : vddc_lookup_table->count; + + for (i = 0; i < od_lookup_table->count; i++) od_lookup_table->entries[i].us_vdd = vddc_lookup_table->entries[i].us_vdd; - - od_lookup_table->count = vddc_lookup_table->count; dep_table[0] = table_info->vdd_dep_on_sclk; @@ -321,8 +325,15 @@ static int vega10_odn_initial_default_set od_table[2] = (struct phm_ppt_v1_clock_voltage_dependency_table *)&odn_table->vdd_dep_on_socclk; - for (i = 0; i < 3; i++) + for (i = 0; i < 3; i++) { + /* odn destinations are fixed entries[MAX_REGULAR_DPM_NUMBER=8]; + * dep sources are VBIOS ucNumEntries (<=255). Bound the copy. */ + uint32_t n = dep_table[i]->count; + + if (n > MAX_REGULAR_DPM_NUMBER) + n = MAX_REGULAR_DPM_NUMBER; + dep_table[i]->count = n; smu_get_voltage_dependency_table_ppt_v1(dep_table[i], od_table[i]); + } @@ -2429,13 +2436,15 @@ static void vega10_check_dpm_table_updat dep_table = table_info->vdd_dep_on_mclk; odn_dep_table = (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dep_on_mclk); - for (i = 0; i < dep_table->count; i++) { + for (i = 0; i < dep_table->count && i < MAX_REGULAR_DPM_NUMBER; i++) { if (dep_table->entries[i].vddc != odn_dep_table->entries[i].vddc) { @@ -2439,7 +2448,7 @@ static void vega10_check_dpm_table_updat dep_table = table_info->vdd_dep_on_sclk; odn_dep_table = (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dep_on_sclk); - for (i = 0; i < dep_table->count; i++) { + for (i = 0; i < dep_table->count && i < MAX_REGULAR_DPM_NUMBER; i++) { if (dep_table->entries[i].vddc != odn_dep_table->entries[i].vddc) { @@ -4819,7 +4828,8 @@ static void vega10_odn_update_soc_table( } dpm_table = &data->dpm_table.soc_table; - for (i = 0; i < dep_table->count; i++) { + for (i = 0; i < dep_table->count && i < MAX_REGULAR_DPM_NUMBER; i++) { if (dep_table->entries[i].vddInd == podn_vdd_dep->entries[dep_table->count-1].vddInd && |