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

drm/radeon/dpm: switch on new late_enable callback

Right now it's called right after enable, but after
reworking the dpm init order, it will get called later
to accomodate loading the smc early, but enabling
thermal interrupts and block powergating later after
the ring tests are complete.

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

+53 -205
-15
drivers/gpu/drm/radeon/btc_dpm.c
··· 2510 2510 if (eg_pi->ls_clock_gating) 2511 2511 btc_ls_clock_gating_enable(rdev, true); 2512 2512 2513 - if (rdev->irq.installed && 2514 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 2515 - PPSMC_Result result; 2516 - 2517 - ret = rv770_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 2518 - if (ret) 2519 - return ret; 2520 - rdev->irq.dpm_thermal = true; 2521 - radeon_irq_set(rdev); 2522 - result = rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 2523 - 2524 - if (result != PPSMC_Result_OK) 2525 - DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); 2526 - } 2527 - 2528 2513 rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 2529 2514 2530 2515 btc_init_stutter_mode(rdev);
-21
drivers/gpu/drm/radeon/ci_dpm.c
··· 4656 4656 DRM_ERROR("ci_enable_power_containment failed\n"); 4657 4657 return ret; 4658 4658 } 4659 - if (rdev->irq.installed && 4660 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 4661 - #if 0 4662 - PPSMC_Result result; 4663 - #endif 4664 - ret = ci_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 4665 - if (ret) { 4666 - DRM_ERROR("ci_set_thermal_temperature_range failed\n"); 4667 - return ret; 4668 - } 4669 - rdev->irq.dpm_thermal = true; 4670 - radeon_irq_set(rdev); 4671 - #if 0 4672 - result = ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 4673 - 4674 - if (result != PPSMC_Result_OK) 4675 - DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); 4676 - #endif 4677 - } 4678 4659 4679 4660 ci_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 4680 - 4681 - ci_dpm_powergate_uvd(rdev, true); 4682 4661 4683 4662 ci_update_current_ps(rdev, boot_ps); 4684 4663
-15
drivers/gpu/drm/radeon/cypress_dpm.c
··· 1905 1905 if (pi->mg_clock_gating) 1906 1906 cypress_mg_clock_gating_enable(rdev, true); 1907 1907 1908 - if (rdev->irq.installed && 1909 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 1910 - PPSMC_Result result; 1911 - 1912 - ret = rv770_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 1913 - if (ret) 1914 - return ret; 1915 - rdev->irq.dpm_thermal = true; 1916 - radeon_irq_set(rdev); 1917 - result = rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 1918 - 1919 - if (result != PPSMC_Result_OK) 1920 - DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); 1921 - } 1922 - 1923 1908 rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 1924 1909 1925 1910 return 0;
-17
drivers/gpu/drm/radeon/kv_dpm.c
··· 1210 1210 1211 1211 kv_reset_acp_boot_level(rdev); 1212 1212 1213 - if (rdev->irq.installed && 1214 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 1215 - ret = kv_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 1216 - if (ret) { 1217 - DRM_ERROR("kv_set_thermal_temperature_range failed\n"); 1218 - return ret; 1219 - } 1220 - rdev->irq.dpm_thermal = true; 1221 - radeon_irq_set(rdev); 1222 - } 1223 - 1224 1213 ret = kv_smc_bapm_enable(rdev, false); 1225 1214 if (ret) { 1226 1215 DRM_ERROR("kv_smc_bapm_enable failed\n"); 1227 1216 return ret; 1228 1217 } 1229 - 1230 - /* powerdown unused blocks for now */ 1231 - kv_dpm_powergate_acp(rdev, true); 1232 - kv_dpm_powergate_samu(rdev, true); 1233 - kv_dpm_powergate_vce(rdev, true); 1234 - kv_dpm_powergate_uvd(rdev, true); 1235 1218 1236 1219 kv_update_current_ps(rdev, rdev->pm.dpm.boot_ps); 1237 1220
-15
drivers/gpu/drm/radeon/ni_dpm.c
··· 3710 3710 if (eg_pi->ls_clock_gating) 3711 3711 ni_ls_clockgating_enable(rdev, true); 3712 3712 3713 - if (rdev->irq.installed && 3714 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 3715 - PPSMC_Result result; 3716 - 3717 - ret = rv770_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, 0xff * 1000); 3718 - if (ret) 3719 - return ret; 3720 - rdev->irq.dpm_thermal = true; 3721 - radeon_irq_set(rdev); 3722 - result = rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 3723 - 3724 - if (result != PPSMC_Result_OK) 3725 - DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); 3726 - } 3727 - 3728 3713 rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 3729 3714 3730 3715 ni_update_current_ps(rdev, boot_ps);
+2 -2
drivers/gpu/drm/radeon/r600_dpm.c
··· 729 729 return false; 730 730 } 731 731 732 - int r600_set_thermal_temperature_range(struct radeon_device *rdev, 733 - int min_temp, int max_temp) 732 + static int r600_set_thermal_temperature_range(struct radeon_device *rdev, 733 + int min_temp, int max_temp) 734 734 { 735 735 int low_temp = 0 * 1000; 736 736 int high_temp = 255 * 1000;
-2
drivers/gpu/drm/radeon/r600_dpm.h
··· 213 213 void r600_start_dpm(struct radeon_device *rdev); 214 214 void r600_stop_dpm(struct radeon_device *rdev); 215 215 216 - int r600_set_thermal_temperature_range(struct radeon_device *rdev, 217 - int min_temp, int max_temp); 218 216 bool r600_is_internal_thermal_sensor(enum radeon_int_thermal_type sensor); 219 217 220 218 int r600_parse_extended_power_table(struct radeon_device *rdev);
+49 -38
drivers/gpu/drm/radeon/radeon_pm.c
··· 1032 1032 radeon_dpm_setup_asic(rdev); 1033 1033 ret = radeon_dpm_enable(rdev); 1034 1034 mutex_unlock(&rdev->pm.mutex); 1035 - if (ret) { 1036 - DRM_ERROR("radeon: dpm resume failed\n"); 1037 - if ((rdev->family >= CHIP_BARTS) && 1038 - (rdev->family <= CHIP_CAYMAN) && 1039 - rdev->mc_fw) { 1040 - if (rdev->pm.default_vddc) 1041 - radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, 1042 - SET_VOLTAGE_TYPE_ASIC_VDDC); 1043 - if (rdev->pm.default_vddci) 1044 - radeon_atom_set_voltage(rdev, rdev->pm.default_vddci, 1045 - SET_VOLTAGE_TYPE_ASIC_VDDCI); 1046 - if (rdev->pm.default_sclk) 1047 - radeon_set_engine_clock(rdev, rdev->pm.default_sclk); 1048 - if (rdev->pm.default_mclk) 1049 - radeon_set_memory_clock(rdev, rdev->pm.default_mclk); 1050 - } 1051 - } else { 1052 - rdev->pm.dpm_enabled = true; 1053 - radeon_pm_compute_clocks(rdev); 1035 + if (ret) 1036 + goto dpm_resume_fail; 1037 + ret = radeon_pm_late_init(rdev); 1038 + if (ret) 1039 + goto dpm_resume_fail; 1040 + 1041 + rdev->pm.dpm_enabled = true; 1042 + radeon_pm_compute_clocks(rdev); 1043 + return; 1044 + 1045 + dpm_resume_fail: 1046 + DRM_ERROR("radeon: dpm resume failed\n"); 1047 + if ((rdev->family >= CHIP_BARTS) && 1048 + (rdev->family <= CHIP_CAYMAN) && 1049 + rdev->mc_fw) { 1050 + if (rdev->pm.default_vddc) 1051 + radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, 1052 + SET_VOLTAGE_TYPE_ASIC_VDDC); 1053 + if (rdev->pm.default_vddci) 1054 + radeon_atom_set_voltage(rdev, rdev->pm.default_vddci, 1055 + SET_VOLTAGE_TYPE_ASIC_VDDCI); 1056 + if (rdev->pm.default_sclk) 1057 + radeon_set_engine_clock(rdev, rdev->pm.default_sclk); 1058 + if (rdev->pm.default_mclk) 1059 + radeon_set_memory_clock(rdev, rdev->pm.default_mclk); 1054 1060 } 1055 1061 } 1056 1062 ··· 1176 1170 radeon_dpm_setup_asic(rdev); 1177 1171 ret = radeon_dpm_enable(rdev); 1178 1172 mutex_unlock(&rdev->pm.mutex); 1179 - if (ret) { 1180 - rdev->pm.dpm_enabled = false; 1181 - if ((rdev->family >= CHIP_BARTS) && 1182 - (rdev->family <= CHIP_CAYMAN) && 1183 - rdev->mc_fw) { 1184 - if (rdev->pm.default_vddc) 1185 - radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, 1186 - SET_VOLTAGE_TYPE_ASIC_VDDC); 1187 - if (rdev->pm.default_vddci) 1188 - radeon_atom_set_voltage(rdev, rdev->pm.default_vddci, 1189 - SET_VOLTAGE_TYPE_ASIC_VDDCI); 1190 - if (rdev->pm.default_sclk) 1191 - radeon_set_engine_clock(rdev, rdev->pm.default_sclk); 1192 - if (rdev->pm.default_mclk) 1193 - radeon_set_memory_clock(rdev, rdev->pm.default_mclk); 1194 - } 1195 - DRM_ERROR("radeon: dpm initialization failed\n"); 1196 - return ret; 1197 - } 1173 + if (ret) 1174 + goto dpm_failed; 1175 + ret = radeon_pm_late_init(rdev); 1176 + if (ret) 1177 + goto dpm_failed; 1198 1178 rdev->pm.dpm_enabled = true; 1199 1179 radeon_pm_compute_clocks(rdev); 1200 1180 ··· 1205 1213 DRM_INFO("radeon: dpm initialized\n"); 1206 1214 1207 1215 return 0; 1216 + 1217 + dpm_failed: 1218 + rdev->pm.dpm_enabled = false; 1219 + if ((rdev->family >= CHIP_BARTS) && 1220 + (rdev->family <= CHIP_CAYMAN) && 1221 + rdev->mc_fw) { 1222 + if (rdev->pm.default_vddc) 1223 + radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, 1224 + SET_VOLTAGE_TYPE_ASIC_VDDC); 1225 + if (rdev->pm.default_vddci) 1226 + radeon_atom_set_voltage(rdev, rdev->pm.default_vddci, 1227 + SET_VOLTAGE_TYPE_ASIC_VDDCI); 1228 + if (rdev->pm.default_sclk) 1229 + radeon_set_engine_clock(rdev, rdev->pm.default_sclk); 1230 + if (rdev->pm.default_mclk) 1231 + radeon_set_memory_clock(rdev, rdev->pm.default_mclk); 1232 + } 1233 + DRM_ERROR("radeon: dpm initialization failed\n"); 1234 + return ret; 1208 1235 } 1209 1236 1210 1237 int radeon_pm_init(struct radeon_device *rdev)
-8
drivers/gpu/drm/radeon/rs780_dpm.c
··· 623 623 if (pi->gfx_clock_gating) 624 624 r600_gfx_clockgating_enable(rdev, true); 625 625 626 - if (rdev->irq.installed && (rdev->pm.int_thermal_type == THERMAL_TYPE_RV6XX)) { 627 - ret = r600_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 628 - if (ret) 629 - return ret; 630 - rdev->irq.dpm_thermal = true; 631 - radeon_irq_set(rdev); 632 - } 633 - 634 626 return 0; 635 627 } 636 628
-10
drivers/gpu/drm/radeon/rv6xx_dpm.c
··· 1546 1546 { 1547 1547 struct rv6xx_power_info *pi = rv6xx_get_pi(rdev); 1548 1548 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps; 1549 - int ret; 1550 1549 1551 1550 if (r600_dynamicpm_enabled(rdev)) 1552 1551 return -EINVAL; ··· 1592 1593 r600_power_level_enable(rdev, R600_POWER_LEVEL_LOW, true); 1593 1594 r600_power_level_enable(rdev, R600_POWER_LEVEL_MEDIUM, true); 1594 1595 r600_power_level_enable(rdev, R600_POWER_LEVEL_HIGH, true); 1595 - 1596 - if (rdev->irq.installed && 1597 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 1598 - ret = r600_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 1599 - if (ret) 1600 - return ret; 1601 - rdev->irq.dpm_thermal = true; 1602 - radeon_irq_set(rdev); 1603 - } 1604 1596 1605 1597 rv6xx_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 1606 1598
+2 -17
drivers/gpu/drm/radeon/rv770_dpm.c
··· 1863 1863 } 1864 1864 } 1865 1865 1866 - int rv770_set_thermal_temperature_range(struct radeon_device *rdev, 1867 - int min_temp, int max_temp) 1866 + static int rv770_set_thermal_temperature_range(struct radeon_device *rdev, 1867 + int min_temp, int max_temp) 1868 1868 { 1869 1869 int low_temp = 0 * 1000; 1870 1870 int high_temp = 255 * 1000; ··· 1965 1965 1966 1966 if (pi->mg_clock_gating) 1967 1967 rv770_mg_clock_gating_enable(rdev, true); 1968 - 1969 - if (rdev->irq.installed && 1970 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 1971 - PPSMC_Result result; 1972 - 1973 - ret = rv770_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 1974 - if (ret) 1975 - return ret; 1976 - rdev->irq.dpm_thermal = true; 1977 - radeon_irq_set(rdev); 1978 - result = rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 1979 - 1980 - if (result != PPSMC_Result_OK) 1981 - DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); 1982 - } 1983 1968 1984 1969 rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 1985 1970
-4
drivers/gpu/drm/radeon/rv770_dpm.h
··· 283 283 int rv770_write_smc_soft_register(struct radeon_device *rdev, 284 284 u16 reg_offset, u32 value); 285 285 286 - /* thermal */ 287 - int rv770_set_thermal_temperature_range(struct radeon_device *rdev, 288 - int min_temp, int max_temp); 289 - 290 286 #endif
-15
drivers/gpu/drm/radeon/si_dpm.c
··· 5890 5890 si_enable_sclk_control(rdev, true); 5891 5891 si_start_dpm(rdev); 5892 5892 5893 - if (rdev->irq.installed && 5894 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 5895 - PPSMC_Result result; 5896 - 5897 - ret = si_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 5898 - if (ret) 5899 - return ret; 5900 - rdev->irq.dpm_thermal = true; 5901 - radeon_irq_set(rdev); 5902 - result = si_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 5903 - 5904 - if (result != PPSMC_Result_OK) 5905 - DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); 5906 - } 5907 - 5908 5893 si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 5909 5894 5910 5895 ni_update_current_ps(rdev, boot_ps);
-13
drivers/gpu/drm/radeon/sumo_dpm.c
··· 1202 1202 int sumo_dpm_enable(struct radeon_device *rdev) 1203 1203 { 1204 1204 struct sumo_power_info *pi = sumo_get_pi(rdev); 1205 - int ret; 1206 1205 1207 1206 if (sumo_dpm_enabled(rdev)) 1208 1207 return -EINVAL; 1209 1208 1210 - ret = sumo_enable_clock_power_gating(rdev); 1211 - if (ret) 1212 - return ret; 1213 1209 sumo_program_bootup_state(rdev); 1214 1210 sumo_init_bsp(rdev); 1215 1211 sumo_reset_am(rdev); ··· 1228 1232 sumo_enable_sclk_ds(rdev, true); 1229 1233 if (pi->enable_boost) 1230 1234 sumo_enable_boost_timer(rdev); 1231 - 1232 - if (rdev->irq.installed && 1233 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 1234 - ret = sumo_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 1235 - if (ret) 1236 - return ret; 1237 - rdev->irq.dpm_thermal = true; 1238 - radeon_irq_set(rdev); 1239 - } 1240 1235 1241 1236 sumo_update_current_ps(rdev, rdev->pm.dpm.boot_ps); 1242 1237
-13
drivers/gpu/drm/radeon/trinity_dpm.c
··· 1082 1082 int trinity_dpm_enable(struct radeon_device *rdev) 1083 1083 { 1084 1084 struct trinity_power_info *pi = trinity_get_pi(rdev); 1085 - int ret; 1086 1085 1087 1086 trinity_acquire_mutex(rdev); 1088 1087 ··· 1090 1091 return -EINVAL; 1091 1092 } 1092 1093 1093 - trinity_enable_clock_power_gating(rdev); 1094 1094 trinity_program_bootup_state(rdev); 1095 1095 sumo_program_vc(rdev, 0x00C00033); 1096 1096 trinity_start_am(rdev); ··· 1102 1104 trinity_wait_for_dpm_enabled(rdev); 1103 1105 trinity_dpm_bapm_enable(rdev, false); 1104 1106 trinity_release_mutex(rdev); 1105 - 1106 - if (rdev->irq.installed && 1107 - r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 1108 - ret = trinity_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 1109 - if (ret) { 1110 - trinity_release_mutex(rdev); 1111 - return ret; 1112 - } 1113 - rdev->irq.dpm_thermal = true; 1114 - radeon_irq_set(rdev); 1115 - } 1116 1107 1117 1108 trinity_update_current_ps(rdev, rdev->pm.dpm.boot_ps); 1118 1109