diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2017-03-30 05:58:05 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-04-07 15:15:44 -0400 |
commit | 8250880ed87f806cc1f7964cd8ddda18d9014288 (patch) | |
tree | 7519052c5f1c0fd83e71f40fc31c4a10078b0463 | |
parent | 1e1eb6a893af737e9e725ae52e7ce4f5410557b6 (diff) |
drm/amd/powerplay: add fan controller table v11 support.
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega10_pptable.h | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c | 142 |
2 files changed, 120 insertions, 45 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_pptable.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_pptable.h index 63a03895b84e..6a907c93fd9c 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_pptable.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_pptable.h | |||
@@ -250,6 +250,29 @@ typedef struct _ATOM_Vega10_Fan_Table { | |||
250 | USHORT usFanStartTemperature; | 250 | USHORT usFanStartTemperature; |
251 | } ATOM_Vega10_Fan_Table; | 251 | } ATOM_Vega10_Fan_Table; |
252 | 252 | ||
253 | typedef struct _ATOM_Vega10_Fan_Table_V2 { | ||
254 | UCHAR ucRevId; | ||
255 | USHORT usFanOutputSensitivity; | ||
256 | USHORT usFanAcousticLimitRpm; | ||
257 | USHORT usThrottlingRPM; | ||
258 | USHORT usTargetTemperature; | ||
259 | USHORT usMinimumPWMLimit; | ||
260 | USHORT usTargetGfxClk; | ||
261 | USHORT usFanGainEdge; | ||
262 | USHORT usFanGainHotspot; | ||
263 | USHORT usFanGainLiquid; | ||
264 | USHORT usFanGainVrVddc; | ||
265 | USHORT usFanGainVrMvdd; | ||
266 | USHORT usFanGainPlx; | ||
267 | USHORT usFanGainHbm; | ||
268 | UCHAR ucEnableZeroRPM; | ||
269 | USHORT usFanStopTemperature; | ||
270 | USHORT usFanStartTemperature; | ||
271 | UCHAR ucFanParameters; | ||
272 | UCHAR ucFanMinRPM; | ||
273 | UCHAR ucFanMaxRPM; | ||
274 | } ATOM_Vega10_Fan_Table_V2; | ||
275 | |||
253 | typedef struct _ATOM_Vega10_Thermal_Controller { | 276 | typedef struct _ATOM_Vega10_Thermal_Controller { |
254 | UCHAR ucRevId; | 277 | UCHAR ucRevId; |
255 | UCHAR ucType; /* one of ATOM_VEGA10_PP_THERMALCONTROLLER_*/ | 278 | UCHAR ucType; /* one of ATOM_VEGA10_PP_THERMALCONTROLLER_*/ |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c index d14d885c042e..8b55ae01132d 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c | |||
@@ -116,14 +116,16 @@ static int init_thermal_controller( | |||
116 | const ATOM_Vega10_POWERPLAYTABLE *powerplay_table) | 116 | const ATOM_Vega10_POWERPLAYTABLE *powerplay_table) |
117 | { | 117 | { |
118 | const ATOM_Vega10_Thermal_Controller *thermal_controller; | 118 | const ATOM_Vega10_Thermal_Controller *thermal_controller; |
119 | const ATOM_Vega10_Fan_Table *fan_table; | 119 | const Vega10_PPTable_Generic_SubTable_Header *header; |
120 | const ATOM_Vega10_Fan_Table *fan_table_v1; | ||
121 | const ATOM_Vega10_Fan_Table_V2 *fan_table_v2; | ||
120 | 122 | ||
121 | thermal_controller = (ATOM_Vega10_Thermal_Controller *) | 123 | thermal_controller = (ATOM_Vega10_Thermal_Controller *) |
122 | (((unsigned long)powerplay_table) + | 124 | (((unsigned long)powerplay_table) + |
123 | le16_to_cpu(powerplay_table->usThermalControllerOffset)); | 125 | le16_to_cpu(powerplay_table->usThermalControllerOffset)); |
124 | 126 | ||
125 | PP_ASSERT_WITH_CODE((powerplay_table->usThermalControllerOffset != 0), | 127 | PP_ASSERT_WITH_CODE((powerplay_table->usThermalControllerOffset != 0), |
126 | "Thermal controller table not set!", return -1); | 128 | "Thermal controller table not set!", return -EINVAL); |
127 | 129 | ||
128 | hwmgr->thermal_controller.ucType = thermal_controller->ucType; | 130 | hwmgr->thermal_controller.ucType = thermal_controller->ucType; |
129 | hwmgr->thermal_controller.ucI2cLine = thermal_controller->ucI2cLine; | 131 | hwmgr->thermal_controller.ucI2cLine = thermal_controller->ucI2cLine; |
@@ -142,6 +144,9 @@ static int init_thermal_controller( | |||
142 | hwmgr->thermal_controller.fanInfo.ulMaxRPM = | 144 | hwmgr->thermal_controller.fanInfo.ulMaxRPM = |
143 | thermal_controller->ucFanMaxRPM * 100UL; | 145 | thermal_controller->ucFanMaxRPM * 100UL; |
144 | 146 | ||
147 | hwmgr->thermal_controller.advanceFanControlParameters.ulCycleDelay | ||
148 | = 100000; | ||
149 | |||
145 | set_hw_cap( | 150 | set_hw_cap( |
146 | hwmgr, | 151 | hwmgr, |
147 | ATOM_VEGA10_PP_THERMALCONTROLLER_NONE != hwmgr->thermal_controller.ucType, | 152 | ATOM_VEGA10_PP_THERMALCONTROLLER_NONE != hwmgr->thermal_controller.ucType, |
@@ -150,54 +155,101 @@ static int init_thermal_controller( | |||
150 | if (!powerplay_table->usFanTableOffset) | 155 | if (!powerplay_table->usFanTableOffset) |
151 | return 0; | 156 | return 0; |
152 | 157 | ||
153 | fan_table = (const ATOM_Vega10_Fan_Table *) | 158 | header = (const Vega10_PPTable_Generic_SubTable_Header *) |
154 | (((unsigned long)powerplay_table) + | 159 | (((unsigned long)powerplay_table) + |
155 | le16_to_cpu(powerplay_table->usFanTableOffset)); | 160 | le16_to_cpu(powerplay_table->usFanTableOffset)); |
156 | 161 | ||
157 | PP_ASSERT_WITH_CODE((fan_table->ucRevId >= 8), | 162 | if (header->ucRevId == 10) { |
158 | "Invalid Input Fan Table!", return -1); | 163 | fan_table_v1 = (ATOM_Vega10_Fan_Table *)header; |
159 | 164 | ||
160 | hwmgr->thermal_controller.advanceFanControlParameters.ulCycleDelay | 165 | PP_ASSERT_WITH_CODE((fan_table_v1->ucRevId >= 8), |
161 | = 100000; | 166 | "Invalid Input Fan Table!", return -EINVAL); |
162 | phm_cap_set(hwmgr->platform_descriptor.platformCaps, | ||
163 | PHM_PlatformCaps_MicrocodeFanControl); | ||
164 | |||
165 | hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity = | ||
166 | le16_to_cpu(fan_table->usFanOutputSensitivity); | ||
167 | hwmgr->thermal_controller.advanceFanControlParameters.usMaxFanRPM = | ||
168 | le16_to_cpu(fan_table->usFanRPMMax); | ||
169 | hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMMaxLimit = | ||
170 | le16_to_cpu(fan_table->usThrottlingRPM); | ||
171 | hwmgr->thermal_controller.advanceFanControlParameters.ulMinFanSCLKAcousticLimit = | ||
172 | le32_to_cpu((uint32_t)(fan_table->usFanAcousticLimit)); | ||
173 | hwmgr->thermal_controller.advanceFanControlParameters.usTMax = | ||
174 | le16_to_cpu(fan_table->usTargetTemperature); | ||
175 | hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin = | ||
176 | le16_to_cpu(fan_table->usMinimumPWMLimit); | ||
177 | hwmgr->thermal_controller.advanceFanControlParameters.ulTargetGfxClk = | ||
178 | le32_to_cpu((uint32_t)(fan_table->usTargetGfxClk)); | ||
179 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainEdge = | ||
180 | le16_to_cpu(fan_table->usFanGainEdge); | ||
181 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHotspot = | ||
182 | le16_to_cpu(fan_table->usFanGainHotspot); | ||
183 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainLiquid = | ||
184 | le16_to_cpu(fan_table->usFanGainLiquid); | ||
185 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrVddc = | ||
186 | le16_to_cpu(fan_table->usFanGainVrVddc); | ||
187 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrMvdd = | ||
188 | le16_to_cpu(fan_table->usFanGainVrMvdd); | ||
189 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainPlx = | ||
190 | le16_to_cpu(fan_table->usFanGainPlx); | ||
191 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHbm = | ||
192 | le16_to_cpu(fan_table->usFanGainHbm); | ||
193 | |||
194 | hwmgr->thermal_controller.advanceFanControlParameters.ucEnableZeroRPM = | ||
195 | fan_table->ucEnableZeroRPM; | ||
196 | hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStopTemperature = | ||
197 | le16_to_cpu(fan_table->usFanStopTemperature); | ||
198 | hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStartTemperature = | ||
199 | le16_to_cpu(fan_table->usFanStartTemperature); | ||
200 | 167 | ||
168 | phm_cap_set(hwmgr->platform_descriptor.platformCaps, | ||
169 | PHM_PlatformCaps_MicrocodeFanControl); | ||
170 | |||
171 | hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity = | ||
172 | le16_to_cpu(fan_table_v1->usFanOutputSensitivity); | ||
173 | hwmgr->thermal_controller.advanceFanControlParameters.usMaxFanRPM = | ||
174 | le16_to_cpu(fan_table_v1->usFanRPMMax); | ||
175 | hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMMaxLimit = | ||
176 | le16_to_cpu(fan_table_v1->usThrottlingRPM); | ||
177 | hwmgr->thermal_controller.advanceFanControlParameters.ulMinFanSCLKAcousticLimit = | ||
178 | le16_to_cpu(fan_table_v1->usFanAcousticLimit); | ||
179 | hwmgr->thermal_controller.advanceFanControlParameters.usTMax = | ||
180 | le16_to_cpu(fan_table_v1->usTargetTemperature); | ||
181 | hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin = | ||
182 | le16_to_cpu(fan_table_v1->usMinimumPWMLimit); | ||
183 | hwmgr->thermal_controller.advanceFanControlParameters.ulTargetGfxClk = | ||
184 | le16_to_cpu(fan_table_v1->usTargetGfxClk); | ||
185 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainEdge = | ||
186 | le16_to_cpu(fan_table_v1->usFanGainEdge); | ||
187 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHotspot = | ||
188 | le16_to_cpu(fan_table_v1->usFanGainHotspot); | ||
189 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainLiquid = | ||
190 | le16_to_cpu(fan_table_v1->usFanGainLiquid); | ||
191 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrVddc = | ||
192 | le16_to_cpu(fan_table_v1->usFanGainVrVddc); | ||
193 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrMvdd = | ||
194 | le16_to_cpu(fan_table_v1->usFanGainVrMvdd); | ||
195 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainPlx = | ||
196 | le16_to_cpu(fan_table_v1->usFanGainPlx); | ||
197 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHbm = | ||
198 | le16_to_cpu(fan_table_v1->usFanGainHbm); | ||
199 | |||
200 | hwmgr->thermal_controller.advanceFanControlParameters.ucEnableZeroRPM = | ||
201 | fan_table_v1->ucEnableZeroRPM; | ||
202 | hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStopTemperature = | ||
203 | le16_to_cpu(fan_table_v1->usFanStopTemperature); | ||
204 | hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStartTemperature = | ||
205 | le16_to_cpu(fan_table_v1->usFanStartTemperature); | ||
206 | } else if (header->ucRevId > 10) { | ||
207 | fan_table_v2 = (ATOM_Vega10_Fan_Table_V2 *)header; | ||
208 | |||
209 | hwmgr->thermal_controller.fanInfo.ucTachometerPulsesPerRevolution = | ||
210 | fan_table_v2->ucFanParameters & ATOM_VEGA10_PP_FANPARAMETERS_TACHOMETER_PULSES_PER_REVOLUTION_MASK; | ||
211 | hwmgr->thermal_controller.fanInfo.ulMinRPM = fan_table_v2->ucFanMinRPM * 100UL; | ||
212 | hwmgr->thermal_controller.fanInfo.ulMaxRPM = fan_table_v2->ucFanMaxRPM * 100UL; | ||
213 | |||
214 | phm_cap_set(hwmgr->platform_descriptor.platformCaps, | ||
215 | PHM_PlatformCaps_MicrocodeFanControl); | ||
216 | |||
217 | hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity = | ||
218 | le16_to_cpu(fan_table_v2->usFanOutputSensitivity); | ||
219 | hwmgr->thermal_controller.advanceFanControlParameters.usMaxFanRPM = | ||
220 | fan_table_v2->ucFanMaxRPM * 100UL; | ||
221 | hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMMaxLimit = | ||
222 | le16_to_cpu(fan_table_v2->usThrottlingRPM); | ||
223 | hwmgr->thermal_controller.advanceFanControlParameters.ulMinFanSCLKAcousticLimit = | ||
224 | le16_to_cpu(fan_table_v2->usFanAcousticLimitRpm); | ||
225 | hwmgr->thermal_controller.advanceFanControlParameters.usTMax = | ||
226 | le16_to_cpu(fan_table_v2->usTargetTemperature); | ||
227 | hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin = | ||
228 | le16_to_cpu(fan_table_v2->usMinimumPWMLimit); | ||
229 | hwmgr->thermal_controller.advanceFanControlParameters.ulTargetGfxClk = | ||
230 | le16_to_cpu(fan_table_v2->usTargetGfxClk); | ||
231 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainEdge = | ||
232 | le16_to_cpu(fan_table_v2->usFanGainEdge); | ||
233 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHotspot = | ||
234 | le16_to_cpu(fan_table_v2->usFanGainHotspot); | ||
235 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainLiquid = | ||
236 | le16_to_cpu(fan_table_v2->usFanGainLiquid); | ||
237 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrVddc = | ||
238 | le16_to_cpu(fan_table_v2->usFanGainVrVddc); | ||
239 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrMvdd = | ||
240 | le16_to_cpu(fan_table_v2->usFanGainVrMvdd); | ||
241 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainPlx = | ||
242 | le16_to_cpu(fan_table_v2->usFanGainPlx); | ||
243 | hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHbm = | ||
244 | le16_to_cpu(fan_table_v2->usFanGainHbm); | ||
245 | |||
246 | hwmgr->thermal_controller.advanceFanControlParameters.ucEnableZeroRPM = | ||
247 | fan_table_v2->ucEnableZeroRPM; | ||
248 | hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStopTemperature = | ||
249 | le16_to_cpu(fan_table_v2->usFanStopTemperature); | ||
250 | hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStartTemperature = | ||
251 | le16_to_cpu(fan_table_v2->usFanStartTemperature); | ||
252 | } | ||
201 | return 0; | 253 | return 0; |
202 | } | 254 | } |
203 | 255 | ||