Rev 5179 | Rev 6104 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5179 | Rev 5271 | ||
---|---|---|---|
Line 21... | Line 21... | ||
21 | * |
21 | * |
22 | */ |
22 | */ |
Line 23... | Line 23... | ||
23 | 23 | ||
24 | #include "drmP.h" |
24 | #include "drmP.h" |
- | 25 | #include "radeon.h" |
|
25 | #include "radeon.h" |
26 | #include "radeon_asic.h" |
26 | #include "sid.h" |
27 | #include "sid.h" |
27 | #include "r600_dpm.h" |
28 | #include "r600_dpm.h" |
28 | #include "si_dpm.h" |
29 | #include "si_dpm.h" |
29 | #include "atom.h" |
30 | #include "atom.h" |
Line 3395... | Line 3396... | ||
3395 | 3396 | ||
Line 3396... | Line 3397... | ||
3396 | si_pi->mc_reg_table_start = tmp; |
3397 | si_pi->mc_reg_table_start = tmp; |
3397 | 3398 | ||
- | 3399 | ret = si_read_smc_sram_dword(rdev, |
|
- | 3400 | SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + |
|
- | 3401 | SISLANDS_SMC_FIRMWARE_HEADER_fanTable, |
|
- | 3402 | &tmp, si_pi->sram_end); |
|
- | 3403 | if (ret) |
|
- | 3404 | return ret; |
|
- | 3405 | ||
- | 3406 | si_pi->fan_table_start = tmp; |
|
- | 3407 | ||
3398 | ret = si_read_smc_sram_dword(rdev, |
3408 | ret = si_read_smc_sram_dword(rdev, |
3399 | SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + |
3409 | SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + |
3400 | SISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable, |
3410 | SISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable, |
3401 | &tmp, si_pi->sram_end); |
3411 | &tmp, si_pi->sram_end); |
Line 5814... | Line 5824... | ||
5814 | rv770_get_memory_type(rdev); |
5824 | rv770_get_memory_type(rdev); |
5815 | si_read_clock_registers(rdev); |
5825 | si_read_clock_registers(rdev); |
5816 | si_enable_acpi_power_management(rdev); |
5826 | si_enable_acpi_power_management(rdev); |
5817 | } |
5827 | } |
Line -... | Line 5828... | ||
- | 5828 | ||
- | 5829 | static int si_thermal_enable_alert(struct radeon_device *rdev, |
|
- | 5830 | bool enable) |
|
- | 5831 | { |
|
- | 5832 | u32 thermal_int = RREG32(CG_THERMAL_INT); |
|
- | 5833 | ||
- | 5834 | if (enable) { |
|
- | 5835 | PPSMC_Result result; |
|
- | 5836 | ||
- | 5837 | thermal_int &= ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); |
|
- | 5838 | WREG32(CG_THERMAL_INT, thermal_int); |
|
- | 5839 | rdev->irq.dpm_thermal = false; |
|
- | 5840 | result = si_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); |
|
- | 5841 | if (result != PPSMC_Result_OK) { |
|
- | 5842 | DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); |
|
- | 5843 | return -EINVAL; |
|
- | 5844 | } |
|
- | 5845 | } else { |
|
- | 5846 | thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; |
|
- | 5847 | WREG32(CG_THERMAL_INT, thermal_int); |
|
- | 5848 | rdev->irq.dpm_thermal = true; |
|
- | 5849 | } |
|
- | 5850 | ||
- | 5851 | return 0; |
|
- | 5852 | } |
|
5818 | 5853 | ||
5819 | static int si_set_thermal_temperature_range(struct radeon_device *rdev, |
5854 | static int si_thermal_set_temperature_range(struct radeon_device *rdev, |
5820 | int min_temp, int max_temp) |
5855 | int min_temp, int max_temp) |
5821 | { |
5856 | { |
5822 | int low_temp = 0 * 1000; |
5857 | int low_temp = 0 * 1000; |
Line 5839... | Line 5874... | ||
5839 | rdev->pm.dpm.thermal.max_temp = high_temp; |
5874 | rdev->pm.dpm.thermal.max_temp = high_temp; |
Line 5840... | Line 5875... | ||
5840 | 5875 | ||
5841 | return 0; |
5876 | return 0; |
Line -... | Line 5877... | ||
- | 5877 | } |
|
- | 5878 | ||
- | 5879 | static void si_fan_ctrl_set_static_mode(struct radeon_device *rdev, u32 mode) |
|
- | 5880 | { |
|
- | 5881 | struct si_power_info *si_pi = si_get_pi(rdev); |
|
- | 5882 | u32 tmp; |
|
- | 5883 | ||
- | 5884 | if (si_pi->fan_ctrl_is_in_default_mode) { |
|
- | 5885 | tmp = (RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK) >> FDO_PWM_MODE_SHIFT; |
|
- | 5886 | si_pi->fan_ctrl_default_mode = tmp; |
|
- | 5887 | tmp = (RREG32(CG_FDO_CTRL2) & TMIN_MASK) >> TMIN_SHIFT; |
|
- | 5888 | si_pi->t_min = tmp; |
|
- | 5889 | si_pi->fan_ctrl_is_in_default_mode = false; |
|
- | 5890 | } |
|
- | 5891 | ||
- | 5892 | tmp = RREG32(CG_FDO_CTRL2) & ~TMIN_MASK; |
|
- | 5893 | tmp |= TMIN(0); |
|
- | 5894 | WREG32(CG_FDO_CTRL2, tmp); |
|
- | 5895 | ||
- | 5896 | tmp = RREG32(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK; |
|
- | 5897 | tmp |= FDO_PWM_MODE(mode); |
|
- | 5898 | WREG32(CG_FDO_CTRL2, tmp); |
|
- | 5899 | } |
|
- | 5900 | ||
- | 5901 | static int si_thermal_setup_fan_table(struct radeon_device *rdev) |
|
- | 5902 | { |
|
- | 5903 | struct si_power_info *si_pi = si_get_pi(rdev); |
|
- | 5904 | PP_SIslands_FanTable fan_table = { FDO_MODE_HARDWARE }; |
|
- | 5905 | u32 duty100; |
|
- | 5906 | u32 t_diff1, t_diff2, pwm_diff1, pwm_diff2; |
|
- | 5907 | u16 fdo_min, slope1, slope2; |
|
- | 5908 | u32 reference_clock, tmp; |
|
- | 5909 | int ret; |
|
- | 5910 | u64 tmp64; |
|
- | 5911 | ||
- | 5912 | if (!si_pi->fan_table_start) { |
|
- | 5913 | rdev->pm.dpm.fan.ucode_fan_control = false; |
|
- | 5914 | return 0; |
|
- | 5915 | } |
|
- | 5916 | ||
- | 5917 | duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; |
|
- | 5918 | ||
- | 5919 | if (duty100 == 0) { |
|
- | 5920 | rdev->pm.dpm.fan.ucode_fan_control = false; |
|
- | 5921 | return 0; |
|
- | 5922 | } |
|
- | 5923 | ||
- | 5924 | tmp64 = (u64)rdev->pm.dpm.fan.pwm_min * duty100; |
|
- | 5925 | do_div(tmp64, 10000); |
|
- | 5926 | fdo_min = (u16)tmp64; |
|
- | 5927 | ||
- | 5928 | t_diff1 = rdev->pm.dpm.fan.t_med - rdev->pm.dpm.fan.t_min; |
|
- | 5929 | t_diff2 = rdev->pm.dpm.fan.t_high - rdev->pm.dpm.fan.t_med; |
|
- | 5930 | ||
- | 5931 | pwm_diff1 = rdev->pm.dpm.fan.pwm_med - rdev->pm.dpm.fan.pwm_min; |
|
- | 5932 | pwm_diff2 = rdev->pm.dpm.fan.pwm_high - rdev->pm.dpm.fan.pwm_med; |
|
- | 5933 | ||
- | 5934 | slope1 = (u16)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100); |
|
- | 5935 | slope2 = (u16)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100); |
|
- | 5936 | ||
- | 5937 | fan_table.slope1 = cpu_to_be16(slope1); |
|
- | 5938 | fan_table.slope2 = cpu_to_be16(slope2); |
|
- | 5939 | ||
- | 5940 | fan_table.fdo_min = cpu_to_be16(fdo_min); |
|
- | 5941 | ||
- | 5942 | fan_table.hys_down = cpu_to_be16(rdev->pm.dpm.fan.t_hyst); |
|
- | 5943 | ||
- | 5944 | fan_table.hys_up = cpu_to_be16(1); |
|
- | 5945 | ||
- | 5946 | fan_table.hys_slope = cpu_to_be16(1); |
|
- | 5947 | ||
- | 5948 | fan_table.temp_resp_lim = cpu_to_be16(5); |
|
- | 5949 | ||
- | 5950 | reference_clock = radeon_get_xclk(rdev); |
|
- | 5951 | ||
- | 5952 | fan_table.refresh_period = cpu_to_be32((rdev->pm.dpm.fan.cycle_delay * |
|
- | 5953 | reference_clock) / 1600); |
|
- | 5954 | ||
- | 5955 | fan_table.fdo_max = cpu_to_be16((u16)duty100); |
|
- | 5956 | ||
- | 5957 | tmp = (RREG32(CG_MULT_THERMAL_CTRL) & TEMP_SEL_MASK) >> TEMP_SEL_SHIFT; |
|
- | 5958 | fan_table.temp_src = (uint8_t)tmp; |
|
- | 5959 | ||
- | 5960 | ret = si_copy_bytes_to_smc(rdev, |
|
- | 5961 | si_pi->fan_table_start, |
|
- | 5962 | (u8 *)(&fan_table), |
|
- | 5963 | sizeof(fan_table), |
|
- | 5964 | si_pi->sram_end); |
|
- | 5965 | ||
- | 5966 | if (ret) { |
|
- | 5967 | DRM_ERROR("Failed to load fan table to the SMC."); |
|
- | 5968 | rdev->pm.dpm.fan.ucode_fan_control = false; |
|
- | 5969 | } |
|
- | 5970 | ||
- | 5971 | return 0; |
|
- | 5972 | } |
|
- | 5973 | ||
- | 5974 | static int si_fan_ctrl_start_smc_fan_control(struct radeon_device *rdev) |
|
- | 5975 | { |
|
- | 5976 | PPSMC_Result ret; |
|
- | 5977 | ||
- | 5978 | ret = si_send_msg_to_smc(rdev, PPSMC_StartFanControl); |
|
- | 5979 | if (ret == PPSMC_Result_OK) |
|
- | 5980 | return 0; |
|
- | 5981 | else |
|
- | 5982 | return -EINVAL; |
|
- | 5983 | } |
|
- | 5984 | ||
- | 5985 | static int si_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev) |
|
- | 5986 | { |
|
- | 5987 | PPSMC_Result ret; |
|
- | 5988 | ||
- | 5989 | ret = si_send_msg_to_smc(rdev, PPSMC_StopFanControl); |
|
- | 5990 | if (ret == PPSMC_Result_OK) |
|
- | 5991 | return 0; |
|
- | 5992 | else |
|
- | 5993 | return -EINVAL; |
|
- | 5994 | } |
|
- | 5995 | ||
- | 5996 | #if 0 |
|
- | 5997 | static int si_fan_ctrl_get_fan_speed_percent(struct radeon_device *rdev, |
|
- | 5998 | u32 *speed) |
|
- | 5999 | { |
|
- | 6000 | u32 duty, duty100; |
|
- | 6001 | u64 tmp64; |
|
- | 6002 | ||
- | 6003 | if (rdev->pm.no_fan) |
|
- | 6004 | return -ENOENT; |
|
- | 6005 | ||
- | 6006 | duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; |
|
- | 6007 | duty = (RREG32(CG_THERMAL_STATUS) & FDO_PWM_DUTY_MASK) >> FDO_PWM_DUTY_SHIFT; |
|
- | 6008 | ||
- | 6009 | if (duty100 == 0) |
|
- | 6010 | return -EINVAL; |
|
- | 6011 | ||
- | 6012 | tmp64 = (u64)duty * 100; |
|
- | 6013 | do_div(tmp64, duty100); |
|
- | 6014 | *speed = (u32)tmp64; |
|
- | 6015 | ||
- | 6016 | if (*speed > 100) |
|
- | 6017 | *speed = 100; |
|
- | 6018 | ||
- | 6019 | return 0; |
|
- | 6020 | } |
|
- | 6021 | ||
- | 6022 | static int si_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev, |
|
- | 6023 | u32 speed) |
|
- | 6024 | { |
|
- | 6025 | u32 tmp; |
|
- | 6026 | u32 duty, duty100; |
|
- | 6027 | u64 tmp64; |
|
- | 6028 | ||
- | 6029 | if (rdev->pm.no_fan) |
|
- | 6030 | return -ENOENT; |
|
- | 6031 | ||
- | 6032 | if (speed > 100) |
|
- | 6033 | return -EINVAL; |
|
- | 6034 | ||
- | 6035 | if (rdev->pm.dpm.fan.ucode_fan_control) |
|
- | 6036 | si_fan_ctrl_stop_smc_fan_control(rdev); |
|
- | 6037 | ||
- | 6038 | duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; |
|
- | 6039 | ||
- | 6040 | if (duty100 == 0) |
|
- | 6041 | return -EINVAL; |
|
- | 6042 | ||
- | 6043 | tmp64 = (u64)speed * duty100; |
|
- | 6044 | do_div(tmp64, 100); |
|
- | 6045 | duty = (u32)tmp64; |
|
- | 6046 | ||
- | 6047 | tmp = RREG32(CG_FDO_CTRL0) & ~FDO_STATIC_DUTY_MASK; |
|
- | 6048 | tmp |= FDO_STATIC_DUTY(duty); |
|
- | 6049 | WREG32(CG_FDO_CTRL0, tmp); |
|
- | 6050 | ||
- | 6051 | si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC); |
|
- | 6052 | ||
- | 6053 | return 0; |
|
- | 6054 | } |
|
- | 6055 | ||
- | 6056 | static int si_fan_ctrl_get_fan_speed_rpm(struct radeon_device *rdev, |
|
- | 6057 | u32 *speed) |
|
- | 6058 | { |
|
- | 6059 | u32 tach_period; |
|
- | 6060 | u32 xclk = radeon_get_xclk(rdev); |
|
- | 6061 | ||
- | 6062 | if (rdev->pm.no_fan) |
|
- | 6063 | return -ENOENT; |
|
- | 6064 | ||
- | 6065 | if (rdev->pm.fan_pulses_per_revolution == 0) |
|
- | 6066 | return -ENOENT; |
|
- | 6067 | ||
- | 6068 | tach_period = (RREG32(CG_TACH_STATUS) & TACH_PERIOD_MASK) >> TACH_PERIOD_SHIFT; |
|
- | 6069 | if (tach_period == 0) |
|
- | 6070 | return -ENOENT; |
|
- | 6071 | ||
- | 6072 | *speed = 60 * xclk * 10000 / tach_period; |
|
- | 6073 | ||
- | 6074 | return 0; |
|
- | 6075 | } |
|
- | 6076 | ||
- | 6077 | static int si_fan_ctrl_set_fan_speed_rpm(struct radeon_device *rdev, |
|
- | 6078 | u32 speed) |
|
- | 6079 | { |
|
- | 6080 | u32 tach_period, tmp; |
|
- | 6081 | u32 xclk = radeon_get_xclk(rdev); |
|
- | 6082 | ||
- | 6083 | if (rdev->pm.no_fan) |
|
- | 6084 | return -ENOENT; |
|
- | 6085 | ||
- | 6086 | if (rdev->pm.fan_pulses_per_revolution == 0) |
|
- | 6087 | return -ENOENT; |
|
- | 6088 | ||
- | 6089 | if ((speed < rdev->pm.fan_min_rpm) || |
|
- | 6090 | (speed > rdev->pm.fan_max_rpm)) |
|
- | 6091 | return -EINVAL; |
|
- | 6092 | ||
- | 6093 | if (rdev->pm.dpm.fan.ucode_fan_control) |
|
- | 6094 | si_fan_ctrl_stop_smc_fan_control(rdev); |
|
- | 6095 | ||
- | 6096 | tach_period = 60 * xclk * 10000 / (8 * speed); |
|
- | 6097 | tmp = RREG32(CG_TACH_CTRL) & ~TARGET_PERIOD_MASK; |
|
- | 6098 | tmp |= TARGET_PERIOD(tach_period); |
|
- | 6099 | WREG32(CG_TACH_CTRL, tmp); |
|
- | 6100 | ||
- | 6101 | si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC_RPM); |
|
- | 6102 | ||
- | 6103 | return 0; |
|
- | 6104 | } |
|
- | 6105 | #endif |
|
- | 6106 | ||
- | 6107 | static void si_fan_ctrl_set_default_mode(struct radeon_device *rdev) |
|
- | 6108 | { |
|
- | 6109 | struct si_power_info *si_pi = si_get_pi(rdev); |
|
- | 6110 | u32 tmp; |
|
- | 6111 | ||
- | 6112 | if (!si_pi->fan_ctrl_is_in_default_mode) { |
|
- | 6113 | tmp = RREG32(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK; |
|
- | 6114 | tmp |= FDO_PWM_MODE(si_pi->fan_ctrl_default_mode); |
|
- | 6115 | WREG32(CG_FDO_CTRL2, tmp); |
|
- | 6116 | ||
- | 6117 | tmp = RREG32(CG_FDO_CTRL2) & ~TMIN_MASK; |
|
- | 6118 | tmp |= TMIN(si_pi->t_min); |
|
- | 6119 | WREG32(CG_FDO_CTRL2, tmp); |
|
- | 6120 | si_pi->fan_ctrl_is_in_default_mode = true; |
|
- | 6121 | } |
|
- | 6122 | } |
|
- | 6123 | ||
- | 6124 | static void si_thermal_start_smc_fan_control(struct radeon_device *rdev) |
|
- | 6125 | { |
|
- | 6126 | if (rdev->pm.dpm.fan.ucode_fan_control) { |
|
- | 6127 | si_fan_ctrl_start_smc_fan_control(rdev); |
|
- | 6128 | si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC); |
|
- | 6129 | } |
|
- | 6130 | } |
|
- | 6131 | ||
- | 6132 | static void si_thermal_initialize(struct radeon_device *rdev) |
|
- | 6133 | { |
|
- | 6134 | u32 tmp; |
|
- | 6135 | ||
- | 6136 | if (rdev->pm.fan_pulses_per_revolution) { |
|
- | 6137 | tmp = RREG32(CG_TACH_CTRL) & ~EDGE_PER_REV_MASK; |
|
- | 6138 | tmp |= EDGE_PER_REV(rdev->pm.fan_pulses_per_revolution -1); |
|
- | 6139 | WREG32(CG_TACH_CTRL, tmp); |
|
- | 6140 | } |
|
- | 6141 | ||
- | 6142 | tmp = RREG32(CG_FDO_CTRL2) & ~TACH_PWM_RESP_RATE_MASK; |
|
- | 6143 | tmp |= TACH_PWM_RESP_RATE(0x28); |
|
- | 6144 | WREG32(CG_FDO_CTRL2, tmp); |
|
- | 6145 | } |
|
- | 6146 | ||
- | 6147 | static int si_thermal_start_thermal_controller(struct radeon_device *rdev) |
|
- | 6148 | { |
|
- | 6149 | int ret; |
|
- | 6150 | ||
- | 6151 | si_thermal_initialize(rdev); |
|
- | 6152 | ret = si_thermal_set_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); |
|
- | 6153 | if (ret) |
|
- | 6154 | return ret; |
|
- | 6155 | ret = si_thermal_enable_alert(rdev, true); |
|
- | 6156 | if (ret) |
|
- | 6157 | return ret; |
|
- | 6158 | if (rdev->pm.dpm.fan.ucode_fan_control) { |
|
- | 6159 | ret = si_halt_smc(rdev); |
|
- | 6160 | if (ret) |
|
- | 6161 | return ret; |
|
- | 6162 | ret = si_thermal_setup_fan_table(rdev); |
|
- | 6163 | if (ret) |
|
- | 6164 | return ret; |
|
- | 6165 | ret = si_resume_smc(rdev); |
|
- | 6166 | if (ret) |
|
- | 6167 | return ret; |
|
- | 6168 | si_thermal_start_smc_fan_control(rdev); |
|
- | 6169 | } |
|
- | 6170 | ||
- | 6171 | return 0; |
|
- | 6172 | } |
|
- | 6173 | ||
- | 6174 | static void si_thermal_stop_thermal_controller(struct radeon_device *rdev) |
|
- | 6175 | { |
|
- | 6176 | if (!rdev->pm.no_fan) { |
|
- | 6177 | si_fan_ctrl_set_default_mode(rdev); |
|
- | 6178 | si_fan_ctrl_stop_smc_fan_control(rdev); |
|
- | 6179 | } |
|
5842 | } |
6180 | } |
5843 | 6181 | ||
5844 | int si_dpm_enable(struct radeon_device *rdev) |
6182 | int si_dpm_enable(struct radeon_device *rdev) |
5845 | { |
6183 | { |
5846 | struct rv7xx_power_info *pi = rv770_get_pi(rdev); |
6184 | struct rv7xx_power_info *pi = rv770_get_pi(rdev); |
Line 5951... | Line 6289... | ||
5951 | si_enable_sclk_control(rdev, true); |
6289 | si_enable_sclk_control(rdev, true); |
5952 | si_start_dpm(rdev); |
6290 | si_start_dpm(rdev); |
Line 5953... | Line 6291... | ||
5953 | 6291 | ||
Line -... | Line 6292... | ||
- | 6292 | si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); |
|
- | 6293 | ||
5954 | si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); |
6294 | si_thermal_start_thermal_controller(rdev); |
Line 5955... | Line 6295... | ||
5955 | 6295 | ||
5956 | ni_update_current_ps(rdev, boot_ps); |
6296 | ni_update_current_ps(rdev, boot_ps); |
Line 5957... | Line 6297... | ||
5957 | 6297 | ||
5958 | return 0; |
6298 | return 0; |
5959 | } |
6299 | } |
Line 5960... | Line -... | ||
5960 | - | ||
5961 | int si_dpm_late_enable(struct radeon_device *rdev) |
6300 | |
- | 6301 | static int si_set_temperature_range(struct radeon_device *rdev) |
|
5962 | { |
6302 | { |
5963 | int ret; |
- | |
5964 | 6303 | int ret; |
|
- | 6304 | ||
- | 6305 | ret = si_thermal_enable_alert(rdev, false); |
|
- | 6306 | if (ret) |
|
5965 | if (rdev->irq.installed && |
6307 | return ret; |
5966 | r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { |
6308 | ret = si_thermal_set_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); |
5967 | PPSMC_Result result; |
- | |
5968 | - | ||
5969 | ret = si_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); |
- | |
Line 5970... | Line 6309... | ||
5970 | if (ret) |
6309 | if (ret) |
5971 | return ret; |
- | |
5972 | rdev->irq.dpm_thermal = true; |
6310 | return ret; |
Line -... | Line 6311... | ||
- | 6311 | ret = si_thermal_enable_alert(rdev, true); |
|
- | 6312 | if (ret) |
|
- | 6313 | return ret; |
|
- | 6314 | ||
- | 6315 | return ret; |
|
- | 6316 | } |
|
- | 6317 | ||
- | 6318 | int si_dpm_late_enable(struct radeon_device *rdev) |
|
5973 | radeon_irq_set(rdev); |
6319 | { |
5974 | result = si_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); |
6320 | int ret; |
Line 5975... | Line 6321... | ||
5975 | 6321 | ||
5976 | if (result != PPSMC_Result_OK) |
6322 | ret = si_set_temperature_range(rdev); |
5977 | DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); |
6323 | if (ret) |
5978 | } |
6324 | return ret; |
Line 5979... | Line 6325... | ||
5979 | 6325 | ||
5980 | return 0; |
6326 | return ret; |
- | 6327 | } |
|
5981 | } |
6328 | |
5982 | 6329 | void si_dpm_disable(struct radeon_device *rdev) |
|
5983 | void si_dpm_disable(struct radeon_device *rdev) |
6330 | { |
5984 | { |
6331 | struct rv7xx_power_info *pi = rv770_get_pi(rdev); |
5985 | struct rv7xx_power_info *pi = rv770_get_pi(rdev); |
6332 | struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps; |
Line 6523... | Line 6870... | ||
6523 | if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) || |
6870 | if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) || |
6524 | (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0)) |
6871 | (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0)) |
6525 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc = |
6872 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc = |
6526 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac; |
6873 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac; |
Line -... | Line 6874... | ||
- | 6874 | ||
- | 6875 | si_pi->fan_ctrl_is_in_default_mode = true; |
|
- | 6876 | rdev->pm.dpm.fan.ucode_fan_control = false; |
|
6527 | 6877 | ||
6528 | return 0; |
6878 | return 0; |
Line 6529... | Line 6879... | ||
6529 | } |
6879 | } |
6530 | 6880 |