Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon/dpm: fixup dynamic state adjust for btc (v2)

Use a dedicated copy of the current power state since
we may have to adjust it on the fly.

v2: fix up redundant state sets

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+400 -9
+340
drivers/gpu/drm/radeon/btc_dpm.c
··· 1152 1152 1153 1153 #endif 1154 1154 1155 + u32 btc_valid_sclk[] = 1156 + { 1157 + 5000, 10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000, 50000, 1158 + 55000, 60000, 65000, 70000, 75000, 80000, 85000, 90000, 95000, 100000, 1159 + 105000, 110000, 11500, 120000, 125000, 130000, 135000, 140000, 145000, 150000, 1160 + 155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000, 200000 1161 + }; 1162 + 1163 + static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = 1164 + { 1165 + { 10000, 30000, RADEON_SCLK_UP }, 1166 + { 15000, 30000, RADEON_SCLK_UP }, 1167 + { 20000, 30000, RADEON_SCLK_UP }, 1168 + { 25000, 30000, RADEON_SCLK_UP } 1169 + }; 1170 + 1171 + static void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, 1172 + u32 clock, u16 max_voltage, u16 *voltage) 1173 + { 1174 + u32 i; 1175 + 1176 + if ((table == NULL) || (table->count == 0)) 1177 + return; 1178 + 1179 + for (i= 0; i < table->count; i++) { 1180 + if (clock <= table->entries[i].clk) { 1181 + if (*voltage < table->entries[i].v) 1182 + *voltage = (u16)((table->entries[i].v < max_voltage) ? 1183 + table->entries[i].v : max_voltage); 1184 + return; 1185 + } 1186 + } 1187 + 1188 + *voltage = (*voltage > max_voltage) ? *voltage : max_voltage; 1189 + } 1190 + 1191 + static u32 btc_find_valid_clock(struct radeon_clock_array *clocks, 1192 + u32 max_clock, u32 requested_clock) 1193 + { 1194 + unsigned int i; 1195 + 1196 + if ((clocks == NULL) || (clocks->count == 0)) 1197 + return (requested_clock < max_clock) ? requested_clock : max_clock; 1198 + 1199 + for (i = 0; i < clocks->count; i++) { 1200 + if (clocks->values[i] >= requested_clock) 1201 + return (clocks->values[i] < max_clock) ? clocks->values[i] : max_clock; 1202 + } 1203 + 1204 + return (clocks->values[clocks->count - 1] < max_clock) ? 1205 + clocks->values[clocks->count - 1] : max_clock; 1206 + } 1207 + 1208 + static u32 btc_get_valid_mclk(struct radeon_device *rdev, 1209 + u32 max_mclk, u32 requested_mclk) 1210 + { 1211 + return btc_find_valid_clock(&rdev->pm.dpm.dyn_state.valid_mclk_values, 1212 + max_mclk, requested_mclk); 1213 + } 1214 + 1215 + static u32 btc_get_valid_sclk(struct radeon_device *rdev, 1216 + u32 max_sclk, u32 requested_sclk) 1217 + { 1218 + return btc_find_valid_clock(&rdev->pm.dpm.dyn_state.valid_sclk_values, 1219 + max_sclk, requested_sclk); 1220 + } 1221 + 1222 + static void btc_skip_blacklist_clocks(struct radeon_device *rdev, 1223 + const u32 max_sclk, const u32 max_mclk, 1224 + u32 *sclk, u32 *mclk) 1225 + { 1226 + int i, num_blacklist_clocks; 1227 + 1228 + if ((sclk == NULL) || (mclk == NULL)) 1229 + return; 1230 + 1231 + num_blacklist_clocks = ARRAY_SIZE(btc_blacklist_clocks); 1232 + 1233 + for (i = 0; i < num_blacklist_clocks; i++) { 1234 + if ((btc_blacklist_clocks[i].sclk == *sclk) && 1235 + (btc_blacklist_clocks[i].mclk == *mclk)) 1236 + break; 1237 + } 1238 + 1239 + if (i < num_blacklist_clocks) { 1240 + if (btc_blacklist_clocks[i].action == RADEON_SCLK_UP) { 1241 + *sclk = btc_get_valid_sclk(rdev, max_sclk, *sclk + 1); 1242 + 1243 + if (*sclk < max_sclk) 1244 + btc_skip_blacklist_clocks(rdev, max_sclk, max_mclk, sclk, mclk); 1245 + } 1246 + } 1247 + } 1248 + 1249 + static void btc_adjust_clock_combinations(struct radeon_device *rdev, 1250 + const struct radeon_clock_and_voltage_limits *max_limits, 1251 + struct rv7xx_pl *pl) 1252 + { 1253 + 1254 + if ((pl->mclk == 0) || (pl->sclk == 0)) 1255 + return; 1256 + 1257 + if (pl->mclk == pl->sclk) 1258 + return; 1259 + 1260 + if (pl->mclk > pl->sclk) { 1261 + if (((pl->mclk + (pl->sclk - 1)) / pl->sclk) > rdev->pm.dpm.dyn_state.mclk_sclk_ratio) 1262 + pl->sclk = btc_get_valid_sclk(rdev, 1263 + max_limits->sclk, 1264 + (pl->mclk + 1265 + (rdev->pm.dpm.dyn_state.mclk_sclk_ratio - 1)) / 1266 + rdev->pm.dpm.dyn_state.mclk_sclk_ratio); 1267 + } else { 1268 + if ((pl->sclk - pl->mclk) > rdev->pm.dpm.dyn_state.sclk_mclk_delta) 1269 + pl->mclk = btc_get_valid_mclk(rdev, 1270 + max_limits->mclk, 1271 + pl->sclk - 1272 + rdev->pm.dpm.dyn_state.sclk_mclk_delta); 1273 + } 1274 + } 1275 + 1276 + static u16 btc_find_voltage(struct atom_voltage_table *table, u16 voltage) 1277 + { 1278 + unsigned int i; 1279 + 1280 + for (i = 0; i < table->count; i++) { 1281 + if (voltage <= table->entries[i].value) 1282 + return table->entries[i].value; 1283 + } 1284 + 1285 + return table->entries[table->count - 1].value; 1286 + } 1287 + 1288 + static void btc_apply_voltage_delta_rules(struct radeon_device *rdev, 1289 + u16 max_vddc, u16 max_vddci, 1290 + u16 *vddc, u16 *vddci) 1291 + { 1292 + struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 1293 + u16 new_voltage; 1294 + 1295 + if ((0 == *vddc) || (0 == *vddci)) 1296 + return; 1297 + 1298 + if (*vddc > *vddci) { 1299 + if ((*vddc - *vddci) > rdev->pm.dpm.dyn_state.vddc_vddci_delta) { 1300 + new_voltage = btc_find_voltage(&eg_pi->vddci_voltage_table, 1301 + (*vddc - rdev->pm.dpm.dyn_state.vddc_vddci_delta)); 1302 + *vddci = (new_voltage < max_vddci) ? new_voltage : max_vddci; 1303 + } 1304 + } else { 1305 + if ((*vddci - *vddc) > rdev->pm.dpm.dyn_state.vddc_vddci_delta) { 1306 + new_voltage = btc_find_voltage(&eg_pi->vddc_voltage_table, 1307 + (*vddci - rdev->pm.dpm.dyn_state.vddc_vddci_delta)); 1308 + *vddc = (new_voltage < max_vddc) ? new_voltage : max_vddc; 1309 + } 1310 + } 1311 + } 1312 + 1155 1313 static void btc_enable_bif_dynamic_pcie_gen2(struct radeon_device *rdev, 1156 1314 bool enable) 1157 1315 { ··· 2059 1901 } 2060 1902 } 2061 1903 1904 + static void btc_apply_state_adjust_rules(struct radeon_device *rdev) 1905 + { 1906 + struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 1907 + struct radeon_ps *rps = rdev->pm.dpm.requested_ps; 1908 + struct rv7xx_ps *ps = rv770_get_ps(rps); 1909 + struct radeon_clock_and_voltage_limits *max_limits; 1910 + bool disable_mclk_switching; 1911 + u32 mclk, sclk; 1912 + u16 vddc, vddci; 1913 + 1914 + /* point to the hw copy since this function will modify the ps */ 1915 + eg_pi->hw_ps = *ps; 1916 + rdev->pm.dpm.hw_ps.ps_priv = &eg_pi->hw_ps; 1917 + ps = &eg_pi->hw_ps; 1918 + 1919 + if (rdev->pm.dpm.new_active_crtc_count > 1) 1920 + disable_mclk_switching = true; 1921 + else 1922 + disable_mclk_switching = false; 1923 + 1924 + if (rdev->pm.dpm.ac_power) 1925 + max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac; 1926 + else 1927 + max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc; 1928 + 1929 + if (rdev->pm.dpm.ac_power == false) { 1930 + if (ps->high.mclk > max_limits->mclk) 1931 + ps->high.mclk = max_limits->mclk; 1932 + if (ps->high.sclk > max_limits->sclk) 1933 + ps->high.sclk = max_limits->sclk; 1934 + if (ps->high.vddc > max_limits->vddc) 1935 + ps->high.vddc = max_limits->vddc; 1936 + if (ps->high.vddci > max_limits->vddci) 1937 + ps->high.vddci = max_limits->vddci; 1938 + 1939 + if (ps->medium.mclk > max_limits->mclk) 1940 + ps->medium.mclk = max_limits->mclk; 1941 + if (ps->medium.sclk > max_limits->sclk) 1942 + ps->medium.sclk = max_limits->sclk; 1943 + if (ps->medium.vddc > max_limits->vddc) 1944 + ps->medium.vddc = max_limits->vddc; 1945 + if (ps->medium.vddci > max_limits->vddci) 1946 + ps->medium.vddci = max_limits->vddci; 1947 + 1948 + if (ps->low.mclk > max_limits->mclk) 1949 + ps->low.mclk = max_limits->mclk; 1950 + if (ps->low.sclk > max_limits->sclk) 1951 + ps->low.sclk = max_limits->sclk; 1952 + if (ps->low.vddc > max_limits->vddc) 1953 + ps->low.vddc = max_limits->vddc; 1954 + if (ps->low.vddci > max_limits->vddci) 1955 + ps->low.vddci = max_limits->vddci; 1956 + } 1957 + 1958 + /* XXX validate the min clocks required for display */ 1959 + 1960 + if (disable_mclk_switching) { 1961 + sclk = ps->low.sclk; 1962 + mclk = ps->high.mclk; 1963 + vddc = ps->low.vddc; 1964 + vddci = ps->high.vddci; 1965 + } else { 1966 + sclk = ps->low.sclk; 1967 + mclk = ps->low.mclk; 1968 + vddc = ps->low.vddc; 1969 + vddci = ps->low.vddci; 1970 + } 1971 + 1972 + /* adjusted low state */ 1973 + ps->low.sclk = sclk; 1974 + ps->low.mclk = mclk; 1975 + ps->low.vddc = vddc; 1976 + ps->low.vddci = vddci; 1977 + 1978 + btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk, 1979 + &ps->low.sclk, &ps->low.mclk); 1980 + 1981 + /* adjusted medium, high states */ 1982 + if (ps->medium.sclk < ps->low.sclk) 1983 + ps->medium.sclk = ps->low.sclk; 1984 + if (ps->medium.vddc < ps->low.vddc) 1985 + ps->medium.vddc = ps->low.vddc; 1986 + if (ps->high.sclk < ps->medium.sclk) 1987 + ps->high.sclk = ps->medium.sclk; 1988 + if (ps->high.vddc < ps->medium.vddc) 1989 + ps->high.vddc = ps->medium.vddc; 1990 + 1991 + if (disable_mclk_switching) { 1992 + mclk = ps->low.mclk; 1993 + if (mclk < ps->medium.mclk) 1994 + mclk = ps->medium.mclk; 1995 + if (mclk < ps->high.mclk) 1996 + mclk = ps->high.mclk; 1997 + ps->low.mclk = mclk; 1998 + ps->low.vddci = vddci; 1999 + ps->medium.mclk = mclk; 2000 + ps->medium.vddci = vddci; 2001 + ps->high.mclk = mclk; 2002 + ps->high.vddci = vddci; 2003 + } else { 2004 + if (ps->medium.mclk < ps->low.mclk) 2005 + ps->medium.mclk = ps->low.mclk; 2006 + if (ps->medium.vddci < ps->low.vddci) 2007 + ps->medium.vddci = ps->low.vddci; 2008 + if (ps->high.mclk < ps->medium.mclk) 2009 + ps->high.mclk = ps->medium.mclk; 2010 + if (ps->high.vddci < ps->medium.vddci) 2011 + ps->high.vddci = ps->medium.vddci; 2012 + } 2013 + 2014 + btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk, 2015 + &ps->medium.sclk, &ps->medium.mclk); 2016 + btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk, 2017 + &ps->high.sclk, &ps->high.mclk); 2018 + 2019 + btc_adjust_clock_combinations(rdev, max_limits, &ps->low); 2020 + btc_adjust_clock_combinations(rdev, max_limits, &ps->medium); 2021 + btc_adjust_clock_combinations(rdev, max_limits, &ps->high); 2022 + 2023 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 2024 + ps->low.sclk, max_limits->vddc, &ps->low.vddc); 2025 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 2026 + ps->low.mclk, max_limits->vddci, &ps->low.vddci); 2027 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 2028 + ps->low.mclk, max_limits->vddc, &ps->low.vddc); 2029 + /* XXX validate the voltage required for display */ 2030 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 2031 + ps->medium.sclk, max_limits->vddc, &ps->medium.vddc); 2032 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 2033 + ps->medium.mclk, max_limits->vddci, &ps->medium.vddci); 2034 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 2035 + ps->medium.mclk, max_limits->vddc, &ps->medium.vddc); 2036 + /* XXX validate the voltage required for display */ 2037 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 2038 + ps->high.sclk, max_limits->vddc, &ps->high.vddc); 2039 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 2040 + ps->high.mclk, max_limits->vddci, &ps->high.vddci); 2041 + btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 2042 + ps->high.mclk, max_limits->vddc, &ps->high.vddc); 2043 + /* XXX validate the voltage required for display */ 2044 + 2045 + btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci, 2046 + &ps->low.vddc, &ps->low.vddci); 2047 + btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci, 2048 + &ps->medium.vddc, &ps->medium.vddci); 2049 + btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci, 2050 + &ps->high.vddc, &ps->high.vddci); 2051 + 2052 + if ((ps->high.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) && 2053 + (ps->medium.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) && 2054 + (ps->low.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc)) 2055 + ps->dc_compatible = true; 2056 + else 2057 + ps->dc_compatible = false; 2058 + 2059 + if (ps->low.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2) 2060 + ps->low.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2; 2061 + if (ps->medium.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2) 2062 + ps->medium.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2; 2063 + if (ps->high.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2) 2064 + ps->high.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2; 2065 + } 2066 + 2062 2067 void btc_dpm_reset_asic(struct radeon_device *rdev) 2063 2068 { 2064 2069 rv770_restrict_performance_levels_before_switch(rdev); ··· 2233 1912 int btc_dpm_set_power_state(struct radeon_device *rdev) 2234 1913 { 2235 1914 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 1915 + 1916 + btc_apply_state_adjust_rules(rdev); 2236 1917 2237 1918 btc_disable_ulv(rdev); 2238 1919 btc_set_boot_state_timing(rdev); ··· 2449 2126 ret = rv7xx_parse_power_table(rdev); 2450 2127 if (ret) 2451 2128 return ret; 2129 + ret = r600_parse_extended_power_table(rdev); 2130 + if (ret) 2131 + return ret; 2452 2132 2453 2133 if (rdev->pm.dpm.voltage_response_time == 0) 2454 2134 rdev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT; ··· 2561 2235 2562 2236 pi->sram_end = SMC_RAM_END; 2563 2237 2238 + rdev->pm.dpm.dyn_state.mclk_sclk_ratio = 4; 2239 + rdev->pm.dpm.dyn_state.vddc_vddci_delta = 200; 2240 + rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2 = 900; 2241 + rdev->pm.dpm.dyn_state.valid_sclk_values.count = ARRAY_SIZE(btc_valid_sclk); 2242 + rdev->pm.dpm.dyn_state.valid_sclk_values.values = btc_valid_sclk; 2243 + rdev->pm.dpm.dyn_state.valid_mclk_values.count = 0; 2244 + rdev->pm.dpm.dyn_state.valid_mclk_values.values = NULL; 2245 + 2246 + if (rdev->family == CHIP_TURKS) 2247 + rdev->pm.dpm.dyn_state.sclk_mclk_delta = 15000; 2248 + else 2249 + rdev->pm.dpm.dyn_state.sclk_mclk_delta = 10000; 2250 + 2564 2251 return 0; 2565 2252 } 2566 2253 ··· 2586 2247 } 2587 2248 kfree(rdev->pm.dpm.ps); 2588 2249 kfree(rdev->pm.dpm.priv); 2250 + r600_free_extended_power_table(rdev); 2589 2251 }
+2
drivers/gpu/drm/radeon/btc_dpm.h
··· 33 33 #define BTC_CGULVPARAMETER_DFLT 0x00040035 34 34 #define BTC_CGULVCONTROL_DFLT 0x00001450 35 35 36 + extern u32 btc_valid_sclk[]; 37 + 36 38 #endif
+1
drivers/gpu/drm/radeon/cypress_dpm.h
··· 88 88 struct at ats[2]; 89 89 /* smc offsets */ 90 90 u16 mc_reg_table_start; 91 + struct rv7xx_ps hw_ps; 91 92 }; 92 93 93 94 #define CYPRESS_HASI_DFLT 400000
+13
drivers/gpu/drm/radeon/radeon.h
··· 1217 1217 bool high_to_low; 1218 1218 }; 1219 1219 1220 + enum radeon_clk_action 1221 + { 1222 + RADEON_SCLK_UP = 1, 1223 + RADEON_SCLK_DOWN 1224 + }; 1225 + 1226 + struct radeon_blacklist_clocks 1227 + { 1228 + u32 sclk; 1229 + u32 mclk; 1230 + enum radeon_clk_action action; 1231 + }; 1232 + 1220 1233 struct radeon_clock_and_voltage_limits { 1221 1234 u32 sclk; 1222 1235 u32 mclk;
+34 -9
drivers/gpu/drm/radeon/radeon_pm.c
··· 719 719 else 720 720 return; 721 721 722 - /* no need to reprogram if nothing changed */ 722 + /* no need to reprogram if nothing changed unless we are on BTC+ */ 723 723 if (rdev->pm.dpm.current_ps == rdev->pm.dpm.requested_ps) { 724 - /* update display watermarks based on new power state */ 725 - if (rdev->pm.dpm.new_active_crtcs != rdev->pm.dpm.current_active_crtcs) { 726 - radeon_bandwidth_update(rdev); 727 - /* update displays */ 728 - radeon_dpm_display_configuration_changed(rdev); 729 - rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; 730 - rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; 724 + if ((rdev->family < CHIP_BARTS) || (rdev->flags & RADEON_IS_IGP)) { 725 + /* for pre-BTC and APUs if the num crtcs changed but state is the same, 726 + * all we need to do is update the display configuration. 727 + */ 728 + if (rdev->pm.dpm.new_active_crtcs != rdev->pm.dpm.current_active_crtcs) { 729 + /* update display watermarks based on new power state */ 730 + radeon_bandwidth_update(rdev); 731 + /* update displays */ 732 + radeon_dpm_display_configuration_changed(rdev); 733 + rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; 734 + rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; 735 + } 736 + return; 737 + } else { 738 + /* for BTC+ if the num crtcs hasn't changed and state is the same, 739 + * nothing to do, if the num crtcs is > 1 and state is the same, 740 + * update display configuration. 741 + */ 742 + if (rdev->pm.dpm.new_active_crtcs == 743 + rdev->pm.dpm.current_active_crtcs) { 744 + return; 745 + } else { 746 + if ((rdev->pm.dpm.current_active_crtc_count > 1) && 747 + (rdev->pm.dpm.new_active_crtc_count > 1)) { 748 + /* update display watermarks based on new power state */ 749 + radeon_bandwidth_update(rdev); 750 + /* update displays */ 751 + radeon_dpm_display_configuration_changed(rdev); 752 + rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; 753 + rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; 754 + return; 755 + } 756 + } 731 757 } 732 - return; 733 758 } 734 759 735 760 printk("switching from power state:\n");
+10
drivers/gpu/drm/radeon/rv770_dpm.c
··· 2177 2177 pl->vddc = vddc; 2178 2178 pl->vddci = vddci; 2179 2179 } 2180 + 2181 + if (rdev->family >= CHIP_BARTS) { 2182 + if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == 2183 + ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) { 2184 + rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk = pl->sclk; 2185 + rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk = pl->mclk; 2186 + rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = pl->vddc; 2187 + rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = pl->vddci; 2188 + } 2189 + } 2180 2190 } 2181 2191 2182 2192 int rv7xx_parse_power_table(struct radeon_device *rdev)