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

drm/radeon/dpm: add smc fan control for SI (v2)

Enable smc fan control for SI boards. Should
reduce the fan noise on systems with a higher
default fan profile.

v2: disable by default, add rpm controls

bug:
https://bugs.freedesktop.org/show_bug.cgi?id=73338

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

+401 -7
+5
drivers/gpu/drm/radeon/ppsmc.h
··· 56 56 #define PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE 0x20 57 57 #define PPSMC_STATEFLAG_DEEPSLEEP_BYPASS 0x40 58 58 59 + #define FDO_MODE_HARDWARE 0 60 + #define FDO_MODE_PIECE_WISE_LINEAR 1 61 + 59 62 #define PPSMC_Result_OK ((uint8_t)0x01) 60 63 #define PPSMC_Result_Failed ((uint8_t)0xFF) 61 64 ··· 82 79 #define PPSMC_MSG_DisableCac ((uint8_t)0x54) 83 80 #define PPSMC_TDPClampingActive ((uint8_t)0x59) 84 81 #define PPSMC_TDPClampingInactive ((uint8_t)0x5A) 82 + #define PPSMC_StartFanControl ((uint8_t)0x5B) 83 + #define PPSMC_StopFanControl ((uint8_t)0x5C) 85 84 #define PPSMC_MSG_NoDisplay ((uint8_t)0x5D) 86 85 #define PPSMC_MSG_HasDisplay ((uint8_t)0x5E) 87 86 #define PPSMC_MSG_UVDPowerOFF ((uint8_t)0x60)
+3
drivers/gpu/drm/radeon/r600_dpm.h
··· 96 96 #define R600_TEMP_RANGE_MIN (90 * 1000) 97 97 #define R600_TEMP_RANGE_MAX (120 * 1000) 98 98 99 + #define FDO_PWM_MODE_STATIC 1 100 + #define FDO_PWM_MODE_STATIC_RPM 5 101 + 99 102 enum r600_power_level { 100 103 R600_POWER_LEVEL_LOW = 0, 101 104 R600_POWER_LEVEL_MEDIUM = 1,
+324 -6
drivers/gpu/drm/radeon/si_dpm.c
··· 3398 3398 3399 3399 ret = si_read_smc_sram_dword(rdev, 3400 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 + 3408 + ret = si_read_smc_sram_dword(rdev, 3409 + SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 3401 3410 SISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable, 3402 3411 &tmp, si_pi->sram_end); 3403 3412 if (ret) ··· 5834 5825 if (enable) { 5835 5826 PPSMC_Result result; 5836 5827 5837 - thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; 5838 - rdev->irq.dpm_thermal = true; 5828 + thermal_int &= ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); 5829 + WREG32(CG_THERMAL_INT, thermal_int); 5830 + rdev->irq.dpm_thermal = false; 5839 5831 result = si_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 5840 5832 if (result != PPSMC_Result_OK) { 5841 5833 DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); 5842 5834 return -EINVAL; 5843 5835 } 5844 5836 } else { 5845 - thermal_int &= ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); 5846 - rdev->irq.dpm_thermal = false; 5837 + thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; 5838 + WREG32(CG_THERMAL_INT, thermal_int); 5839 + rdev->irq.dpm_thermal = true; 5847 5840 } 5848 - 5849 - WREG32(CG_THERMAL_INT, thermal_int); 5850 5841 5851 5842 return 0; 5852 5843 } ··· 5874 5865 rdev->pm.dpm.thermal.max_temp = high_temp; 5875 5866 5876 5867 return 0; 5868 + } 5869 + 5870 + static void si_fan_ctrl_set_static_mode(struct radeon_device *rdev, u32 mode) 5871 + { 5872 + struct si_power_info *si_pi = si_get_pi(rdev); 5873 + u32 tmp; 5874 + 5875 + if (si_pi->fan_ctrl_is_in_default_mode) { 5876 + tmp = (RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK) >> FDO_PWM_MODE_SHIFT; 5877 + si_pi->fan_ctrl_default_mode = tmp; 5878 + tmp = (RREG32(CG_FDO_CTRL2) & TMIN_MASK) >> TMIN_SHIFT; 5879 + si_pi->t_min = tmp; 5880 + si_pi->fan_ctrl_is_in_default_mode = false; 5881 + } 5882 + 5883 + tmp = RREG32(CG_FDO_CTRL2) & ~TMIN_MASK; 5884 + tmp |= TMIN(0); 5885 + WREG32(CG_FDO_CTRL2, tmp); 5886 + 5887 + tmp = RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK; 5888 + tmp |= FDO_PWM_MODE(mode); 5889 + WREG32(CG_FDO_CTRL2, tmp); 5890 + } 5891 + 5892 + static int si_thermal_setup_fan_table(struct radeon_device *rdev) 5893 + { 5894 + struct si_power_info *si_pi = si_get_pi(rdev); 5895 + PP_SIslands_FanTable fan_table = { FDO_MODE_HARDWARE }; 5896 + u32 duty100; 5897 + u32 t_diff1, t_diff2, pwm_diff1, pwm_diff2; 5898 + u16 fdo_min, slope1, slope2; 5899 + u32 reference_clock, tmp; 5900 + int ret; 5901 + u64 tmp64; 5902 + 5903 + if (!si_pi->fan_table_start) { 5904 + rdev->pm.dpm.fan.ucode_fan_control = false; 5905 + return 0; 5906 + } 5907 + 5908 + duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; 5909 + 5910 + if (duty100 == 0) { 5911 + rdev->pm.dpm.fan.ucode_fan_control = false; 5912 + return 0; 5913 + } 5914 + 5915 + tmp64 = (u64)rdev->pm.dpm.fan.pwm_min * duty100; 5916 + do_div(tmp64, 10000); 5917 + fdo_min = (u16)tmp64; 5918 + 5919 + t_diff1 = rdev->pm.dpm.fan.t_med - rdev->pm.dpm.fan.t_min; 5920 + t_diff2 = rdev->pm.dpm.fan.t_high - rdev->pm.dpm.fan.t_med; 5921 + 5922 + pwm_diff1 = rdev->pm.dpm.fan.pwm_med - rdev->pm.dpm.fan.pwm_min; 5923 + pwm_diff2 = rdev->pm.dpm.fan.pwm_high - rdev->pm.dpm.fan.pwm_med; 5924 + 5925 + slope1 = (u16)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100); 5926 + slope2 = (u16)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100); 5927 + 5928 + fan_table.slope1 = cpu_to_be16(slope1); 5929 + fan_table.slope2 = cpu_to_be16(slope2); 5930 + 5931 + fan_table.fdo_min = cpu_to_be16(fdo_min); 5932 + 5933 + fan_table.hys_down = cpu_to_be16(rdev->pm.dpm.fan.t_hyst); 5934 + 5935 + fan_table.hys_up = cpu_to_be16(1); 5936 + 5937 + fan_table.hys_slope = cpu_to_be16(1); 5938 + 5939 + fan_table.temp_resp_lim = cpu_to_be16(5); 5940 + 5941 + reference_clock = radeon_get_xclk(rdev); 5942 + 5943 + fan_table.refresh_period = cpu_to_be32((rdev->pm.dpm.fan.cycle_delay * 5944 + reference_clock) / 1600); 5945 + 5946 + fan_table.fdo_max = cpu_to_be16((u16)duty100); 5947 + 5948 + tmp = (RREG32(CG_MULT_THERMAL_CTRL) & TEMP_SEL_MASK) >> TEMP_SEL_SHIFT; 5949 + fan_table.temp_src = (uint8_t)tmp; 5950 + 5951 + ret = si_copy_bytes_to_smc(rdev, 5952 + si_pi->fan_table_start, 5953 + (u8 *)(&fan_table), 5954 + sizeof(fan_table), 5955 + si_pi->sram_end); 5956 + 5957 + if (ret) { 5958 + DRM_ERROR("Failed to load fan table to the SMC."); 5959 + rdev->pm.dpm.fan.ucode_fan_control = false; 5960 + } 5961 + 5962 + return 0; 5963 + } 5964 + 5965 + static int si_fan_ctrl_start_smc_fan_control(struct radeon_device *rdev) 5966 + { 5967 + PPSMC_Result ret; 5968 + 5969 + ret = si_send_msg_to_smc(rdev, PPSMC_StartFanControl); 5970 + if (ret == PPSMC_Result_OK) 5971 + return 0; 5972 + else 5973 + return -EINVAL; 5974 + } 5975 + 5976 + static int si_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev) 5977 + { 5978 + PPSMC_Result ret; 5979 + 5980 + ret = si_send_msg_to_smc(rdev, PPSMC_StopFanControl); 5981 + if (ret == PPSMC_Result_OK) 5982 + return 0; 5983 + else 5984 + return -EINVAL; 5985 + } 5986 + 5987 + #if 0 5988 + static int si_fan_ctrl_get_fan_speed_percent(struct radeon_device *rdev, 5989 + u32 *speed) 5990 + { 5991 + u32 duty, duty100; 5992 + u64 tmp64; 5993 + 5994 + if (rdev->pm.no_fan) 5995 + return -ENOENT; 5996 + 5997 + duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; 5998 + duty = (RREG32(CG_THERMAL_STATUS) & FDO_PWM_DUTY_MASK) >> FDO_PWM_DUTY_SHIFT; 5999 + 6000 + if (duty100 == 0) 6001 + return -EINVAL; 6002 + 6003 + tmp64 = (u64)duty * 100; 6004 + do_div(tmp64, duty100); 6005 + *speed = (u32)tmp64; 6006 + 6007 + if (*speed > 100) 6008 + *speed = 100; 6009 + 6010 + return 0; 6011 + } 6012 + 6013 + static int si_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev, 6014 + u32 speed) 6015 + { 6016 + u32 tmp; 6017 + u32 duty, duty100; 6018 + u64 tmp64; 6019 + 6020 + if (rdev->pm.no_fan) 6021 + return -ENOENT; 6022 + 6023 + if (speed > 100) 6024 + return -EINVAL; 6025 + 6026 + if (rdev->pm.dpm.fan.ucode_fan_control) 6027 + si_fan_ctrl_stop_smc_fan_control(rdev); 6028 + 6029 + duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; 6030 + 6031 + if (duty100 == 0) 6032 + return -EINVAL; 6033 + 6034 + tmp64 = (u64)speed * duty100; 6035 + do_div(tmp64, 100); 6036 + duty = (u32)tmp64; 6037 + 6038 + tmp = RREG32(CG_FDO_CTRL0) & ~FDO_STATIC_DUTY_MASK; 6039 + tmp |= FDO_STATIC_DUTY(duty); 6040 + WREG32(CG_FDO_CTRL0, tmp); 6041 + 6042 + si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC); 6043 + 6044 + return 0; 6045 + } 6046 + 6047 + static int si_fan_ctrl_get_fan_speed_rpm(struct radeon_device *rdev, 6048 + u32 *speed) 6049 + { 6050 + u32 tach_period; 6051 + u32 xclk = radeon_get_xclk(rdev); 6052 + 6053 + if (rdev->pm.no_fan) 6054 + return -ENOENT; 6055 + 6056 + if (rdev->pm.fan_pulses_per_revolution == 0) 6057 + return -ENOENT; 6058 + 6059 + tach_period = (RREG32(CG_TACH_STATUS) & TACH_PERIOD_MASK) >> TACH_PERIOD_SHIFT; 6060 + if (tach_period == 0) 6061 + return -ENOENT; 6062 + 6063 + *speed = 60 * xclk * 10000 / tach_period; 6064 + 6065 + return 0; 6066 + } 6067 + 6068 + static int si_fan_ctrl_set_fan_speed_rpm(struct radeon_device *rdev, 6069 + u32 speed) 6070 + { 6071 + u32 tach_period, tmp; 6072 + u32 xclk = radeon_get_xclk(rdev); 6073 + 6074 + if (rdev->pm.no_fan) 6075 + return -ENOENT; 6076 + 6077 + if (rdev->pm.fan_pulses_per_revolution == 0) 6078 + return -ENOENT; 6079 + 6080 + if ((speed < rdev->pm.fan_min_rpm) || 6081 + (speed > rdev->pm.fan_max_rpm)) 6082 + return -EINVAL; 6083 + 6084 + if (rdev->pm.dpm.fan.ucode_fan_control) 6085 + si_fan_ctrl_stop_smc_fan_control(rdev); 6086 + 6087 + tach_period = 60 * xclk * 10000 / (8 * speed); 6088 + tmp = RREG32(CG_TACH_CTRL) & ~TARGET_PERIOD_MASK; 6089 + tmp |= TARGET_PERIOD(tach_period); 6090 + WREG32(CG_TACH_CTRL, tmp); 6091 + 6092 + si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC); 6093 + 6094 + return 0; 6095 + } 6096 + #endif 6097 + 6098 + static void si_fan_ctrl_set_default_mode(struct radeon_device *rdev) 6099 + { 6100 + struct si_power_info *si_pi = si_get_pi(rdev); 6101 + u32 tmp; 6102 + 6103 + if (!si_pi->fan_ctrl_is_in_default_mode) { 6104 + tmp = RREG32(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK; 6105 + tmp |= FDO_PWM_MODE(si_pi->fan_ctrl_default_mode); 6106 + WREG32(CG_FDO_CTRL2, tmp); 6107 + 6108 + tmp = RREG32(CG_FDO_CTRL2) & TMIN_MASK; 6109 + tmp |= TMIN(si_pi->t_min); 6110 + WREG32(CG_FDO_CTRL2, tmp); 6111 + si_pi->fan_ctrl_is_in_default_mode = true; 6112 + } 6113 + } 6114 + 6115 + static void si_thermal_start_smc_fan_control(struct radeon_device *rdev) 6116 + { 6117 + if (rdev->pm.dpm.fan.ucode_fan_control) { 6118 + si_fan_ctrl_start_smc_fan_control(rdev); 6119 + si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC); 6120 + } 6121 + } 6122 + 6123 + static void si_thermal_initialize(struct radeon_device *rdev) 6124 + { 6125 + u32 tmp; 6126 + 6127 + if (rdev->pm.fan_pulses_per_revolution) { 6128 + tmp = RREG32(CG_TACH_CTRL) & ~EDGE_PER_REV_MASK; 6129 + tmp |= EDGE_PER_REV(rdev->pm.fan_pulses_per_revolution -1); 6130 + WREG32(CG_TACH_CTRL, tmp); 6131 + } 6132 + 6133 + tmp = RREG32(CG_FDO_CTRL2) & ~TACH_PWM_RESP_RATE_MASK; 6134 + tmp |= TACH_PWM_RESP_RATE(0x28); 6135 + WREG32(CG_FDO_CTRL2, tmp); 6136 + } 6137 + 6138 + static int si_thermal_start_thermal_controller(struct radeon_device *rdev) 6139 + { 6140 + int ret; 6141 + 6142 + si_thermal_initialize(rdev); 6143 + ret = si_thermal_set_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 6144 + if (ret) 6145 + return ret; 6146 + ret = si_thermal_enable_alert(rdev, true); 6147 + if (ret) 6148 + return ret; 6149 + if (rdev->pm.dpm.fan.ucode_fan_control) { 6150 + ret = si_halt_smc(rdev); 6151 + if (ret) 6152 + return ret; 6153 + ret = si_thermal_setup_fan_table(rdev); 6154 + if (ret) 6155 + return ret; 6156 + ret = si_resume_smc(rdev); 6157 + if (ret) 6158 + return ret; 6159 + si_thermal_start_smc_fan_control(rdev); 6160 + } 6161 + 6162 + return 0; 6163 + } 6164 + 6165 + static void si_thermal_stop_thermal_controller(struct radeon_device *rdev) 6166 + { 6167 + if (!rdev->pm.no_fan) { 6168 + si_fan_ctrl_set_default_mode(rdev); 6169 + si_fan_ctrl_stop_smc_fan_control(rdev); 6170 + } 5877 6171 } 5878 6172 5879 6173 int si_dpm_enable(struct radeon_device *rdev) ··· 6291 5979 6292 5980 si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 6293 5981 5982 + si_thermal_start_thermal_controller(rdev); 5983 + 6294 5984 ni_update_current_ps(rdev, boot_ps); 6295 5985 6296 5986 return 0; ··· 6333 6019 6334 6020 if (!si_is_smc_running(rdev)) 6335 6021 return; 6022 + si_thermal_stop_thermal_controller(rdev); 6336 6023 si_disable_ulv(rdev); 6337 6024 si_clear_vc(rdev); 6338 6025 if (pi->thermal_protection) ··· 6871 6556 (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0)) 6872 6557 rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc = 6873 6558 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac; 6559 + 6560 + si_pi->fan_ctrl_is_in_default_mode = true; 6561 + rdev->pm.dpm.fan.ucode_fan_control = false; 6874 6562 6875 6563 return 0; 6876 6564 }
+5
drivers/gpu/drm/radeon/si_dpm.h
··· 182 182 u32 dte_table_start; 183 183 u32 spll_table_start; 184 184 u32 papm_cfg_table_start; 185 + u32 fan_table_start; 185 186 /* CAC stuff */ 186 187 const struct si_cac_config_reg *cac_weights; 187 188 const struct si_cac_config_reg *lcac_config; ··· 198 197 /* SVI2 */ 199 198 u8 svd_gpio_id; 200 199 u8 svc_gpio_id; 200 + /* fan control */ 201 + bool fan_ctrl_is_in_default_mode; 202 + u32 t_min; 203 + u32 fan_ctrl_default_mode; 201 204 }; 202 205 203 206 #define SISLANDS_INITIAL_STATE_ARB_INDEX 0
+39 -1
drivers/gpu/drm/radeon/sid.h
··· 180 180 #define DIG_THERM_DPM(x) ((x) << 14) 181 181 #define DIG_THERM_DPM_MASK 0x003FC000 182 182 #define DIG_THERM_DPM_SHIFT 14 183 - 183 + #define CG_THERMAL_STATUS 0x704 184 + #define FDO_PWM_DUTY(x) ((x) << 9) 185 + #define FDO_PWM_DUTY_MASK (0xff << 9) 186 + #define FDO_PWM_DUTY_SHIFT 9 184 187 #define CG_THERMAL_INT 0x708 185 188 #define DIG_THERM_INTH(x) ((x) << 8) 186 189 #define DIG_THERM_INTH_MASK 0x0000FF00 ··· 194 191 #define THERM_INT_MASK_HIGH (1 << 24) 195 192 #define THERM_INT_MASK_LOW (1 << 25) 196 193 194 + #define CG_MULT_THERMAL_CTRL 0x710 195 + #define TEMP_SEL(x) ((x) << 20) 196 + #define TEMP_SEL_MASK (0xff << 20) 197 + #define TEMP_SEL_SHIFT 20 197 198 #define CG_MULT_THERMAL_STATUS 0x714 198 199 #define ASIC_MAX_TEMP(x) ((x) << 0) 199 200 #define ASIC_MAX_TEMP_MASK 0x000001ff ··· 205 198 #define CTF_TEMP(x) ((x) << 9) 206 199 #define CTF_TEMP_MASK 0x0003fe00 207 200 #define CTF_TEMP_SHIFT 9 201 + 202 + #define CG_FDO_CTRL0 0x754 203 + #define FDO_STATIC_DUTY(x) ((x) << 0) 204 + #define FDO_STATIC_DUTY_MASK 0x0000000F 205 + #define FDO_STATIC_DUTY_SHIFT 0 206 + #define CG_FDO_CTRL1 0x758 207 + #define FMAX_DUTY100(x) ((x) << 0) 208 + #define FMAX_DUTY100_MASK 0x0000000F 209 + #define FMAX_DUTY100_SHIFT 0 210 + #define CG_FDO_CTRL2 0x75C 211 + #define TMIN(x) ((x) << 0) 212 + #define TMIN_MASK 0x0000000F 213 + #define TMIN_SHIFT 0 214 + #define FDO_PWM_MODE(x) ((x) << 11) 215 + #define FDO_PWM_MODE_MASK (3 << 11) 216 + #define FDO_PWM_MODE_SHIFT 11 217 + #define TACH_PWM_RESP_RATE(x) ((x) << 25) 218 + #define TACH_PWM_RESP_RATE_MASK (0x7f << 25) 219 + #define TACH_PWM_RESP_RATE_SHIFT 25 220 + 221 + #define CG_TACH_CTRL 0x770 222 + # define EDGE_PER_REV(x) ((x) << 0) 223 + # define EDGE_PER_REV_MASK (0x7 << 0) 224 + # define EDGE_PER_REV_SHIFT 0 225 + # define TARGET_PERIOD(x) ((x) << 3) 226 + # define TARGET_PERIOD_MASK 0xfffffff8 227 + # define TARGET_PERIOD_SHIFT 3 228 + #define CG_TACH_STATUS 0x774 229 + # define TACH_PERIOD(x) ((x) << 0) 230 + # define TACH_PERIOD_MASK 0xffffffff 231 + # define TACH_PERIOD_SHIFT 0 208 232 209 233 #define GENERAL_PWRMGT 0x780 210 234 # define GLOBAL_PWRMGT_EN (1 << 0)
+25
drivers/gpu/drm/radeon/sislands_smc.h
··· 245 245 #define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd 0x11c 246 246 #define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc 0x120 247 247 248 + struct PP_SIslands_FanTable 249 + { 250 + uint8_t fdo_mode; 251 + uint8_t padding; 252 + int16_t temp_min; 253 + int16_t temp_med; 254 + int16_t temp_max; 255 + int16_t slope1; 256 + int16_t slope2; 257 + int16_t fdo_min; 258 + int16_t hys_up; 259 + int16_t hys_down; 260 + int16_t hys_slope; 261 + int16_t temp_resp_lim; 262 + int16_t temp_curr; 263 + int16_t slope_curr; 264 + int16_t pwm_curr; 265 + uint32_t refresh_period; 266 + int16_t fdo_max; 267 + uint8_t temp_src; 268 + int8_t padding2; 269 + }; 270 + 271 + typedef struct PP_SIslands_FanTable PP_SIslands_FanTable; 272 + 248 273 #define SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16 249 274 #define SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES 32 250 275