aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2017-03-30 05:58:05 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-04-07 15:15:44 -0400
commit8250880ed87f806cc1f7964cd8ddda18d9014288 (patch)
tree7519052c5f1c0fd83e71f40fc31c4a10078b0463
parent1e1eb6a893af737e9e725ae52e7ce4f5410557b6 (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.h23
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c142
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
253typedef 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
253typedef struct _ATOM_Vega10_Thermal_Controller { 276typedef 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