2 * Copyright 2019 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
24 #include <linux/firmware.h>
25 #include <linux/pci.h>
27 #include "amdgpu_smu.h"
28 #include "smu_internal.h"
29 #include "atomfirmware.h"
30 #include "amdgpu_atomfirmware.h"
31 #include "smu_v11_0.h"
32 #include "smu11_driver_if_sienna_cichlid.h"
33 #include "soc15_common.h"
35 #include "sienna_cichlid_ppt.h"
36 #include "smu_v11_0_7_pptable.h"
37 #include "smu_v11_0_7_ppsmc.h"
38 #include "nbio/nbio_2_3_offset.h"
39 #include "nbio/nbio_2_3_sh_mask.h"
40 #include "thm/thm_11_0_2_offset.h"
41 #include "thm/thm_11_0_2_sh_mask.h"
43 #include "asic_reg/mp/mp_11_0_sh_mask.h"
46 * DO NOT use these for err/warn/info/debug messages.
47 * Use dev_err, dev_warn, dev_info and dev_dbg instead.
48 * They are more MGPU friendly.
55 #define FEATURE_MASK(feature) (1ULL << feature)
56 #define SMC_DPM_FEATURE ( \
57 FEATURE_MASK(FEATURE_DPM_PREFETCHER_BIT) | \
58 FEATURE_MASK(FEATURE_DPM_GFXCLK_BIT) | \
59 FEATURE_MASK(FEATURE_DPM_UCLK_BIT) | \
60 FEATURE_MASK(FEATURE_DPM_LINK_BIT) | \
61 FEATURE_MASK(FEATURE_DPM_SOCCLK_BIT) | \
62 FEATURE_MASK(FEATURE_DPM_FCLK_BIT) | \
63 FEATURE_MASK(FEATURE_DPM_DCEFCLK_BIT))
65 #define MSG_MAP(msg, index) \
66 [SMU_MSG_##msg] = {1, (index)}
68 static struct smu_11_0_cmn2aisc_mapping sienna_cichlid_message_map[SMU_MSG_MAX_COUNT] = {
69 MSG_MAP(TestMessage, PPSMC_MSG_TestMessage),
70 MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion),
71 MSG_MAP(GetDriverIfVersion, PPSMC_MSG_GetDriverIfVersion),
72 MSG_MAP(SetAllowedFeaturesMaskLow, PPSMC_MSG_SetAllowedFeaturesMaskLow),
73 MSG_MAP(SetAllowedFeaturesMaskHigh, PPSMC_MSG_SetAllowedFeaturesMaskHigh),
74 MSG_MAP(EnableAllSmuFeatures, PPSMC_MSG_EnableAllSmuFeatures),
75 MSG_MAP(DisableAllSmuFeatures, PPSMC_MSG_DisableAllSmuFeatures),
76 MSG_MAP(EnableSmuFeaturesLow, PPSMC_MSG_EnableSmuFeaturesLow),
77 MSG_MAP(EnableSmuFeaturesHigh, PPSMC_MSG_EnableSmuFeaturesHigh),
78 MSG_MAP(DisableSmuFeaturesLow, PPSMC_MSG_DisableSmuFeaturesLow),
79 MSG_MAP(DisableSmuFeaturesHigh, PPSMC_MSG_DisableSmuFeaturesHigh),
80 MSG_MAP(GetEnabledSmuFeaturesLow, PPSMC_MSG_GetRunningSmuFeaturesLow),
81 MSG_MAP(GetEnabledSmuFeaturesHigh, PPSMC_MSG_GetRunningSmuFeaturesHigh),
82 MSG_MAP(SetWorkloadMask, PPSMC_MSG_SetWorkloadMask),
83 MSG_MAP(SetPptLimit, PPSMC_MSG_SetPptLimit),
84 MSG_MAP(SetDriverDramAddrHigh, PPSMC_MSG_SetDriverDramAddrHigh),
85 MSG_MAP(SetDriverDramAddrLow, PPSMC_MSG_SetDriverDramAddrLow),
86 MSG_MAP(SetToolsDramAddrHigh, PPSMC_MSG_SetToolsDramAddrHigh),
87 MSG_MAP(SetToolsDramAddrLow, PPSMC_MSG_SetToolsDramAddrLow),
88 MSG_MAP(TransferTableSmu2Dram, PPSMC_MSG_TransferTableSmu2Dram),
89 MSG_MAP(TransferTableDram2Smu, PPSMC_MSG_TransferTableDram2Smu),
90 MSG_MAP(UseDefaultPPTable, PPSMC_MSG_UseDefaultPPTable),
91 MSG_MAP(EnterBaco, PPSMC_MSG_EnterBaco),
92 MSG_MAP(SetSoftMinByFreq, PPSMC_MSG_SetSoftMinByFreq),
93 MSG_MAP(SetSoftMaxByFreq, PPSMC_MSG_SetSoftMaxByFreq),
94 MSG_MAP(SetHardMinByFreq, PPSMC_MSG_SetHardMinByFreq),
95 MSG_MAP(SetHardMaxByFreq, PPSMC_MSG_SetHardMaxByFreq),
96 MSG_MAP(GetMinDpmFreq, PPSMC_MSG_GetMinDpmFreq),
97 MSG_MAP(GetMaxDpmFreq, PPSMC_MSG_GetMaxDpmFreq),
98 MSG_MAP(GetDpmFreqByIndex, PPSMC_MSG_GetDpmFreqByIndex),
99 MSG_MAP(SetGeminiMode, PPSMC_MSG_SetGeminiMode),
100 MSG_MAP(SetGeminiApertureHigh, PPSMC_MSG_SetGeminiApertureHigh),
101 MSG_MAP(SetGeminiApertureLow, PPSMC_MSG_SetGeminiApertureLow),
102 MSG_MAP(OverridePcieParameters, PPSMC_MSG_OverridePcieParameters),
103 MSG_MAP(ReenableAcDcInterrupt, PPSMC_MSG_ReenableAcDcInterrupt),
104 MSG_MAP(NotifyPowerSource, PPSMC_MSG_NotifyPowerSource),
105 MSG_MAP(SetUclkFastSwitch, PPSMC_MSG_SetUclkFastSwitch),
106 MSG_MAP(SetVideoFps, PPSMC_MSG_SetVideoFps),
107 MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload),
108 MSG_MAP(AllowGfxOff, PPSMC_MSG_AllowGfxOff),
109 MSG_MAP(DisallowGfxOff, PPSMC_MSG_DisallowGfxOff),
110 MSG_MAP(GetPptLimit, PPSMC_MSG_GetPptLimit),
111 MSG_MAP(GetDcModeMaxDpmFreq, PPSMC_MSG_GetDcModeMaxDpmFreq),
112 MSG_MAP(ExitBaco, PPSMC_MSG_ExitBaco),
113 MSG_MAP(PowerUpVcn, PPSMC_MSG_PowerUpVcn),
114 MSG_MAP(PowerDownVcn, PPSMC_MSG_PowerDownVcn),
115 MSG_MAP(PowerUpJpeg, PPSMC_MSG_PowerUpJpeg),
116 MSG_MAP(PowerDownJpeg, PPSMC_MSG_PowerDownJpeg),
117 MSG_MAP(BacoAudioD3PME, PPSMC_MSG_BacoAudioD3PME),
118 MSG_MAP(ArmD3, PPSMC_MSG_ArmD3),
121 static struct smu_11_0_cmn2aisc_mapping sienna_cichlid_clk_map[SMU_CLK_COUNT] = {
122 CLK_MAP(GFXCLK, PPCLK_GFXCLK),
123 CLK_MAP(SCLK, PPCLK_GFXCLK),
124 CLK_MAP(SOCCLK, PPCLK_SOCCLK),
125 CLK_MAP(FCLK, PPCLK_FCLK),
126 CLK_MAP(UCLK, PPCLK_UCLK),
127 CLK_MAP(MCLK, PPCLK_UCLK),
128 CLK_MAP(DCLK, PPCLK_DCLK_0),
129 CLK_MAP(DCLK1, PPCLK_DCLK_0),
130 CLK_MAP(VCLK, PPCLK_VCLK_1),
131 CLK_MAP(VCLK1, PPCLK_VCLK_1),
132 CLK_MAP(DCEFCLK, PPCLK_DCEFCLK),
133 CLK_MAP(DISPCLK, PPCLK_DISPCLK),
134 CLK_MAP(PIXCLK, PPCLK_PIXCLK),
135 CLK_MAP(PHYCLK, PPCLK_PHYCLK),
138 static struct smu_11_0_cmn2aisc_mapping sienna_cichlid_feature_mask_map[SMU_FEATURE_COUNT] = {
139 FEA_MAP(DPM_PREFETCHER),
141 FEA_MAP(DPM_GFX_GPO),
146 FEA_MAP(DPM_DCEFCLK),
147 FEA_MAP(MEM_VDDCI_SCALING),
148 FEA_MAP(MEM_MVDD_SCALING),
159 FEA_MAP(RSMU_SMN_CG),
168 FEA_MAP(FAN_CONTROL),
172 FEA_MAP(LED_DISPLAY),
174 FEA_MAP(OUT_OF_BAND_MONITOR),
175 FEA_MAP(TEMP_DEPENDENT_VMIN),
181 static struct smu_11_0_cmn2aisc_mapping sienna_cichlid_table_map[SMU_TABLE_COUNT] = {
184 TAB_MAP(AVFS_PSM_DEBUG),
185 TAB_MAP(AVFS_FUSE_OVERRIDE),
186 TAB_MAP(PMSTATUSLOG),
187 TAB_MAP(SMU_METRICS),
188 TAB_MAP(DRIVER_SMU_CONFIG),
189 TAB_MAP(ACTIVITY_MONITOR_COEFF),
191 TAB_MAP(I2C_COMMANDS),
195 static struct smu_11_0_cmn2aisc_mapping sienna_cichlid_pwr_src_map[SMU_POWER_SOURCE_COUNT] = {
200 static struct smu_11_0_cmn2aisc_mapping sienna_cichlid_workload_map[PP_SMC_POWER_PROFILE_COUNT] = {
201 WORKLOAD_MAP(PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT, WORKLOAD_PPLIB_DEFAULT_BIT),
202 WORKLOAD_MAP(PP_SMC_POWER_PROFILE_FULLSCREEN3D, WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT),
203 WORKLOAD_MAP(PP_SMC_POWER_PROFILE_POWERSAVING, WORKLOAD_PPLIB_POWER_SAVING_BIT),
204 WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VIDEO, WORKLOAD_PPLIB_VIDEO_BIT),
205 WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VR, WORKLOAD_PPLIB_VR_BIT),
206 WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE, WORKLOAD_PPLIB_CUSTOM_BIT),
207 WORKLOAD_MAP(PP_SMC_POWER_PROFILE_CUSTOM, WORKLOAD_PPLIB_CUSTOM_BIT),
210 static int sienna_cichlid_get_smu_msg_index(struct smu_context *smc, uint32_t index)
212 struct smu_11_0_cmn2aisc_mapping mapping;
214 if (index >= SMU_MSG_MAX_COUNT)
217 mapping = sienna_cichlid_message_map[index];
218 if (!(mapping.valid_mapping)) {
222 return mapping.map_to;
225 static int sienna_cichlid_get_smu_clk_index(struct smu_context *smc, uint32_t index)
227 struct smu_11_0_cmn2aisc_mapping mapping;
229 if (index >= SMU_CLK_COUNT)
232 mapping = sienna_cichlid_clk_map[index];
233 if (!(mapping.valid_mapping)) {
237 return mapping.map_to;
240 static int sienna_cichlid_get_smu_feature_index(struct smu_context *smc, uint32_t index)
242 struct smu_11_0_cmn2aisc_mapping mapping;
244 if (index >= SMU_FEATURE_COUNT)
247 mapping = sienna_cichlid_feature_mask_map[index];
248 if (!(mapping.valid_mapping)) {
252 return mapping.map_to;
255 static int sienna_cichlid_get_smu_table_index(struct smu_context *smc, uint32_t index)
257 struct smu_11_0_cmn2aisc_mapping mapping;
259 if (index >= SMU_TABLE_COUNT)
262 mapping = sienna_cichlid_table_map[index];
263 if (!(mapping.valid_mapping)) {
267 return mapping.map_to;
270 static int sienna_cichlid_get_pwr_src_index(struct smu_context *smc, uint32_t index)
272 struct smu_11_0_cmn2aisc_mapping mapping;
274 if (index >= SMU_POWER_SOURCE_COUNT)
277 mapping = sienna_cichlid_pwr_src_map[index];
278 if (!(mapping.valid_mapping)) {
282 return mapping.map_to;
285 static int sienna_cichlid_get_workload_type(struct smu_context *smu, enum PP_SMC_POWER_PROFILE profile)
287 struct smu_11_0_cmn2aisc_mapping mapping;
289 if (profile > PP_SMC_POWER_PROFILE_CUSTOM)
292 mapping = sienna_cichlid_workload_map[profile];
293 if (!(mapping.valid_mapping)) {
297 return mapping.map_to;
301 sienna_cichlid_get_allowed_feature_mask(struct smu_context *smu,
302 uint32_t *feature_mask, uint32_t num)
304 struct amdgpu_device *adev = smu->adev;
309 memset(feature_mask, 0, sizeof(uint32_t) * num);
311 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DPM_PREFETCHER_BIT)
312 | FEATURE_MASK(FEATURE_DPM_FCLK_BIT)
313 | FEATURE_MASK(FEATURE_DS_SOCCLK_BIT)
314 | FEATURE_MASK(FEATURE_DS_DCEFCLK_BIT)
315 | FEATURE_MASK(FEATURE_DS_FCLK_BIT)
316 | FEATURE_MASK(FEATURE_DS_UCLK_BIT)
317 | FEATURE_MASK(FEATURE_FW_DSTATE_BIT)
318 | FEATURE_MASK(FEATURE_DF_CSTATE_BIT)
319 | FEATURE_MASK(FEATURE_RSMU_SMN_CG_BIT)
320 | FEATURE_MASK(FEATURE_GFX_SS_BIT)
321 | FEATURE_MASK(FEATURE_VR0HOT_BIT)
322 | FEATURE_MASK(FEATURE_PPT_BIT)
323 | FEATURE_MASK(FEATURE_TDC_BIT)
324 | FEATURE_MASK(FEATURE_BACO_BIT)
325 | FEATURE_MASK(FEATURE_APCC_DFLL_BIT)
326 | FEATURE_MASK(FEATURE_FW_CTF_BIT)
327 | FEATURE_MASK(FEATURE_FAN_CONTROL_BIT)
328 | FEATURE_MASK(FEATURE_THERMAL_BIT)
329 | FEATURE_MASK(FEATURE_OUT_OF_BAND_MONITOR_BIT);
331 if (adev->pm.pp_feature & PP_SCLK_DPM_MASK) {
332 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DPM_GFXCLK_BIT);
333 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DPM_GFX_GPO_BIT);
336 if (adev->pm.pp_feature & PP_MCLK_DPM_MASK)
337 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DPM_UCLK_BIT)
338 | FEATURE_MASK(FEATURE_MEM_VDDCI_SCALING_BIT)
339 | FEATURE_MASK(FEATURE_MEM_MVDD_SCALING_BIT);
341 if (adev->pm.pp_feature & PP_PCIE_DPM_MASK)
342 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DPM_LINK_BIT);
344 if (adev->pm.pp_feature & PP_DCEFCLK_DPM_MASK)
345 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DPM_DCEFCLK_BIT);
347 if (adev->pm.pp_feature & PP_SOCCLK_DPM_MASK)
348 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DPM_SOCCLK_BIT);
350 if (adev->pm.pp_feature & PP_ULV_MASK)
351 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_GFX_ULV_BIT);
353 if (adev->pm.pp_feature & PP_SCLK_DEEP_SLEEP_MASK)
354 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DS_GFXCLK_BIT);
356 if (adev->pm.pp_feature & PP_GFXOFF_MASK)
357 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_GFXOFF_BIT);
359 if (smu->adev->pg_flags & AMD_PG_SUPPORT_ATHUB)
360 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_ATHUB_PG_BIT);
362 if (smu->adev->pg_flags & AMD_PG_SUPPORT_MMHUB)
363 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_MMHUB_PG_BIT);
365 if (smu->adev->pg_flags & AMD_PG_SUPPORT_VCN ||
366 smu->adev->pg_flags & AMD_PG_SUPPORT_JPEG)
367 *(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_MM_DPM_PG_BIT);
372 static int sienna_cichlid_check_powerplay_table(struct smu_context *smu)
374 struct smu_table_context *table_context = &smu->smu_table;
375 struct smu_11_0_7_powerplay_table *powerplay_table =
376 table_context->power_play_table;
377 struct smu_baco_context *smu_baco = &smu->smu_baco;
379 mutex_lock(&smu_baco->mutex);
380 if (powerplay_table->platform_caps & SMU_11_0_7_PP_PLATFORM_CAP_BACO ||
381 powerplay_table->platform_caps & SMU_11_0_7_PP_PLATFORM_CAP_MACO)
382 smu_baco->platform_support = true;
383 mutex_unlock(&smu_baco->mutex);
385 table_context->thermal_controller_type =
386 powerplay_table->thermal_controller_type;
391 static int sienna_cichlid_append_powerplay_table(struct smu_context *smu)
393 struct smu_table_context *table_context = &smu->smu_table;
394 PPTable_t *smc_pptable = table_context->driver_pptable;
395 struct atom_smc_dpm_info_v4_9 *smc_dpm_table;
399 index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
402 ret = smu_get_atom_data_table(smu, index, NULL, NULL, NULL,
403 (uint8_t **)&smc_dpm_table);
407 memcpy(smc_pptable->I2cControllers, smc_dpm_table->I2cControllers,
408 sizeof(I2cControllerConfig_t) * NUM_I2C_CONTROLLERS);
410 /* SVI2 Board Parameters */
411 smc_pptable->VddGfxVrMapping = smc_dpm_table->VddGfxVrMapping;
412 smc_pptable->VddSocVrMapping = smc_dpm_table->VddSocVrMapping;
413 smc_pptable->VddMem0VrMapping = smc_dpm_table->VddMem0VrMapping;
414 smc_pptable->VddMem1VrMapping = smc_dpm_table->VddMem1VrMapping;
415 smc_pptable->GfxUlvPhaseSheddingMask = smc_dpm_table->GfxUlvPhaseSheddingMask;
416 smc_pptable->SocUlvPhaseSheddingMask = smc_dpm_table->SocUlvPhaseSheddingMask;
417 smc_pptable->VddciUlvPhaseSheddingMask = smc_dpm_table->VddciUlvPhaseSheddingMask;
418 smc_pptable->MvddUlvPhaseSheddingMask = smc_dpm_table->MvddUlvPhaseSheddingMask;
420 /* Telemetry Settings */
421 smc_pptable->GfxMaxCurrent = smc_dpm_table->GfxMaxCurrent;
422 smc_pptable->GfxOffset = smc_dpm_table->GfxOffset;
423 smc_pptable->Padding_TelemetryGfx = smc_dpm_table->Padding_TelemetryGfx;
424 smc_pptable->SocMaxCurrent = smc_dpm_table->SocMaxCurrent;
425 smc_pptable->SocOffset = smc_dpm_table->SocOffset;
426 smc_pptable->Padding_TelemetrySoc = smc_dpm_table->Padding_TelemetrySoc;
427 smc_pptable->Mem0MaxCurrent = smc_dpm_table->Mem0MaxCurrent;
428 smc_pptable->Mem0Offset = smc_dpm_table->Mem0Offset;
429 smc_pptable->Padding_TelemetryMem0 = smc_dpm_table->Padding_TelemetryMem0;
430 smc_pptable->Mem1MaxCurrent = smc_dpm_table->Mem1MaxCurrent;
431 smc_pptable->Mem1Offset = smc_dpm_table->Mem1Offset;
432 smc_pptable->Padding_TelemetryMem1 = smc_dpm_table->Padding_TelemetryMem1;
433 smc_pptable->MvddRatio = smc_dpm_table->MvddRatio;
436 smc_pptable->AcDcGpio = smc_dpm_table->AcDcGpio;
437 smc_pptable->AcDcPolarity = smc_dpm_table->AcDcPolarity;
438 smc_pptable->VR0HotGpio = smc_dpm_table->VR0HotGpio;
439 smc_pptable->VR0HotPolarity = smc_dpm_table->VR0HotPolarity;
440 smc_pptable->VR1HotGpio = smc_dpm_table->VR1HotGpio;
441 smc_pptable->VR1HotPolarity = smc_dpm_table->VR1HotPolarity;
442 smc_pptable->GthrGpio = smc_dpm_table->GthrGpio;
443 smc_pptable->GthrPolarity = smc_dpm_table->GthrPolarity;
445 /* LED Display Settings */
446 smc_pptable->LedPin0 = smc_dpm_table->LedPin0;
447 smc_pptable->LedPin1 = smc_dpm_table->LedPin1;
448 smc_pptable->LedPin2 = smc_dpm_table->LedPin2;
449 smc_pptable->LedEnableMask = smc_dpm_table->LedEnableMask;
450 smc_pptable->LedPcie = smc_dpm_table->LedPcie;
451 smc_pptable->LedError = smc_dpm_table->LedError;
452 smc_pptable->LedSpare1[0] = smc_dpm_table->LedSpare1[0];
453 smc_pptable->LedSpare1[1] = smc_dpm_table->LedSpare1[1];
455 /* GFXCLK PLL Spread Spectrum */
456 smc_pptable->PllGfxclkSpreadEnabled = smc_dpm_table->PllGfxclkSpreadEnabled;
457 smc_pptable->PllGfxclkSpreadPercent = smc_dpm_table->PllGfxclkSpreadPercent;
458 smc_pptable->PllGfxclkSpreadFreq = smc_dpm_table->PllGfxclkSpreadFreq;
460 /* GFXCLK DFLL Spread Spectrum */
461 smc_pptable->DfllGfxclkSpreadEnabled = smc_dpm_table->DfllGfxclkSpreadEnabled;
462 smc_pptable->DfllGfxclkSpreadPercent = smc_dpm_table->DfllGfxclkSpreadPercent;
463 smc_pptable->DfllGfxclkSpreadFreq = smc_dpm_table->DfllGfxclkSpreadFreq;
465 /* UCLK Spread Spectrum */
466 smc_pptable->UclkSpreadEnabled = smc_dpm_table->UclkSpreadEnabled;
467 smc_pptable->UclkSpreadPercent = smc_dpm_table->UclkSpreadPercent;
468 smc_pptable->UclkSpreadFreq = smc_dpm_table->UclkSpreadFreq;
470 /* FCLK Spred Spectrum */
471 smc_pptable->FclkSpreadEnabled = smc_dpm_table->FclkSpreadEnabled;
472 smc_pptable->FclkSpreadPercent = smc_dpm_table->FclkSpreadPercent;
473 smc_pptable->FclkSpreadFreq = smc_dpm_table->FclkSpreadFreq;
476 smc_pptable->MemoryChannelEnabled = smc_dpm_table->MemoryChannelEnabled;
477 smc_pptable->DramBitWidth = smc_dpm_table->DramBitWidth;
478 smc_pptable->PaddingMem1[0] = smc_dpm_table->PaddingMem1[0];
479 smc_pptable->PaddingMem1[1] = smc_dpm_table->PaddingMem1[1];
480 smc_pptable->PaddingMem1[2] = smc_dpm_table->PaddingMem1[2];
482 /* Total board power */
483 smc_pptable->TotalBoardPower = smc_dpm_table->TotalBoardPower;
484 smc_pptable->BoardPowerPadding = smc_dpm_table->BoardPowerPadding;
487 for (i = 0; i < NUM_XGMI_PSTATE_LEVELS; i++) {
488 smc_pptable->XgmiLinkSpeed[i] = smc_dpm_table->XgmiLinkSpeed[i];
489 smc_pptable->XgmiLinkWidth[i] = smc_dpm_table->XgmiLinkWidth[i];
490 smc_pptable->XgmiFclkFreq[i] = smc_dpm_table->XgmiFclkFreq[i];
491 smc_pptable->XgmiSocVoltage[i] = smc_dpm_table->XgmiSocVoltage[i];
497 static int sienna_cichlid_store_powerplay_table(struct smu_context *smu)
499 struct smu_table_context *table_context = &smu->smu_table;
500 struct smu_11_0_7_powerplay_table *powerplay_table =
501 table_context->power_play_table;
503 memcpy(table_context->driver_pptable, &powerplay_table->smc_pptable,
509 static int sienna_cichlid_setup_pptable(struct smu_context *smu)
513 ret = smu_v11_0_setup_pptable(smu);
517 ret = sienna_cichlid_store_powerplay_table(smu);
521 ret = sienna_cichlid_append_powerplay_table(smu);
525 ret = sienna_cichlid_check_powerplay_table(smu);
532 static int sienna_cichlid_tables_init(struct smu_context *smu, struct smu_table *tables)
534 struct smu_table_context *smu_table = &smu->smu_table;
536 SMU_TABLE_INIT(tables, SMU_TABLE_PPTABLE, sizeof(PPTable_t),
537 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
538 SMU_TABLE_INIT(tables, SMU_TABLE_WATERMARKS, sizeof(Watermarks_t),
539 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
540 SMU_TABLE_INIT(tables, SMU_TABLE_SMU_METRICS, sizeof(SmuMetrics_t),
541 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
542 SMU_TABLE_INIT(tables, SMU_TABLE_OVERDRIVE, sizeof(OverDriveTable_t),
543 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
544 SMU_TABLE_INIT(tables, SMU_TABLE_PMSTATUSLOG, SMU11_TOOL_SIZE,
545 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
546 SMU_TABLE_INIT(tables, SMU_TABLE_ACTIVITY_MONITOR_COEFF,
547 sizeof(DpmActivityMonitorCoeffInt_t), PAGE_SIZE,
548 AMDGPU_GEM_DOMAIN_VRAM);
550 smu_table->metrics_table = kzalloc(sizeof(SmuMetrics_t), GFP_KERNEL);
551 if (!smu_table->metrics_table)
553 smu_table->metrics_time = 0;
555 smu_table->watermarks_table = kzalloc(sizeof(Watermarks_t), GFP_KERNEL);
556 if (!smu_table->watermarks_table)
562 static int sienna_cichlid_get_smu_metrics_data(struct smu_context *smu,
563 MetricsMember_t member,
566 struct smu_table_context *smu_table= &smu->smu_table;
567 SmuMetrics_t *metrics = (SmuMetrics_t *)smu_table->metrics_table;
570 mutex_lock(&smu->metrics_lock);
571 if (!smu_table->metrics_time ||
572 time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
573 ret = smu_update_table(smu,
574 SMU_TABLE_SMU_METRICS,
576 smu_table->metrics_table,
579 dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
580 mutex_unlock(&smu->metrics_lock);
583 smu_table->metrics_time = jiffies;
587 case METRICS_CURR_GFXCLK:
588 *value = metrics->CurrClock[PPCLK_GFXCLK];
590 case METRICS_CURR_SOCCLK:
591 *value = metrics->CurrClock[PPCLK_SOCCLK];
593 case METRICS_CURR_UCLK:
594 *value = metrics->CurrClock[PPCLK_UCLK];
596 case METRICS_CURR_VCLK:
597 *value = metrics->CurrClock[PPCLK_VCLK_0];
599 case METRICS_CURR_VCLK1:
600 *value = metrics->CurrClock[PPCLK_VCLK_1];
602 case METRICS_CURR_DCLK:
603 *value = metrics->CurrClock[PPCLK_DCLK_0];
605 case METRICS_CURR_DCLK1:
606 *value = metrics->CurrClock[PPCLK_DCLK_1];
608 case METRICS_AVERAGE_GFXCLK:
609 *value = metrics->AverageGfxclkFrequency;
611 case METRICS_AVERAGE_FCLK:
612 *value = metrics->AverageFclkFrequency;
614 case METRICS_AVERAGE_UCLK:
615 *value = metrics->AverageUclkFrequency;
617 case METRICS_AVERAGE_GFXACTIVITY:
618 *value = metrics->AverageGfxActivity;
620 case METRICS_AVERAGE_MEMACTIVITY:
621 *value = metrics->AverageUclkActivity;
623 case METRICS_AVERAGE_SOCKETPOWER:
624 *value = metrics->AverageSocketPower << 8;
626 case METRICS_TEMPERATURE_EDGE:
627 *value = metrics->TemperatureEdge *
628 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
630 case METRICS_TEMPERATURE_HOTSPOT:
631 *value = metrics->TemperatureHotspot *
632 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
634 case METRICS_TEMPERATURE_MEM:
635 *value = metrics->TemperatureMem *
636 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
638 case METRICS_TEMPERATURE_VRGFX:
639 *value = metrics->TemperatureVrGfx *
640 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
642 case METRICS_TEMPERATURE_VRSOC:
643 *value = metrics->TemperatureVrSoc *
644 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
646 case METRICS_THROTTLER_STATUS:
647 *value = metrics->ThrottlerStatus;
649 case METRICS_CURR_FANSPEED:
650 *value = metrics->CurrFanSpeed;
657 mutex_unlock(&smu->metrics_lock);
663 static int sienna_cichlid_allocate_dpm_context(struct smu_context *smu)
665 struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
667 if (smu_dpm->dpm_context)
670 smu_dpm->dpm_context = kzalloc(sizeof(struct smu_11_0_dpm_context),
672 if (!smu_dpm->dpm_context)
675 smu_dpm->dpm_context_size = sizeof(struct smu_11_0_dpm_context);
680 static int sienna_cichlid_set_default_dpm_table(struct smu_context *smu)
682 struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
683 struct smu_table_context *table_context = &smu->smu_table;
684 struct smu_11_0_dpm_context *dpm_context = smu_dpm->dpm_context;
685 PPTable_t *driver_ppt = NULL;
688 driver_ppt = table_context->driver_pptable;
690 dpm_context->dpm_tables.soc_table.min = driver_ppt->FreqTableSocclk[0];
691 dpm_context->dpm_tables.soc_table.max = driver_ppt->FreqTableSocclk[NUM_SOCCLK_DPM_LEVELS - 1];
693 dpm_context->dpm_tables.gfx_table.min = driver_ppt->FreqTableGfx[0];
694 dpm_context->dpm_tables.gfx_table.max = driver_ppt->FreqTableGfx[NUM_GFXCLK_DPM_LEVELS - 1];
696 dpm_context->dpm_tables.uclk_table.min = driver_ppt->FreqTableUclk[0];
697 dpm_context->dpm_tables.uclk_table.max = driver_ppt->FreqTableUclk[NUM_UCLK_DPM_LEVELS - 1];
699 dpm_context->dpm_tables.vclk_table.min = driver_ppt->FreqTableVclk[0];
700 dpm_context->dpm_tables.vclk_table.max = driver_ppt->FreqTableVclk[NUM_VCLK_DPM_LEVELS - 1];
702 dpm_context->dpm_tables.dclk_table.min = driver_ppt->FreqTableDclk[0];
703 dpm_context->dpm_tables.dclk_table.max = driver_ppt->FreqTableDclk[NUM_DCLK_DPM_LEVELS - 1];
705 dpm_context->dpm_tables.dcef_table.min = driver_ppt->FreqTableDcefclk[0];
706 dpm_context->dpm_tables.dcef_table.max = driver_ppt->FreqTableDcefclk[NUM_DCEFCLK_DPM_LEVELS - 1];
708 dpm_context->dpm_tables.pixel_table.min = driver_ppt->FreqTablePixclk[0];
709 dpm_context->dpm_tables.pixel_table.max = driver_ppt->FreqTablePixclk[NUM_PIXCLK_DPM_LEVELS - 1];
711 dpm_context->dpm_tables.display_table.min = driver_ppt->FreqTableDispclk[0];
712 dpm_context->dpm_tables.display_table.max = driver_ppt->FreqTableDispclk[NUM_DISPCLK_DPM_LEVELS - 1];
714 dpm_context->dpm_tables.phy_table.min = driver_ppt->FreqTablePhyclk[0];
715 dpm_context->dpm_tables.phy_table.max = driver_ppt->FreqTablePhyclk[NUM_PHYCLK_DPM_LEVELS - 1];
717 for (i = 0; i < MAX_PCIE_CONF; i++) {
718 dpm_context->dpm_tables.pcie_table.pcie_gen[i] = driver_ppt->PcieGenSpeed[i];
719 dpm_context->dpm_tables.pcie_table.pcie_lane[i] = driver_ppt->PcieLaneCount[i];
725 static int sienna_cichlid_dpm_set_vcn_enable(struct smu_context *smu, bool enable)
727 struct smu_power_context *smu_power = &smu->smu_power;
728 struct smu_power_gate *power_gate = &smu_power->power_gate;
732 /* vcn dpm on is a prerequisite for vcn power gate messages */
733 if (smu_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) {
734 ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerUpVcn, 0, NULL);
737 ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerUpVcn, 0x10000, NULL);
741 power_gate->vcn_gated = false;
743 if (smu_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) {
744 ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerDownVcn, 0, NULL);
747 ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerDownVcn, 0x10000, NULL);
751 power_gate->vcn_gated = true;
757 static int sienna_cichlid_dpm_set_jpeg_enable(struct smu_context *smu, bool enable)
759 struct smu_power_context *smu_power = &smu->smu_power;
760 struct smu_power_gate *power_gate = &smu_power->power_gate;
764 if (smu_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) {
765 ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerUpJpeg, 0, NULL);
769 power_gate->jpeg_gated = false;
771 if (smu_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) {
772 ret = smu_send_smc_msg_with_param(smu, SMU_MSG_PowerDownJpeg, 0, NULL);
776 power_gate->jpeg_gated = true;
782 static int sienna_cichlid_get_current_clk_freq_by_table(struct smu_context *smu,
783 enum smu_clk_type clk_type,
786 MetricsMember_t member_type;
789 clk_id = smu_clk_get_index(smu, clk_type);
795 member_type = METRICS_CURR_GFXCLK;
798 member_type = METRICS_CURR_UCLK;
801 member_type = METRICS_CURR_SOCCLK;
804 member_type = METRICS_CURR_FCLK;
807 member_type = METRICS_CURR_VCLK;
810 member_type = METRICS_CURR_VCLK1;
813 member_type = METRICS_CURR_DCLK;
816 member_type = METRICS_CURR_DCLK1;
819 member_type = METRICS_CURR_DCEFCLK;
825 return sienna_cichlid_get_smu_metrics_data(smu,
831 static bool sienna_cichlid_is_support_fine_grained_dpm(struct smu_context *smu, enum smu_clk_type clk_type)
833 PPTable_t *pptable = smu->smu_table.driver_pptable;
834 DpmDescriptor_t *dpm_desc = NULL;
835 uint32_t clk_index = 0;
837 clk_index = smu_clk_get_index(smu, clk_type);
838 dpm_desc = &pptable->DpmDescriptor[clk_index];
840 /* 0 - Fine grained DPM, 1 - Discrete DPM */
841 return dpm_desc->SnapToDiscrete == 0 ? true : false;
844 static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
845 enum smu_clk_type clk_type, char *buf)
847 struct amdgpu_device *adev = smu->adev;
848 struct smu_table_context *table_context = &smu->smu_table;
849 struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
850 struct smu_11_0_dpm_context *dpm_context = smu_dpm->dpm_context;
851 PPTable_t *pptable = (PPTable_t *)table_context->driver_pptable;
852 int i, size = 0, ret = 0;
853 uint32_t cur_value = 0, value = 0, count = 0;
854 uint32_t freq_values[3] = {0};
855 uint32_t mark_index = 0;
856 uint32_t gen_speed, lane_width;
866 ret = smu_get_current_clk_freq(smu, clk_type, &cur_value);
871 cur_value = cur_value / 100;
873 /* no need to disable gfxoff when retrieving the current gfxclk */
874 if ((clk_type == SMU_GFXCLK) || (clk_type == SMU_SCLK))
875 amdgpu_gfx_off_ctrl(adev, false);
877 ret = smu_get_dpm_level_count(smu, clk_type, &count);
881 if (!sienna_cichlid_is_support_fine_grained_dpm(smu, clk_type)) {
882 for (i = 0; i < count; i++) {
883 ret = smu_get_dpm_freq_by_index(smu, clk_type, i, &value);
887 size += sprintf(buf + size, "%d: %uMhz %s\n", i, value,
888 cur_value == value ? "*" : "");
891 ret = smu_get_dpm_freq_by_index(smu, clk_type, 0, &freq_values[0]);
894 ret = smu_get_dpm_freq_by_index(smu, clk_type, count - 1, &freq_values[2]);
898 freq_values[1] = cur_value;
899 mark_index = cur_value == freq_values[0] ? 0 :
900 cur_value == freq_values[2] ? 2 : 1;
902 freq_values[1] = (freq_values[0] + freq_values[2]) / 2;
904 for (i = 0; i < 3; i++) {
905 size += sprintf(buf + size, "%d: %uMhz %s\n", i, freq_values[i],
906 i == mark_index ? "*" : "");
912 gen_speed = (RREG32_PCIE(smnPCIE_LC_SPEED_CNTL) &
913 PSWUSP0_PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK)
914 >> PSWUSP0_PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
915 lane_width = (RREG32_PCIE(smnPCIE_LC_LINK_WIDTH_CNTL) &
916 PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD_MASK)
917 >> PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD__SHIFT;
918 for (i = 0; i < NUM_LINK_LEVELS; i++)
919 size += sprintf(buf + size, "%d: %s %s %dMhz %s\n", i,
920 (dpm_context->dpm_tables.pcie_table.pcie_gen[i] == 0) ? "2.5GT/s," :
921 (dpm_context->dpm_tables.pcie_table.pcie_gen[i] == 1) ? "5.0GT/s," :
922 (dpm_context->dpm_tables.pcie_table.pcie_gen[i] == 2) ? "8.0GT/s," :
923 (dpm_context->dpm_tables.pcie_table.pcie_gen[i] == 3) ? "16.0GT/s," : "",
924 (dpm_context->dpm_tables.pcie_table.pcie_lane[i] == 1) ? "x1" :
925 (dpm_context->dpm_tables.pcie_table.pcie_lane[i] == 2) ? "x2" :
926 (dpm_context->dpm_tables.pcie_table.pcie_lane[i] == 3) ? "x4" :
927 (dpm_context->dpm_tables.pcie_table.pcie_lane[i] == 4) ? "x8" :
928 (dpm_context->dpm_tables.pcie_table.pcie_lane[i] == 5) ? "x12" :
929 (dpm_context->dpm_tables.pcie_table.pcie_lane[i] == 6) ? "x16" : "",
930 pptable->LclkFreq[i],
931 (gen_speed == dpm_context->dpm_tables.pcie_table.pcie_gen[i]) &&
932 (lane_width == dpm_context->dpm_tables.pcie_table.pcie_lane[i]) ?
940 if ((clk_type == SMU_GFXCLK) || (clk_type == SMU_SCLK))
941 amdgpu_gfx_off_ctrl(adev, true);
946 static int sienna_cichlid_force_clk_levels(struct smu_context *smu,
947 enum smu_clk_type clk_type, uint32_t mask)
949 struct amdgpu_device *adev = smu->adev;
950 int ret = 0, size = 0;
951 uint32_t soft_min_level = 0, soft_max_level = 0, min_freq = 0, max_freq = 0;
953 soft_min_level = mask ? (ffs(mask) - 1) : 0;
954 soft_max_level = mask ? (fls(mask) - 1) : 0;
956 if ((clk_type == SMU_GFXCLK) || (clk_type == SMU_SCLK))
957 amdgpu_gfx_off_ctrl(adev, false);
967 /* There is only 2 levels for fine grained DPM */
968 if (sienna_cichlid_is_support_fine_grained_dpm(smu, clk_type)) {
969 soft_max_level = (soft_max_level >= 1 ? 1 : 0);
970 soft_min_level = (soft_min_level >= 1 ? 1 : 0);
973 ret = smu_get_dpm_freq_by_index(smu, clk_type, soft_min_level, &min_freq);
975 goto forec_level_out;
977 ret = smu_get_dpm_freq_by_index(smu, clk_type, soft_max_level, &max_freq);
979 goto forec_level_out;
981 ret = smu_set_soft_freq_range(smu, clk_type, min_freq, max_freq, false);
983 goto forec_level_out;
990 if ((clk_type == SMU_GFXCLK) || (clk_type == SMU_SCLK))
991 amdgpu_gfx_off_ctrl(adev, true);
996 static int sienna_cichlid_populate_umd_state_clk(struct smu_context *smu)
999 uint32_t min_sclk_freq = 0, min_mclk_freq = 0;
1001 ret = smu_get_dpm_freq_range(smu, SMU_SCLK, &min_sclk_freq, NULL, false);
1005 smu->pstate_sclk = min_sclk_freq * 100;
1007 ret = smu_get_dpm_freq_range(smu, SMU_MCLK, &min_mclk_freq, NULL, false);
1011 smu->pstate_mclk = min_mclk_freq * 100;
1016 static int sienna_cichlid_pre_display_config_changed(struct smu_context *smu)
1019 uint32_t max_freq = 0;
1021 /* Sienna_Cichlid do not support to change display num currently */
1024 ret = smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays, 0, NULL);
1029 if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT)) {
1030 ret = smu_get_dpm_freq_range(smu, SMU_UCLK, NULL, &max_freq, false);
1033 ret = smu_set_hard_freq_range(smu, SMU_UCLK, 0, max_freq);
1041 static int sienna_cichlid_display_config_changed(struct smu_context *smu)
1045 if ((smu->watermarks_bitmap & WATERMARKS_EXIST) &&
1046 smu_feature_is_supported(smu, SMU_FEATURE_DPM_DCEFCLK_BIT) &&
1047 smu_feature_is_supported(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) {
1049 ret = smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays,
1050 smu->display_config->num_display,
1060 static int sienna_cichlid_force_dpm_limit_value(struct smu_context *smu, bool highest)
1063 uint32_t min_freq, max_freq, force_freq;
1064 enum smu_clk_type clk_type;
1066 enum smu_clk_type clks[] = {
1072 for (i = 0; i < ARRAY_SIZE(clks); i++) {
1074 ret = smu_get_dpm_freq_range(smu, clk_type, &min_freq, &max_freq, false);
1078 force_freq = highest ? max_freq : min_freq;
1079 ret = smu_set_soft_freq_range(smu, clk_type, force_freq, force_freq, false);
1087 static int sienna_cichlid_unforce_dpm_levels(struct smu_context *smu)
1090 uint32_t min_freq, max_freq;
1091 enum smu_clk_type clk_type;
1093 enum smu_clk_type clks[] = {
1099 for (i = 0; i < ARRAY_SIZE(clks); i++) {
1101 ret = smu_get_dpm_freq_range(smu, clk_type, &min_freq, &max_freq, false);
1105 ret = smu_set_soft_freq_range(smu, clk_type, min_freq, max_freq, false);
1113 static int sienna_cichlid_get_gpu_power(struct smu_context *smu, uint32_t *value)
1118 return sienna_cichlid_get_smu_metrics_data(smu,
1119 METRICS_AVERAGE_SOCKETPOWER,
1123 static int sienna_cichlid_get_current_activity_percent(struct smu_context *smu,
1124 enum amd_pp_sensors sensor,
1133 case AMDGPU_PP_SENSOR_GPU_LOAD:
1134 ret = sienna_cichlid_get_smu_metrics_data(smu,
1135 METRICS_AVERAGE_GFXACTIVITY,
1138 case AMDGPU_PP_SENSOR_MEM_LOAD:
1139 ret = sienna_cichlid_get_smu_metrics_data(smu,
1140 METRICS_AVERAGE_MEMACTIVITY,
1144 dev_err(smu->adev->dev, "Invalid sensor for retrieving clock activity\n");
1151 static bool sienna_cichlid_is_dpm_running(struct smu_context *smu)
1154 uint32_t feature_mask[2];
1155 unsigned long feature_enabled;
1156 ret = smu_feature_get_enabled_mask(smu, feature_mask, 2);
1157 feature_enabled = (unsigned long)((uint64_t)feature_mask[0] |
1158 ((uint64_t)feature_mask[1] << 32));
1159 return !!(feature_enabled & SMC_DPM_FEATURE);
1162 static int sienna_cichlid_get_fan_speed_rpm(struct smu_context *smu,
1168 return sienna_cichlid_get_smu_metrics_data(smu,
1169 METRICS_CURR_FANSPEED,
1173 static int sienna_cichlid_get_fan_speed_percent(struct smu_context *smu,
1177 uint32_t percent = 0;
1178 uint32_t current_rpm;
1179 PPTable_t *pptable = smu->smu_table.driver_pptable;
1181 ret = sienna_cichlid_get_fan_speed_rpm(smu, ¤t_rpm);
1185 percent = current_rpm * 100 / pptable->FanMaximumRpm;
1186 *speed = percent > 100 ? 100 : percent;
1191 static int sienna_cichlid_get_power_profile_mode(struct smu_context *smu, char *buf)
1193 DpmActivityMonitorCoeffInt_t activity_monitor;
1194 uint32_t i, size = 0;
1195 int16_t workload_type = 0;
1196 static const char *profile_name[] = {
1204 static const char *title[] = {
1205 "PROFILE_INDEX(NAME)",
1209 "MinActiveFreqType",
1214 "PD_Data_error_coeff",
1215 "PD_Data_error_rate_coeff"};
1221 size += sprintf(buf + size, "%16s %s %s %s %s %s %s %s %s %s %s\n",
1222 title[0], title[1], title[2], title[3], title[4], title[5],
1223 title[6], title[7], title[8], title[9], title[10]);
1225 for (i = 0; i <= PP_SMC_POWER_PROFILE_CUSTOM; i++) {
1226 /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */
1227 workload_type = smu_workload_get_type(smu, i);
1228 if (workload_type < 0)
1231 result = smu_update_table(smu,
1232 SMU_TABLE_ACTIVITY_MONITOR_COEFF, workload_type,
1233 (void *)(&activity_monitor), false);
1235 dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__);
1239 size += sprintf(buf + size, "%2d %14s%s:\n",
1240 i, profile_name[i], (i == smu->power_profile_mode) ? "*" : " ");
1242 size += sprintf(buf + size, "%19s %d(%13s) %7d %7d %7d %7d %7d %7d %7d %7d %7d\n",
1246 activity_monitor.Gfx_FPS,
1247 activity_monitor.Gfx_MinFreqStep,
1248 activity_monitor.Gfx_MinActiveFreqType,
1249 activity_monitor.Gfx_MinActiveFreq,
1250 activity_monitor.Gfx_BoosterFreqType,
1251 activity_monitor.Gfx_BoosterFreq,
1252 activity_monitor.Gfx_PD_Data_limit_c,
1253 activity_monitor.Gfx_PD_Data_error_coeff,
1254 activity_monitor.Gfx_PD_Data_error_rate_coeff);
1256 size += sprintf(buf + size, "%19s %d(%13s) %7d %7d %7d %7d %7d %7d %7d %7d %7d\n",
1260 activity_monitor.Fclk_FPS,
1261 activity_monitor.Fclk_MinFreqStep,
1262 activity_monitor.Fclk_MinActiveFreqType,
1263 activity_monitor.Fclk_MinActiveFreq,
1264 activity_monitor.Fclk_BoosterFreqType,
1265 activity_monitor.Fclk_BoosterFreq,
1266 activity_monitor.Fclk_PD_Data_limit_c,
1267 activity_monitor.Fclk_PD_Data_error_coeff,
1268 activity_monitor.Fclk_PD_Data_error_rate_coeff);
1270 size += sprintf(buf + size, "%19s %d(%13s) %7d %7d %7d %7d %7d %7d %7d %7d %7d\n",
1274 activity_monitor.Mem_FPS,
1275 activity_monitor.Mem_MinFreqStep,
1276 activity_monitor.Mem_MinActiveFreqType,
1277 activity_monitor.Mem_MinActiveFreq,
1278 activity_monitor.Mem_BoosterFreqType,
1279 activity_monitor.Mem_BoosterFreq,
1280 activity_monitor.Mem_PD_Data_limit_c,
1281 activity_monitor.Mem_PD_Data_error_coeff,
1282 activity_monitor.Mem_PD_Data_error_rate_coeff);
1288 static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, long *input, uint32_t size)
1290 DpmActivityMonitorCoeffInt_t activity_monitor;
1291 int workload_type, ret = 0;
1293 smu->power_profile_mode = input[size];
1295 if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) {
1296 dev_err(smu->adev->dev, "Invalid power profile mode %d\n", smu->power_profile_mode);
1300 if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
1302 ret = smu_update_table(smu,
1303 SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
1304 (void *)(&activity_monitor), false);
1306 dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__);
1311 case 0: /* Gfxclk */
1312 activity_monitor.Gfx_FPS = input[1];
1313 activity_monitor.Gfx_MinFreqStep = input[2];
1314 activity_monitor.Gfx_MinActiveFreqType = input[3];
1315 activity_monitor.Gfx_MinActiveFreq = input[4];
1316 activity_monitor.Gfx_BoosterFreqType = input[5];
1317 activity_monitor.Gfx_BoosterFreq = input[6];
1318 activity_monitor.Gfx_PD_Data_limit_c = input[7];
1319 activity_monitor.Gfx_PD_Data_error_coeff = input[8];
1320 activity_monitor.Gfx_PD_Data_error_rate_coeff = input[9];
1322 case 1: /* Socclk */
1323 activity_monitor.Fclk_FPS = input[1];
1324 activity_monitor.Fclk_MinFreqStep = input[2];
1325 activity_monitor.Fclk_MinActiveFreqType = input[3];
1326 activity_monitor.Fclk_MinActiveFreq = input[4];
1327 activity_monitor.Fclk_BoosterFreqType = input[5];
1328 activity_monitor.Fclk_BoosterFreq = input[6];
1329 activity_monitor.Fclk_PD_Data_limit_c = input[7];
1330 activity_monitor.Fclk_PD_Data_error_coeff = input[8];
1331 activity_monitor.Fclk_PD_Data_error_rate_coeff = input[9];
1334 activity_monitor.Mem_FPS = input[1];
1335 activity_monitor.Mem_MinFreqStep = input[2];
1336 activity_monitor.Mem_MinActiveFreqType = input[3];
1337 activity_monitor.Mem_MinActiveFreq = input[4];
1338 activity_monitor.Mem_BoosterFreqType = input[5];
1339 activity_monitor.Mem_BoosterFreq = input[6];
1340 activity_monitor.Mem_PD_Data_limit_c = input[7];
1341 activity_monitor.Mem_PD_Data_error_coeff = input[8];
1342 activity_monitor.Mem_PD_Data_error_rate_coeff = input[9];
1346 ret = smu_update_table(smu,
1347 SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
1348 (void *)(&activity_monitor), true);
1350 dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__);
1355 /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */
1356 workload_type = smu_workload_get_type(smu, smu->power_profile_mode);
1357 if (workload_type < 0)
1359 smu_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask,
1360 1 << workload_type, NULL);
1365 static int sienna_cichlid_get_profiling_clk_mask(struct smu_context *smu,
1366 enum amd_dpm_forced_level level,
1367 uint32_t *sclk_mask,
1368 uint32_t *mclk_mask,
1371 struct amdgpu_device *adev = smu->adev;
1373 uint32_t level_count = 0;
1375 if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) {
1378 } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) {
1381 } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) {
1383 amdgpu_gfx_off_ctrl(adev, false);
1384 ret = smu_get_dpm_level_count(smu, SMU_SCLK, &level_count);
1385 amdgpu_gfx_off_ctrl(adev, true);
1388 *sclk_mask = level_count - 1;
1392 ret = smu_get_dpm_level_count(smu, SMU_MCLK, &level_count);
1395 *mclk_mask = level_count - 1;
1399 ret = smu_get_dpm_level_count(smu, SMU_SOCCLK, &level_count);
1402 *soc_mask = level_count - 1;
1409 static int sienna_cichlid_notify_smc_display_config(struct smu_context *smu)
1411 struct smu_clocks min_clocks = {0};
1412 struct pp_display_clock_request clock_req;
1415 min_clocks.dcef_clock = smu->display_config->min_dcef_set_clk;
1416 min_clocks.dcef_clock_in_sr = smu->display_config->min_dcef_deep_sleep_set_clk;
1417 min_clocks.memory_clock = smu->display_config->min_mem_set_clock;
1419 if (smu_feature_is_supported(smu, SMU_FEATURE_DPM_DCEFCLK_BIT)) {
1420 clock_req.clock_type = amd_pp_dcef_clock;
1421 clock_req.clock_freq_in_khz = min_clocks.dcef_clock * 10;
1423 ret = smu_v11_0_display_clock_voltage_request(smu, &clock_req);
1425 if (smu_feature_is_supported(smu, SMU_FEATURE_DS_DCEFCLK_BIT)) {
1426 ret = smu_send_smc_msg_with_param(smu,
1427 SMU_MSG_SetMinDeepSleepDcefclk,
1428 min_clocks.dcef_clock_in_sr/100,
1431 dev_err(smu->adev->dev, "Attempt to set divider for DCEFCLK Failed!");
1436 dev_info(smu->adev->dev, "Attempt to set Hard Min for DCEFCLK Failed!");
1440 if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT)) {
1441 ret = smu_set_hard_freq_range(smu, SMU_UCLK, min_clocks.memory_clock/100, 0);
1443 dev_err(smu->adev->dev, "[%s] Set hard min uclk failed!", __func__);
1451 static int sienna_cichlid_set_watermarks_table(struct smu_context *smu,
1452 void *watermarks, struct
1453 dm_pp_wm_sets_with_clock_ranges_soc15
1458 Watermarks_t *table = watermarks;
1460 if (!table || !clock_ranges)
1463 if (clock_ranges->num_wm_dmif_sets > 4 ||
1464 clock_ranges->num_wm_mcif_sets > 4)
1467 for (i = 0; i < clock_ranges->num_wm_dmif_sets; i++) {
1468 table->WatermarkRow[1][i].MinClock =
1469 cpu_to_le16((uint16_t)
1470 (clock_ranges->wm_dmif_clocks_ranges[i].wm_min_dcfclk_clk_in_khz /
1472 table->WatermarkRow[1][i].MaxClock =
1473 cpu_to_le16((uint16_t)
1474 (clock_ranges->wm_dmif_clocks_ranges[i].wm_max_dcfclk_clk_in_khz /
1476 table->WatermarkRow[1][i].MinUclk =
1477 cpu_to_le16((uint16_t)
1478 (clock_ranges->wm_dmif_clocks_ranges[i].wm_min_mem_clk_in_khz /
1480 table->WatermarkRow[1][i].MaxUclk =
1481 cpu_to_le16((uint16_t)
1482 (clock_ranges->wm_dmif_clocks_ranges[i].wm_max_mem_clk_in_khz /
1484 table->WatermarkRow[1][i].WmSetting = (uint8_t)
1485 clock_ranges->wm_dmif_clocks_ranges[i].wm_set_id;
1488 for (i = 0; i < clock_ranges->num_wm_mcif_sets; i++) {
1489 table->WatermarkRow[0][i].MinClock =
1490 cpu_to_le16((uint16_t)
1491 (clock_ranges->wm_mcif_clocks_ranges[i].wm_min_socclk_clk_in_khz /
1493 table->WatermarkRow[0][i].MaxClock =
1494 cpu_to_le16((uint16_t)
1495 (clock_ranges->wm_mcif_clocks_ranges[i].wm_max_socclk_clk_in_khz /
1497 table->WatermarkRow[0][i].MinUclk =
1498 cpu_to_le16((uint16_t)
1499 (clock_ranges->wm_mcif_clocks_ranges[i].wm_min_mem_clk_in_khz /
1501 table->WatermarkRow[0][i].MaxUclk =
1502 cpu_to_le16((uint16_t)
1503 (clock_ranges->wm_mcif_clocks_ranges[i].wm_max_mem_clk_in_khz /
1505 table->WatermarkRow[0][i].WmSetting = (uint8_t)
1506 clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id;
1509 smu->watermarks_bitmap |= WATERMARKS_EXIST;
1511 if (!(smu->watermarks_bitmap & WATERMARKS_LOADED)) {
1512 ret = smu_write_watermarks_table(smu);
1514 dev_err(smu->adev->dev, "Failed to update WMTABLE!");
1517 smu->watermarks_bitmap |= WATERMARKS_LOADED;
1523 static int sienna_cichlid_thermal_get_temperature(struct smu_context *smu,
1524 enum amd_pp_sensors sensor,
1533 case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
1534 ret = sienna_cichlid_get_smu_metrics_data(smu,
1535 METRICS_TEMPERATURE_HOTSPOT,
1538 case AMDGPU_PP_SENSOR_EDGE_TEMP:
1539 ret = sienna_cichlid_get_smu_metrics_data(smu,
1540 METRICS_TEMPERATURE_EDGE,
1543 case AMDGPU_PP_SENSOR_MEM_TEMP:
1544 ret = sienna_cichlid_get_smu_metrics_data(smu,
1545 METRICS_TEMPERATURE_MEM,
1549 dev_err(smu->adev->dev, "Invalid sensor for retrieving temp\n");
1556 static int sienna_cichlid_read_sensor(struct smu_context *smu,
1557 enum amd_pp_sensors sensor,
1558 void *data, uint32_t *size)
1561 struct smu_table_context *table_context = &smu->smu_table;
1562 PPTable_t *pptable = table_context->driver_pptable;
1567 mutex_lock(&smu->sensor_lock);
1569 case AMDGPU_PP_SENSOR_MAX_FAN_RPM:
1570 *(uint32_t *)data = pptable->FanMaximumRpm;
1573 case AMDGPU_PP_SENSOR_MEM_LOAD:
1574 case AMDGPU_PP_SENSOR_GPU_LOAD:
1575 ret = sienna_cichlid_get_current_activity_percent(smu, sensor, (uint32_t *)data);
1578 case AMDGPU_PP_SENSOR_GPU_POWER:
1579 ret = sienna_cichlid_get_gpu_power(smu, (uint32_t *)data);
1582 case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
1583 case AMDGPU_PP_SENSOR_EDGE_TEMP:
1584 case AMDGPU_PP_SENSOR_MEM_TEMP:
1585 ret = sienna_cichlid_thermal_get_temperature(smu, sensor, (uint32_t *)data);
1589 ret = smu_v11_0_read_sensor(smu, sensor, data, size);
1591 mutex_unlock(&smu->sensor_lock);
1596 static int sienna_cichlid_get_uclk_dpm_states(struct smu_context *smu, uint32_t *clocks_in_khz, uint32_t *num_states)
1598 uint32_t num_discrete_levels = 0;
1599 uint16_t *dpm_levels = NULL;
1601 struct smu_table_context *table_context = &smu->smu_table;
1602 PPTable_t *driver_ppt = NULL;
1604 if (!clocks_in_khz || !num_states || !table_context->driver_pptable)
1607 driver_ppt = table_context->driver_pptable;
1608 num_discrete_levels = driver_ppt->DpmDescriptor[PPCLK_UCLK].NumDiscreteLevels;
1609 dpm_levels = driver_ppt->FreqTableUclk;
1611 if (num_discrete_levels == 0 || dpm_levels == NULL)
1614 *num_states = num_discrete_levels;
1615 for (i = 0; i < num_discrete_levels; i++) {
1616 /* convert to khz */
1617 *clocks_in_khz = (*dpm_levels) * 1000;
1625 static int sienna_cichlid_set_performance_level(struct smu_context *smu,
1626 enum amd_dpm_forced_level level);
1628 static int sienna_cichlid_set_standard_performance_level(struct smu_context *smu)
1630 struct amdgpu_device *adev = smu->adev;
1632 uint32_t sclk_freq = 0, uclk_freq = 0;
1634 switch (adev->asic_type) {
1635 /* TODO: need to set specify clk value by asic type, not support yet*/
1637 /* by default, this is same as auto performance level */
1638 return sienna_cichlid_set_performance_level(smu, AMD_DPM_FORCED_LEVEL_AUTO);
1641 ret = smu_set_soft_freq_range(smu, SMU_SCLK, sclk_freq, sclk_freq, false);
1644 ret = smu_set_soft_freq_range(smu, SMU_UCLK, uclk_freq, uclk_freq, false);
1651 static int sienna_cichlid_set_peak_performance_level(struct smu_context *smu)
1655 /* TODO: not support yet*/
1659 static int sienna_cichlid_set_performance_level(struct smu_context *smu,
1660 enum amd_dpm_forced_level level)
1663 uint32_t sclk_mask, mclk_mask, soc_mask;
1666 case AMD_DPM_FORCED_LEVEL_HIGH:
1667 ret = smu_force_dpm_limit_value(smu, true);
1669 case AMD_DPM_FORCED_LEVEL_LOW:
1670 ret = smu_force_dpm_limit_value(smu, false);
1672 case AMD_DPM_FORCED_LEVEL_AUTO:
1673 ret = smu_unforce_dpm_levels(smu);
1675 case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD:
1676 ret = sienna_cichlid_set_standard_performance_level(smu);
1678 case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK:
1679 case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK:
1680 ret = smu_get_profiling_clk_mask(smu, level,
1686 smu_force_clk_levels(smu, SMU_SCLK, 1 << sclk_mask, false);
1687 smu_force_clk_levels(smu, SMU_MCLK, 1 << mclk_mask, false);
1688 smu_force_clk_levels(smu, SMU_SOCCLK, 1 << soc_mask, false);
1690 case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK:
1691 ret = sienna_cichlid_set_peak_performance_level(smu);
1693 case AMD_DPM_FORCED_LEVEL_MANUAL:
1694 case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT:
1701 static int sienna_cichlid_get_thermal_temperature_range(struct smu_context *smu,
1702 struct smu_temperature_range *range)
1704 struct smu_table_context *table_context = &smu->smu_table;
1705 struct smu_11_0_7_powerplay_table *powerplay_table = table_context->power_play_table;
1707 if (!range || !powerplay_table)
1710 range->max = powerplay_table->software_shutdown_temp *
1711 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
1716 static int sienna_cichlid_display_disable_memory_clock_switch(struct smu_context *smu,
1717 bool disable_memory_clock_switch)
1720 struct smu_11_0_max_sustainable_clocks *max_sustainable_clocks =
1721 (struct smu_11_0_max_sustainable_clocks *)
1722 smu->smu_table.max_sustainable_clocks;
1723 uint32_t min_memory_clock = smu->hard_min_uclk_req_from_dal;
1724 uint32_t max_memory_clock = max_sustainable_clocks->uclock;
1726 if(smu->disable_uclk_switch == disable_memory_clock_switch)
1729 if(disable_memory_clock_switch)
1730 ret = smu_set_hard_freq_range(smu, SMU_UCLK, max_memory_clock, 0);
1732 ret = smu_set_hard_freq_range(smu, SMU_UCLK, min_memory_clock, 0);
1735 smu->disable_uclk_switch = disable_memory_clock_switch;
1740 static int sienna_cichlid_get_power_limit(struct smu_context *smu)
1742 struct smu_11_0_7_powerplay_table *powerplay_table =
1743 (struct smu_11_0_7_powerplay_table *)smu->smu_table.power_play_table;
1744 PPTable_t *pptable = smu->smu_table.driver_pptable;
1745 uint32_t power_limit, od_percent;
1747 if (smu_v11_0_get_current_power_limit(smu, &power_limit)) {
1748 /* the last hope to figure out the ppt limit */
1750 dev_err(smu->adev->dev, "Cannot get PPT limit due to pptable missing!");
1754 pptable->SocketPowerLimitAc[PPT_THROTTLER_PPT0];
1756 smu->current_power_limit = power_limit;
1758 if (smu->od_enabled) {
1759 od_percent = le32_to_cpu(powerplay_table->overdrive_table.max[SMU_11_0_7_ODSETTING_POWERPERCENTAGE]);
1761 dev_dbg(smu->adev->dev, "ODSETTING_POWERPERCENTAGE: %d (default: %d)\n", od_percent, power_limit);
1763 power_limit *= (100 + od_percent);
1766 smu->max_power_limit = power_limit;
1771 static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
1772 uint32_t pcie_gen_cap,
1773 uint32_t pcie_width_cap)
1775 PPTable_t *pptable = smu->smu_table.driver_pptable;
1777 uint32_t smu_pcie_arg;
1779 struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
1780 struct smu_11_0_dpm_context *dpm_context = smu_dpm->dpm_context;
1782 for (i = 0; i < NUM_LINK_LEVELS; i++) {
1783 smu_pcie_arg = (i << 16) |
1784 ((pptable->PcieGenSpeed[i] <= pcie_gen_cap) ?
1785 (pptable->PcieGenSpeed[i] << 8) :
1786 (pcie_gen_cap << 8)) |
1787 ((pptable->PcieLaneCount[i] <= pcie_width_cap) ?
1788 pptable->PcieLaneCount[i] :
1791 ret = smu_send_smc_msg_with_param(smu,
1792 SMU_MSG_OverridePcieParameters,
1799 if (pptable->PcieGenSpeed[i] > pcie_gen_cap)
1800 dpm_context->dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_cap;
1801 if (pptable->PcieLaneCount[i] > pcie_width_cap)
1802 dpm_context->dpm_tables.pcie_table.pcie_lane[i] = pcie_width_cap;
1808 int sienna_cichlid_get_dpm_ultimate_freq(struct smu_context *smu,
1809 enum smu_clk_type clk_type,
1810 uint32_t *min, uint32_t *max)
1812 struct amdgpu_device *adev = smu->adev;
1815 if (clk_type == SMU_GFXCLK)
1816 amdgpu_gfx_off_ctrl(adev, false);
1817 ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, min, max);
1818 if (clk_type == SMU_GFXCLK)
1819 amdgpu_gfx_off_ctrl(adev, true);
1824 int sienna_cichlid_set_soft_freq_limited_range(struct smu_context *smu,
1825 enum smu_clk_type clk_type,
1826 uint32_t min, uint32_t max)
1828 struct amdgpu_device *adev = smu->adev;
1831 if (clk_type == SMU_GFXCLK)
1832 amdgpu_gfx_off_ctrl(adev, false);
1833 ret = smu_v11_0_set_soft_freq_limited_range(smu, clk_type, min, max);
1834 if (clk_type == SMU_GFXCLK)
1835 amdgpu_gfx_off_ctrl(adev, true);
1840 static bool sienna_cichlid_is_baco_supported(struct smu_context *smu)
1842 struct amdgpu_device *adev = smu->adev;
1845 if (!smu_v11_0_baco_is_support(smu))
1848 val = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP0);
1849 return (val & RCC_BIF_STRAP0__STRAP_PX_CAPABLE_MASK) ? true : false;
1852 static int sienna_cichlid_set_thermal_range(struct smu_context *smu,
1853 struct smu_temperature_range range)
1855 struct amdgpu_device *adev = smu->adev;
1856 int low = SMU_THERMAL_MINIMUM_ALERT_TEMP;
1857 int high = SMU_THERMAL_MAXIMUM_ALERT_TEMP;
1859 struct smu_table_context *table_context = &smu->smu_table;
1860 struct smu_11_0_7_powerplay_table *powerplay_table = table_context->power_play_table;
1862 low = max(SMU_THERMAL_MINIMUM_ALERT_TEMP,
1863 range.min / SMU_TEMPERATURE_UNITS_PER_CENTIGRADES);
1864 high = min((uint16_t)SMU_THERMAL_MAXIMUM_ALERT_TEMP, powerplay_table->software_shutdown_temp);
1869 val = RREG32_SOC15(THM, 0, mmTHM_THERMAL_INT_CTRL);
1870 val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, MAX_IH_CREDIT, 5);
1871 val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_IH_HW_ENA, 1);
1872 val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTH_MASK, 0);
1873 val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTL_MASK, 0);
1874 val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTH, (high & 0xff));
1875 val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTL, (low & 0xff));
1876 val = val & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK);
1878 WREG32_SOC15(THM, 0, mmTHM_THERMAL_INT_CTRL, val);
1883 static void sienna_cichlid_dump_pptable(struct smu_context *smu)
1885 struct smu_table_context *table_context = &smu->smu_table;
1886 PPTable_t *pptable = table_context->driver_pptable;
1889 dev_info(smu->adev->dev, "Dumped PPTable:\n");
1891 dev_info(smu->adev->dev, "Version = 0x%08x\n", pptable->Version);
1892 dev_info(smu->adev->dev, "FeaturesToRun[0] = 0x%08x\n", pptable->FeaturesToRun[0]);
1893 dev_info(smu->adev->dev, "FeaturesToRun[1] = 0x%08x\n", pptable->FeaturesToRun[1]);
1895 for (i = 0; i < PPT_THROTTLER_COUNT; i++) {
1896 dev_info(smu->adev->dev, "SocketPowerLimitAc[%d] = 0x%x\n", i, pptable->SocketPowerLimitAc[i]);
1897 dev_info(smu->adev->dev, "SocketPowerLimitAcTau[%d] = 0x%x\n", i, pptable->SocketPowerLimitAcTau[i]);
1898 dev_info(smu->adev->dev, "SocketPowerLimitDc[%d] = 0x%x\n", i, pptable->SocketPowerLimitDc[i]);
1899 dev_info(smu->adev->dev, "SocketPowerLimitDcTau[%d] = 0x%x\n", i, pptable->SocketPowerLimitDcTau[i]);
1902 for (i = 0; i < TDC_THROTTLER_COUNT; i++) {
1903 dev_info(smu->adev->dev, "TdcLimit[%d] = 0x%x\n", i, pptable->TdcLimit[i]);
1904 dev_info(smu->adev->dev, "TdcLimitTau[%d] = 0x%x\n", i, pptable->TdcLimitTau[i]);
1907 for (i = 0; i < TEMP_COUNT; i++) {
1908 dev_info(smu->adev->dev, "TemperatureLimit[%d] = 0x%x\n", i, pptable->TemperatureLimit[i]);
1911 dev_info(smu->adev->dev, "FitLimit = 0x%x\n", pptable->FitLimit);
1912 dev_info(smu->adev->dev, "TotalPowerConfig = 0x%x\n", pptable->TotalPowerConfig);
1913 dev_info(smu->adev->dev, "TotalPowerPadding[0] = 0x%x\n", pptable->TotalPowerPadding[0]);
1914 dev_info(smu->adev->dev, "TotalPowerPadding[1] = 0x%x\n", pptable->TotalPowerPadding[1]);
1915 dev_info(smu->adev->dev, "TotalPowerPadding[2] = 0x%x\n", pptable->TotalPowerPadding[2]);
1917 dev_info(smu->adev->dev, "ApccPlusResidencyLimit = 0x%x\n", pptable->ApccPlusResidencyLimit);
1918 for (i = 0; i < NUM_SMNCLK_DPM_LEVELS; i++) {
1919 dev_info(smu->adev->dev, "SmnclkDpmFreq[%d] = 0x%x\n", i, pptable->SmnclkDpmFreq[i]);
1920 dev_info(smu->adev->dev, "SmnclkDpmVoltage[%d] = 0x%x\n", i, pptable->SmnclkDpmVoltage[i]);
1922 dev_info(smu->adev->dev, "PaddingAPCC[0] = 0x%x\n", pptable->PaddingAPCC[0]);
1923 dev_info(smu->adev->dev, "PaddingAPCC[1] = 0x%x\n", pptable->PaddingAPCC[1]);
1924 dev_info(smu->adev->dev, "PaddingAPCC[2] = 0x%x\n", pptable->PaddingAPCC[2]);
1925 dev_info(smu->adev->dev, "PaddingAPCC[3] = 0x%x\n", pptable->PaddingAPCC[3]);
1927 dev_info(smu->adev->dev, "ThrottlerControlMask = 0x%x\n", pptable->ThrottlerControlMask);
1929 dev_info(smu->adev->dev, "FwDStateMask = 0x%x\n", pptable->FwDStateMask);
1931 dev_info(smu->adev->dev, "UlvVoltageOffsetSoc = 0x%x\n", pptable->UlvVoltageOffsetSoc);
1932 dev_info(smu->adev->dev, "UlvVoltageOffsetGfx = 0x%x\n", pptable->UlvVoltageOffsetGfx);
1933 dev_info(smu->adev->dev, "MinVoltageUlvGfx = 0x%x\n", pptable->MinVoltageUlvGfx);
1934 dev_info(smu->adev->dev, "MinVoltageUlvSoc = 0x%x\n", pptable->MinVoltageUlvSoc);
1936 dev_info(smu->adev->dev, "SocLIVmin = 0x%x\n", pptable->SocLIVmin);
1937 dev_info(smu->adev->dev, "PaddingLIVmin = 0x%x\n", pptable->PaddingLIVmin);
1939 dev_info(smu->adev->dev, "GceaLinkMgrIdleThreshold = 0x%x\n", pptable->GceaLinkMgrIdleThreshold);
1940 dev_info(smu->adev->dev, "paddingRlcUlvParams[0] = 0x%x\n", pptable->paddingRlcUlvParams[0]);
1941 dev_info(smu->adev->dev, "paddingRlcUlvParams[1] = 0x%x\n", pptable->paddingRlcUlvParams[1]);
1942 dev_info(smu->adev->dev, "paddingRlcUlvParams[2] = 0x%x\n", pptable->paddingRlcUlvParams[2]);
1944 dev_info(smu->adev->dev, "MinVoltageGfx = 0x%x\n", pptable->MinVoltageGfx);
1945 dev_info(smu->adev->dev, "MinVoltageSoc = 0x%x\n", pptable->MinVoltageSoc);
1946 dev_info(smu->adev->dev, "MaxVoltageGfx = 0x%x\n", pptable->MaxVoltageGfx);
1947 dev_info(smu->adev->dev, "MaxVoltageSoc = 0x%x\n", pptable->MaxVoltageSoc);
1949 dev_info(smu->adev->dev, "LoadLineResistanceGfx = 0x%x\n", pptable->LoadLineResistanceGfx);
1950 dev_info(smu->adev->dev, "LoadLineResistanceSoc = 0x%x\n", pptable->LoadLineResistanceSoc);
1952 dev_info(smu->adev->dev, "VDDGFX_TVmin = 0x%x\n", pptable->VDDGFX_TVmin);
1953 dev_info(smu->adev->dev, "VDDSOC_TVmin = 0x%x\n", pptable->VDDSOC_TVmin);
1954 dev_info(smu->adev->dev, "VDDGFX_Vmin_HiTemp = 0x%x\n", pptable->VDDGFX_Vmin_HiTemp);
1955 dev_info(smu->adev->dev, "VDDGFX_Vmin_LoTemp = 0x%x\n", pptable->VDDGFX_Vmin_LoTemp);
1956 dev_info(smu->adev->dev, "VDDSOC_Vmin_HiTemp = 0x%x\n", pptable->VDDSOC_Vmin_HiTemp);
1957 dev_info(smu->adev->dev, "VDDSOC_Vmin_LoTemp = 0x%x\n", pptable->VDDSOC_Vmin_LoTemp);
1958 dev_info(smu->adev->dev, "VDDGFX_TVminHystersis = 0x%x\n", pptable->VDDGFX_TVminHystersis);
1959 dev_info(smu->adev->dev, "VDDSOC_TVminHystersis = 0x%x\n", pptable->VDDSOC_TVminHystersis);
1961 dev_info(smu->adev->dev, "[PPCLK_GFXCLK]\n"
1962 " .VoltageMode = 0x%02x\n"
1963 " .SnapToDiscrete = 0x%02x\n"
1964 " .NumDiscreteLevels = 0x%02x\n"
1965 " .padding = 0x%02x\n"
1966 " .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
1967 " .SsCurve {a = 0x%08x b = 0x%08x c = 0x%08x}\n"
1968 " .SsFmin = 0x%04x\n"
1969 " .Padding_16 = 0x%04x\n",
1970 pptable->DpmDescriptor[PPCLK_GFXCLK].VoltageMode,
1971 pptable->DpmDescriptor[PPCLK_GFXCLK].SnapToDiscrete,
1972 pptable->DpmDescriptor[PPCLK_GFXCLK].NumDiscreteLevels,
1973 pptable->DpmDescriptor[PPCLK_GFXCLK].Padding,
1974 pptable->DpmDescriptor[PPCLK_GFXCLK].ConversionToAvfsClk.m,
1975 pptable->DpmDescriptor[PPCLK_GFXCLK].ConversionToAvfsClk.b,
1976 pptable->DpmDescriptor[PPCLK_GFXCLK].SsCurve.a,
1977 pptable->DpmDescriptor[PPCLK_GFXCLK].SsCurve.b,
1978 pptable->DpmDescriptor[PPCLK_GFXCLK].SsCurve.c,
1979 pptable->DpmDescriptor[PPCLK_GFXCLK].SsFmin,
1980 pptable->DpmDescriptor[PPCLK_GFXCLK].Padding16);
1982 dev_info(smu->adev->dev, "[PPCLK_SOCCLK]\n"
1983 " .VoltageMode = 0x%02x\n"
1984 " .SnapToDiscrete = 0x%02x\n"
1985 " .NumDiscreteLevels = 0x%02x\n"
1986 " .padding = 0x%02x\n"
1987 " .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
1988 " .SsCurve {a = 0x%08x b = 0x%08x c = 0x%08x}\n"
1989 " .SsFmin = 0x%04x\n"
1990 " .Padding_16 = 0x%04x\n",
1991 pptable->DpmDescriptor[PPCLK_SOCCLK].VoltageMode,
1992 pptable->DpmDescriptor[PPCLK_SOCCLK].SnapToDiscrete,
1993 pptable->DpmDescriptor[PPCLK_SOCCLK].NumDiscreteLevels,
1994 pptable->DpmDescriptor[PPCLK_SOCCLK].Padding,
1995 pptable->DpmDescriptor[PPCLK_SOCCLK].ConversionToAvfsClk.m,
1996 pptable->DpmDescriptor[PPCLK_SOCCLK].ConversionToAvfsClk.b,
1997 pptable->DpmDescriptor[PPCLK_SOCCLK].SsCurve.a,
1998 pptable->DpmDescriptor[PPCLK_SOCCLK].SsCurve.b,
1999 pptable->DpmDescriptor[PPCLK_SOCCLK].SsCurve.c,
2000 pptable->DpmDescriptor[PPCLK_SOCCLK].SsFmin,
2001 pptable->DpmDescriptor[PPCLK_SOCCLK].Padding16);
2003 dev_info(smu->adev->dev, "[PPCLK_UCLK]\n"
2004 " .VoltageMode = 0x%02x\n"
2005 " .SnapToDiscrete = 0x%02x\n"
2006 " .NumDiscreteLevels = 0x%02x\n"
2007 " .padding = 0x%02x\n"
2008 " .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
2009 " .SsCurve {a = 0x%08x b = 0x%08x c = 0x%08x}\n"
2010 " .SsFmin = 0x%04x\n"
2011 " .Padding_16 = 0x%04x\n",
2012 pptable->DpmDescriptor[PPCLK_UCLK].VoltageMode,
2013 pptable->DpmDescriptor[PPCLK_UCLK].SnapToDiscrete,
2014 pptable->DpmDescriptor[PPCLK_UCLK].NumDiscreteLevels,
2015 pptable->DpmDescriptor[PPCLK_UCLK].Padding,
2016 pptable->DpmDescriptor[PPCLK_UCLK].ConversionToAvfsClk.m,
2017 pptable->DpmDescriptor[PPCLK_UCLK].ConversionToAvfsClk.b,
2018 pptable->DpmDescriptor[PPCLK_UCLK].SsCurve.a,
2019 pptable->DpmDescriptor[PPCLK_UCLK].SsCurve.b,
2020 pptable->DpmDescriptor[PPCLK_UCLK].SsCurve.c,
2021 pptable->DpmDescriptor[PPCLK_UCLK].SsFmin,
2022 pptable->DpmDescriptor[PPCLK_UCLK].Padding16);
2024 dev_info(smu->adev->dev, "[PPCLK_FCLK]\n"
2025 " .VoltageMode = 0x%02x\n"
2026 " .SnapToDiscrete = 0x%02x\n"
2027 " .NumDiscreteLevels = 0x%02x\n"
2028 " .padding = 0x%02x\n"
2029 " .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
2030 " .SsCurve {a = 0x%08x b = 0x%08x c = 0x%08x}\n"
2031 " .SsFmin = 0x%04x\n"
2032 " .Padding_16 = 0x%04x\n",
2033 pptable->DpmDescriptor[PPCLK_FCLK].VoltageMode,
2034 pptable->DpmDescriptor[PPCLK_FCLK].SnapToDiscrete,
2035 pptable->DpmDescriptor[PPCLK_FCLK].NumDiscreteLevels,
2036 pptable->DpmDescriptor[PPCLK_FCLK].Padding,
2037 pptable->DpmDescriptor[PPCLK_FCLK].ConversionToAvfsClk.m,
2038 pptable->DpmDescriptor[PPCLK_FCLK].ConversionToAvfsClk.b,
2039 pptable->DpmDescriptor[PPCLK_FCLK].SsCurve.a,
2040 pptable->DpmDescriptor[PPCLK_FCLK].SsCurve.b,
2041 pptable->DpmDescriptor[PPCLK_FCLK].SsCurve.c,
2042 pptable->DpmDescriptor[PPCLK_FCLK].SsFmin,
2043 pptable->DpmDescriptor[PPCLK_FCLK].Padding16);
2045 dev_info(smu->adev->dev, "[PPCLK_DCLK_0]\n"
2046 " .VoltageMode = 0x%02x\n"
2047 " .SnapToDiscrete = 0x%02x\n"
2048 " .NumDiscreteLevels = 0x%02x\n"
2049 " .padding = 0x%02x\n"
2050 " .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
2051 " .SsCurve {a = 0x%08x b = 0x%08x c = 0x%08x}\n"
2052 " .SsFmin = 0x%04x\n"
2053 " .Padding_16 = 0x%04x\n",
2054 pptable->DpmDescriptor[PPCLK_DCLK_0].VoltageMode,
2055 pptable->DpmDescriptor[PPCLK_DCLK_0].SnapToDiscrete,
2056 pptable->DpmDescriptor[PPCLK_DCLK_0].NumDiscreteLevels,
2057 pptable->DpmDescriptor[PPCLK_DCLK_0].Padding,
2058 pptable->DpmDescriptor[PPCLK_DCLK_0].ConversionToAvfsClk.m,
2059 pptable->DpmDescriptor[PPCLK_DCLK_0].ConversionToAvfsClk.b,
2060 pptable->DpmDescriptor[PPCLK_DCLK_0].SsCurve.a,
2061 pptable->DpmDescriptor[PPCLK_DCLK_0].SsCurve.b,
2062 pptable->DpmDescriptor[PPCLK_DCLK_0].SsCurve.c,
2063 pptable->DpmDescriptor[PPCLK_DCLK_0].SsFmin,
2064 pptable->DpmDescriptor[PPCLK_DCLK_0].Padding16);
2066 dev_info(smu->adev->dev, "[PPCLK_VCLK_0]\n"
2067 " .VoltageMode = 0x%02x\n"
2068 " .SnapToDiscrete = 0x%02x\n"
2069 " .NumDiscreteLevels = 0x%02x\n"
2070 " .padding = 0x%02x\n"
2071 " .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
2072 " .SsCurve {a = 0x%08x b = 0x%08x c = 0x%08x}\n"
2073 " .SsFmin = 0x%04x\n"
2074 " .Padding_16 = 0x%04x\n",
2075 pptable->DpmDescriptor[PPCLK_VCLK_0].VoltageMode,
2076 pptable->DpmDescriptor[PPCLK_VCLK_0].SnapToDiscrete,
2077 pptable->DpmDescriptor[PPCLK_VCLK_0].NumDiscreteLevels,
2078 pptable->DpmDescriptor[PPCLK_VCLK_0].Padding,
2079 pptable->DpmDescriptor[PPCLK_VCLK_0].ConversionToAvfsClk.m,
2080 pptable->DpmDescriptor[PPCLK_VCLK_0].ConversionToAvfsClk.b,
2081 pptable->DpmDescriptor[PPCLK_VCLK_0].SsCurve.a,
2082 pptable->DpmDescriptor[PPCLK_VCLK_0].SsCurve.b,
2083 pptable->DpmDescriptor[PPCLK_VCLK_0].SsCurve.c,
2084 pptable->DpmDescriptor[PPCLK_VCLK_0].SsFmin,
2085 pptable->DpmDescriptor[PPCLK_VCLK_0].Padding16);
2087 dev_info(smu->adev->dev, "[PPCLK_DCLK_1]\n"
2088 " .VoltageMode = 0x%02x\n"
2089 " .SnapToDiscrete = 0x%02x\n"
2090 " .NumDiscreteLevels = 0x%02x\n"
2091 " .padding = 0x%02x\n"
2092 " .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
2093 " .SsCurve {a = 0x%08x b = 0x%08x c = 0x%08x}\n"
2094 " .SsFmin = 0x%04x\n"
2095 " .Padding_16 = 0x%04x\n",
2096 pptable->DpmDescriptor[PPCLK_DCLK_1].VoltageMode,
2097 pptable->DpmDescriptor[PPCLK_DCLK_1].SnapToDiscrete,
2098 pptable->DpmDescriptor[PPCLK_DCLK_1].NumDiscreteLevels,
2099 pptable->DpmDescriptor[PPCLK_DCLK_1].Padding,
2100 pptable->DpmDescriptor[PPCLK_DCLK_1].ConversionToAvfsClk.m,
2101 pptable->DpmDescriptor[PPCLK_DCLK_1].ConversionToAvfsClk.b,
2102 pptable->DpmDescriptor[PPCLK_DCLK_1].SsCurve.a,
2103 pptable->DpmDescriptor[PPCLK_DCLK_1].SsCurve.b,
2104 pptable->DpmDescriptor[PPCLK_DCLK_1].SsCurve.c,
2105 pptable->DpmDescriptor[PPCLK_DCLK_1].SsFmin,
2106 pptable->DpmDescriptor[PPCLK_DCLK_1].Padding16);
2108 dev_info(smu->adev->dev, "[PPCLK_VCLK_1]\n"
2109 " .VoltageMode = 0x%02x\n"
2110 " .SnapToDiscrete = 0x%02x\n"
2111 " .NumDiscreteLevels = 0x%02x\n"
2112 " .padding = 0x%02x\n"
2113 " .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
2114 " .SsCurve {a = 0x%08x b = 0x%08x c = 0x%08x}\n"
2115 " .SsFmin = 0x%04x\n"
2116 " .Padding_16 = 0x%04x\n",
2117 pptable->DpmDescriptor[PPCLK_VCLK_1].VoltageMode,
2118 pptable->DpmDescriptor[PPCLK_VCLK_1].SnapToDiscrete,
2119 pptable->DpmDescriptor[PPCLK_VCLK_1].NumDiscreteLevels,
2120 pptable->DpmDescriptor[PPCLK_VCLK_1].Padding,
2121 pptable->DpmDescriptor[PPCLK_VCLK_1].ConversionToAvfsClk.m,
2122 pptable->DpmDescriptor[PPCLK_VCLK_1].ConversionToAvfsClk.b,
2123 pptable->DpmDescriptor[PPCLK_VCLK_1].SsCurve.a,
2124 pptable->DpmDescriptor[PPCLK_VCLK_1].SsCurve.b,
2125 pptable->DpmDescriptor[PPCLK_VCLK_1].SsCurve.c,
2126 pptable->DpmDescriptor[PPCLK_VCLK_1].SsFmin,
2127 pptable->DpmDescriptor[PPCLK_VCLK_1].Padding16);
2129 dev_info(smu->adev->dev, "FreqTableGfx\n");
2130 for (i = 0; i < NUM_GFXCLK_DPM_LEVELS; i++)
2131 dev_info(smu->adev->dev, " .[%02d] = 0x%x\n", i, pptable->FreqTableGfx[i]);
2133 dev_info(smu->adev->dev, "FreqTableVclk\n");
2134 for (i = 0; i < NUM_VCLK_DPM_LEVELS; i++)
2135 dev_info(smu->adev->dev, " .[%02d] = 0x%x\n", i, pptable->FreqTableVclk[i]);
2137 dev_info(smu->adev->dev, "FreqTableDclk\n");
2138 for (i = 0; i < NUM_DCLK_DPM_LEVELS; i++)
2139 dev_info(smu->adev->dev, " .[%02d] = 0x%x\n", i, pptable->FreqTableDclk[i]);
2141 dev_info(smu->adev->dev, "FreqTableSocclk\n");
2142 for (i = 0; i < NUM_SOCCLK_DPM_LEVELS; i++)
2143 dev_info(smu->adev->dev, " .[%02d] = 0x%x\n", i, pptable->FreqTableSocclk[i]);
2145 dev_info(smu->adev->dev, "FreqTableUclk\n");
2146 for (i = 0; i < NUM_UCLK_DPM_LEVELS; i++)
2147 dev_info(smu->adev->dev, " .[%02d] = 0x%x\n", i, pptable->FreqTableUclk[i]);
2149 dev_info(smu->adev->dev, "FreqTableFclk\n");
2150 for (i = 0; i < NUM_FCLK_DPM_LEVELS; i++)
2151 dev_info(smu->adev->dev, " .[%02d] = 0x%x\n", i, pptable->FreqTableFclk[i]);
2153 dev_info(smu->adev->dev, "Paddingclks[0] = 0x%x\n", pptable->Paddingclks[0]);
2154 dev_info(smu->adev->dev, "Paddingclks[1] = 0x%x\n", pptable->Paddingclks[1]);
2155 dev_info(smu->adev->dev, "Paddingclks[2] = 0x%x\n", pptable->Paddingclks[2]);
2156 dev_info(smu->adev->dev, "Paddingclks[3] = 0x%x\n", pptable->Paddingclks[3]);
2157 dev_info(smu->adev->dev, "Paddingclks[4] = 0x%x\n", pptable->Paddingclks[4]);
2158 dev_info(smu->adev->dev, "Paddingclks[5] = 0x%x\n", pptable->Paddingclks[5]);
2159 dev_info(smu->adev->dev, "Paddingclks[6] = 0x%x\n", pptable->Paddingclks[6]);
2160 dev_info(smu->adev->dev, "Paddingclks[7] = 0x%x\n", pptable->Paddingclks[7]);
2161 dev_info(smu->adev->dev, "Paddingclks[8] = 0x%x\n", pptable->Paddingclks[8]);
2162 dev_info(smu->adev->dev, "Paddingclks[9] = 0x%x\n", pptable->Paddingclks[9]);
2163 dev_info(smu->adev->dev, "Paddingclks[10] = 0x%x\n", pptable->Paddingclks[10]);
2164 dev_info(smu->adev->dev, "Paddingclks[11] = 0x%x\n", pptable->Paddingclks[11]);
2165 dev_info(smu->adev->dev, "Paddingclks[12] = 0x%x\n", pptable->Paddingclks[12]);
2166 dev_info(smu->adev->dev, "Paddingclks[13] = 0x%x\n", pptable->Paddingclks[13]);
2167 dev_info(smu->adev->dev, "Paddingclks[14] = 0x%x\n", pptable->Paddingclks[14]);
2168 dev_info(smu->adev->dev, "Paddingclks[15] = 0x%x\n", pptable->Paddingclks[15]);
2170 dev_info(smu->adev->dev, "DcModeMaxFreq\n");
2171 dev_info(smu->adev->dev, " .PPCLK_GFXCLK = 0x%x\n", pptable->DcModeMaxFreq[PPCLK_GFXCLK]);
2172 dev_info(smu->adev->dev, " .PPCLK_SOCCLK = 0x%x\n", pptable->DcModeMaxFreq[PPCLK_SOCCLK]);
2173 dev_info(smu->adev->dev, " .PPCLK_UCLK = 0x%x\n", pptable->DcModeMaxFreq[PPCLK_UCLK]);
2174 dev_info(smu->adev->dev, " .PPCLK_FCLK = 0x%x\n", pptable->DcModeMaxFreq[PPCLK_FCLK]);
2175 dev_info(smu->adev->dev, " .PPCLK_DCLK_0 = 0x%x\n", pptable->DcModeMaxFreq[PPCLK_DCLK_0]);
2176 dev_info(smu->adev->dev, " .PPCLK_VCLK_0 = 0x%x\n", pptable->DcModeMaxFreq[PPCLK_VCLK_0]);
2177 dev_info(smu->adev->dev, " .PPCLK_DCLK_1 = 0x%x\n", pptable->DcModeMaxFreq[PPCLK_DCLK_1]);
2178 dev_info(smu->adev->dev, " .PPCLK_VCLK_1 = 0x%x\n", pptable->DcModeMaxFreq[PPCLK_VCLK_1]);
2180 dev_info(smu->adev->dev, "FreqTableUclkDiv\n");
2181 for (i = 0; i < NUM_UCLK_DPM_LEVELS; i++)
2182 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->FreqTableUclkDiv[i]);
2184 dev_info(smu->adev->dev, "FclkBoostFreq = 0x%x\n", pptable->FclkBoostFreq);
2185 dev_info(smu->adev->dev, "FclkParamPadding = 0x%x\n", pptable->FclkParamPadding);
2187 dev_info(smu->adev->dev, "Mp0clkFreq\n");
2188 for (i = 0; i < NUM_MP0CLK_DPM_LEVELS; i++)
2189 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->Mp0clkFreq[i]);
2191 dev_info(smu->adev->dev, "Mp0DpmVoltage\n");
2192 for (i = 0; i < NUM_MP0CLK_DPM_LEVELS; i++)
2193 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->Mp0DpmVoltage[i]);
2195 dev_info(smu->adev->dev, "MemVddciVoltage\n");
2196 for (i = 0; i < NUM_UCLK_DPM_LEVELS; i++)
2197 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->MemVddciVoltage[i]);
2199 dev_info(smu->adev->dev, "MemMvddVoltage\n");
2200 for (i = 0; i < NUM_UCLK_DPM_LEVELS; i++)
2201 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->MemMvddVoltage[i]);
2203 dev_info(smu->adev->dev, "GfxclkFgfxoffEntry = 0x%x\n", pptable->GfxclkFgfxoffEntry);
2204 dev_info(smu->adev->dev, "GfxclkFinit = 0x%x\n", pptable->GfxclkFinit);
2205 dev_info(smu->adev->dev, "GfxclkFidle = 0x%x\n", pptable->GfxclkFidle);
2206 dev_info(smu->adev->dev, "GfxclkSource = 0x%x\n", pptable->GfxclkSource);
2207 dev_info(smu->adev->dev, "GfxclkPadding = 0x%x\n", pptable->GfxclkPadding);
2209 dev_info(smu->adev->dev, "GfxGpoSubFeatureMask = 0x%x\n", pptable->GfxGpoSubFeatureMask);
2211 dev_info(smu->adev->dev, "GfxGpoEnabledWorkPolicyMask = 0x%x\n", pptable->GfxGpoEnabledWorkPolicyMask);
2212 dev_info(smu->adev->dev, "GfxGpoDisabledWorkPolicyMask = 0x%x\n", pptable->GfxGpoDisabledWorkPolicyMask);
2213 dev_info(smu->adev->dev, "GfxGpoPadding[0] = 0x%x\n", pptable->GfxGpoPadding[0]);
2214 dev_info(smu->adev->dev, "GfxGpoVotingAllow = 0x%x\n", pptable->GfxGpoVotingAllow);
2215 dev_info(smu->adev->dev, "GfxGpoPadding32[0] = 0x%x\n", pptable->GfxGpoPadding32[0]);
2216 dev_info(smu->adev->dev, "GfxGpoPadding32[1] = 0x%x\n", pptable->GfxGpoPadding32[1]);
2217 dev_info(smu->adev->dev, "GfxGpoPadding32[2] = 0x%x\n", pptable->GfxGpoPadding32[2]);
2218 dev_info(smu->adev->dev, "GfxGpoPadding32[3] = 0x%x\n", pptable->GfxGpoPadding32[3]);
2219 dev_info(smu->adev->dev, "GfxDcsFopt = 0x%x\n", pptable->GfxDcsFopt);
2220 dev_info(smu->adev->dev, "GfxDcsFclkFopt = 0x%x\n", pptable->GfxDcsFclkFopt);
2221 dev_info(smu->adev->dev, "GfxDcsUclkFopt = 0x%x\n", pptable->GfxDcsUclkFopt);
2223 dev_info(smu->adev->dev, "DcsGfxOffVoltage = 0x%x\n", pptable->DcsGfxOffVoltage);
2224 dev_info(smu->adev->dev, "DcsMinGfxOffTime = 0x%x\n", pptable->DcsMinGfxOffTime);
2225 dev_info(smu->adev->dev, "DcsMaxGfxOffTime = 0x%x\n", pptable->DcsMaxGfxOffTime);
2226 dev_info(smu->adev->dev, "DcsMinCreditAccum = 0x%x\n", pptable->DcsMinCreditAccum);
2227 dev_info(smu->adev->dev, "DcsExitHysteresis = 0x%x\n", pptable->DcsExitHysteresis);
2228 dev_info(smu->adev->dev, "DcsTimeout = 0x%x\n", pptable->DcsTimeout);
2230 dev_info(smu->adev->dev, "DcsParamPadding[0] = 0x%x\n", pptable->DcsParamPadding[0]);
2231 dev_info(smu->adev->dev, "DcsParamPadding[1] = 0x%x\n", pptable->DcsParamPadding[1]);
2232 dev_info(smu->adev->dev, "DcsParamPadding[2] = 0x%x\n", pptable->DcsParamPadding[2]);
2233 dev_info(smu->adev->dev, "DcsParamPadding[3] = 0x%x\n", pptable->DcsParamPadding[3]);
2234 dev_info(smu->adev->dev, "DcsParamPadding[4] = 0x%x\n", pptable->DcsParamPadding[4]);
2236 dev_info(smu->adev->dev, "FlopsPerByteTable\n");
2237 for (i = 0; i < RLC_PACE_TABLE_NUM_LEVELS; i++)
2238 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->FlopsPerByteTable[i]);
2240 dev_info(smu->adev->dev, "LowestUclkReservedForUlv = 0x%x\n", pptable->LowestUclkReservedForUlv);
2241 dev_info(smu->adev->dev, "vddingMem[0] = 0x%x\n", pptable->PaddingMem[0]);
2242 dev_info(smu->adev->dev, "vddingMem[1] = 0x%x\n", pptable->PaddingMem[1]);
2243 dev_info(smu->adev->dev, "vddingMem[2] = 0x%x\n", pptable->PaddingMem[2]);
2245 dev_info(smu->adev->dev, "UclkDpmPstates\n");
2246 for (i = 0; i < NUM_UCLK_DPM_LEVELS; i++)
2247 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->UclkDpmPstates[i]);
2249 dev_info(smu->adev->dev, "UclkDpmSrcFreqRange\n");
2250 dev_info(smu->adev->dev, " .Fmin = 0x%x\n",
2251 pptable->UclkDpmSrcFreqRange.Fmin);
2252 dev_info(smu->adev->dev, " .Fmax = 0x%x\n",
2253 pptable->UclkDpmSrcFreqRange.Fmax);
2254 dev_info(smu->adev->dev, "UclkDpmTargFreqRange\n");
2255 dev_info(smu->adev->dev, " .Fmin = 0x%x\n",
2256 pptable->UclkDpmTargFreqRange.Fmin);
2257 dev_info(smu->adev->dev, " .Fmax = 0x%x\n",
2258 pptable->UclkDpmTargFreqRange.Fmax);
2259 dev_info(smu->adev->dev, "UclkDpmMidstepFreq = 0x%x\n", pptable->UclkDpmMidstepFreq);
2260 dev_info(smu->adev->dev, "UclkMidstepPadding = 0x%x\n", pptable->UclkMidstepPadding);
2262 dev_info(smu->adev->dev, "PcieGenSpeed\n");
2263 for (i = 0; i < NUM_LINK_LEVELS; i++)
2264 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->PcieGenSpeed[i]);
2266 dev_info(smu->adev->dev, "PcieLaneCount\n");
2267 for (i = 0; i < NUM_LINK_LEVELS; i++)
2268 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->PcieLaneCount[i]);
2270 dev_info(smu->adev->dev, "LclkFreq\n");
2271 for (i = 0; i < NUM_LINK_LEVELS; i++)
2272 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->LclkFreq[i]);
2274 dev_info(smu->adev->dev, "FanStopTemp = 0x%x\n", pptable->FanStopTemp);
2275 dev_info(smu->adev->dev, "FanStartTemp = 0x%x\n", pptable->FanStartTemp);
2277 dev_info(smu->adev->dev, "FanGain\n");
2278 for (i = 0; i < TEMP_COUNT; i++)
2279 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->FanGain[i]);
2281 dev_info(smu->adev->dev, "FanPwmMin = 0x%x\n", pptable->FanPwmMin);
2282 dev_info(smu->adev->dev, "FanAcousticLimitRpm = 0x%x\n", pptable->FanAcousticLimitRpm);
2283 dev_info(smu->adev->dev, "FanThrottlingRpm = 0x%x\n", pptable->FanThrottlingRpm);
2284 dev_info(smu->adev->dev, "FanMaximumRpm = 0x%x\n", pptable->FanMaximumRpm);
2285 dev_info(smu->adev->dev, "MGpuFanBoostLimitRpm = 0x%x\n", pptable->MGpuFanBoostLimitRpm);
2286 dev_info(smu->adev->dev, "FanTargetTemperature = 0x%x\n", pptable->FanTargetTemperature);
2287 dev_info(smu->adev->dev, "FanTargetGfxclk = 0x%x\n", pptable->FanTargetGfxclk);
2288 dev_info(smu->adev->dev, "FanPadding16 = 0x%x\n", pptable->FanPadding16);
2289 dev_info(smu->adev->dev, "FanTempInputSelect = 0x%x\n", pptable->FanTempInputSelect);
2290 dev_info(smu->adev->dev, "FanPadding = 0x%x\n", pptable->FanPadding);
2291 dev_info(smu->adev->dev, "FanZeroRpmEnable = 0x%x\n", pptable->FanZeroRpmEnable);
2292 dev_info(smu->adev->dev, "FanTachEdgePerRev = 0x%x\n", pptable->FanTachEdgePerRev);
2294 dev_info(smu->adev->dev, "FuzzyFan_ErrorSetDelta = 0x%x\n", pptable->FuzzyFan_ErrorSetDelta);
2295 dev_info(smu->adev->dev, "FuzzyFan_ErrorRateSetDelta = 0x%x\n", pptable->FuzzyFan_ErrorRateSetDelta);
2296 dev_info(smu->adev->dev, "FuzzyFan_PwmSetDelta = 0x%x\n", pptable->FuzzyFan_PwmSetDelta);
2297 dev_info(smu->adev->dev, "FuzzyFan_Reserved = 0x%x\n", pptable->FuzzyFan_Reserved);
2299 dev_info(smu->adev->dev, "OverrideAvfsGb[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->OverrideAvfsGb[AVFS_VOLTAGE_GFX]);
2300 dev_info(smu->adev->dev, "OverrideAvfsGb[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->OverrideAvfsGb[AVFS_VOLTAGE_SOC]);
2301 dev_info(smu->adev->dev, "dBtcGbGfxDfllModelSelect = 0x%x\n", pptable->dBtcGbGfxDfllModelSelect);
2302 dev_info(smu->adev->dev, "Padding8_Avfs = 0x%x\n", pptable->Padding8_Avfs);
2304 dev_info(smu->adev->dev, "qAvfsGb[AVFS_VOLTAGE_GFX]{a = 0x%x b = 0x%x c = 0x%x}\n",
2305 pptable->qAvfsGb[AVFS_VOLTAGE_GFX].a,
2306 pptable->qAvfsGb[AVFS_VOLTAGE_GFX].b,
2307 pptable->qAvfsGb[AVFS_VOLTAGE_GFX].c);
2308 dev_info(smu->adev->dev, "qAvfsGb[AVFS_VOLTAGE_SOC]{a = 0x%x b = 0x%x c = 0x%x}\n",
2309 pptable->qAvfsGb[AVFS_VOLTAGE_SOC].a,
2310 pptable->qAvfsGb[AVFS_VOLTAGE_SOC].b,
2311 pptable->qAvfsGb[AVFS_VOLTAGE_SOC].c);
2312 dev_info(smu->adev->dev, "dBtcGbGfxPll{a = 0x%x b = 0x%x c = 0x%x}\n",
2313 pptable->dBtcGbGfxPll.a,
2314 pptable->dBtcGbGfxPll.b,
2315 pptable->dBtcGbGfxPll.c);
2316 dev_info(smu->adev->dev, "dBtcGbGfxAfll{a = 0x%x b = 0x%x c = 0x%x}\n",
2317 pptable->dBtcGbGfxDfll.a,
2318 pptable->dBtcGbGfxDfll.b,
2319 pptable->dBtcGbGfxDfll.c);
2320 dev_info(smu->adev->dev, "dBtcGbSoc{a = 0x%x b = 0x%x c = 0x%x}\n",
2321 pptable->dBtcGbSoc.a,
2322 pptable->dBtcGbSoc.b,
2323 pptable->dBtcGbSoc.c);
2324 dev_info(smu->adev->dev, "qAgingGb[AVFS_VOLTAGE_GFX]{m = 0x%x b = 0x%x}\n",
2325 pptable->qAgingGb[AVFS_VOLTAGE_GFX].m,
2326 pptable->qAgingGb[AVFS_VOLTAGE_GFX].b);
2327 dev_info(smu->adev->dev, "qAgingGb[AVFS_VOLTAGE_SOC]{m = 0x%x b = 0x%x}\n",
2328 pptable->qAgingGb[AVFS_VOLTAGE_SOC].m,
2329 pptable->qAgingGb[AVFS_VOLTAGE_SOC].b);
2331 dev_info(smu->adev->dev, "PiecewiseLinearDroopIntGfxDfll\n");
2332 for (i = 0; i < NUM_PIECE_WISE_LINEAR_DROOP_MODEL_VF_POINTS; i++) {
2333 dev_info(smu->adev->dev, " Fset[%d] = 0x%x\n",
2334 i, pptable->PiecewiseLinearDroopIntGfxDfll.Fset[i]);
2335 dev_info(smu->adev->dev, " Vdroop[%d] = 0x%x\n",
2336 i, pptable->PiecewiseLinearDroopIntGfxDfll.Vdroop[i]);
2339 dev_info(smu->adev->dev, "qStaticVoltageOffset[AVFS_VOLTAGE_GFX]{a = 0x%x b = 0x%x c = 0x%x}\n",
2340 pptable->qStaticVoltageOffset[AVFS_VOLTAGE_GFX].a,
2341 pptable->qStaticVoltageOffset[AVFS_VOLTAGE_GFX].b,
2342 pptable->qStaticVoltageOffset[AVFS_VOLTAGE_GFX].c);
2343 dev_info(smu->adev->dev, "qStaticVoltageOffset[AVFS_VOLTAGE_SOC]{a = 0x%x b = 0x%x c = 0x%x}\n",
2344 pptable->qStaticVoltageOffset[AVFS_VOLTAGE_SOC].a,
2345 pptable->qStaticVoltageOffset[AVFS_VOLTAGE_SOC].b,
2346 pptable->qStaticVoltageOffset[AVFS_VOLTAGE_SOC].c);
2348 dev_info(smu->adev->dev, "DcTol[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcTol[AVFS_VOLTAGE_GFX]);
2349 dev_info(smu->adev->dev, "DcTol[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcTol[AVFS_VOLTAGE_SOC]);
2351 dev_info(smu->adev->dev, "DcBtcEnabled[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcEnabled[AVFS_VOLTAGE_GFX]);
2352 dev_info(smu->adev->dev, "DcBtcEnabled[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcEnabled[AVFS_VOLTAGE_SOC]);
2353 dev_info(smu->adev->dev, "Padding8_GfxBtc[0] = 0x%x\n", pptable->Padding8_GfxBtc[0]);
2354 dev_info(smu->adev->dev, "Padding8_GfxBtc[1] = 0x%x\n", pptable->Padding8_GfxBtc[1]);
2356 dev_info(smu->adev->dev, "DcBtcMin[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcMin[AVFS_VOLTAGE_GFX]);
2357 dev_info(smu->adev->dev, "DcBtcMin[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcMin[AVFS_VOLTAGE_SOC]);
2358 dev_info(smu->adev->dev, "DcBtcMax[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcMax[AVFS_VOLTAGE_GFX]);
2359 dev_info(smu->adev->dev, "DcBtcMax[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcMax[AVFS_VOLTAGE_SOC]);
2361 dev_info(smu->adev->dev, "DcBtcGb[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcGb[AVFS_VOLTAGE_GFX]);
2362 dev_info(smu->adev->dev, "DcBtcGb[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcGb[AVFS_VOLTAGE_SOC]);
2364 dev_info(smu->adev->dev, "XgmiDpmPstates\n");
2365 for (i = 0; i < NUM_XGMI_LEVELS; i++)
2366 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->XgmiDpmPstates[i]);
2367 dev_info(smu->adev->dev, "XgmiDpmSpare[0] = 0x%02x\n", pptable->XgmiDpmSpare[0]);
2368 dev_info(smu->adev->dev, "XgmiDpmSpare[1] = 0x%02x\n", pptable->XgmiDpmSpare[1]);
2370 dev_info(smu->adev->dev, "DebugOverrides = 0x%x\n", pptable->DebugOverrides);
2371 dev_info(smu->adev->dev, "ReservedEquation0{a = 0x%x b = 0x%x c = 0x%x}\n",
2372 pptable->ReservedEquation0.a,
2373 pptable->ReservedEquation0.b,
2374 pptable->ReservedEquation0.c);
2375 dev_info(smu->adev->dev, "ReservedEquation1{a = 0x%x b = 0x%x c = 0x%x}\n",
2376 pptable->ReservedEquation1.a,
2377 pptable->ReservedEquation1.b,
2378 pptable->ReservedEquation1.c);
2379 dev_info(smu->adev->dev, "ReservedEquation2{a = 0x%x b = 0x%x c = 0x%x}\n",
2380 pptable->ReservedEquation2.a,
2381 pptable->ReservedEquation2.b,
2382 pptable->ReservedEquation2.c);
2383 dev_info(smu->adev->dev, "ReservedEquation3{a = 0x%x b = 0x%x c = 0x%x}\n",
2384 pptable->ReservedEquation3.a,
2385 pptable->ReservedEquation3.b,
2386 pptable->ReservedEquation3.c);
2388 dev_info(smu->adev->dev, "SkuReserved[0] = 0x%x\n", pptable->SkuReserved[0]);
2389 dev_info(smu->adev->dev, "SkuReserved[1] = 0x%x\n", pptable->SkuReserved[1]);
2390 dev_info(smu->adev->dev, "SkuReserved[2] = 0x%x\n", pptable->SkuReserved[2]);
2391 dev_info(smu->adev->dev, "SkuReserved[3] = 0x%x\n", pptable->SkuReserved[3]);
2392 dev_info(smu->adev->dev, "SkuReserved[4] = 0x%x\n", pptable->SkuReserved[4]);
2393 dev_info(smu->adev->dev, "SkuReserved[5] = 0x%x\n", pptable->SkuReserved[5]);
2394 dev_info(smu->adev->dev, "SkuReserved[6] = 0x%x\n", pptable->SkuReserved[6]);
2395 dev_info(smu->adev->dev, "SkuReserved[7] = 0x%x\n", pptable->SkuReserved[7]);
2396 dev_info(smu->adev->dev, "SkuReserved[8] = 0x%x\n", pptable->SkuReserved[8]);
2397 dev_info(smu->adev->dev, "SkuReserved[9] = 0x%x\n", pptable->SkuReserved[9]);
2398 dev_info(smu->adev->dev, "SkuReserved[10] = 0x%x\n", pptable->SkuReserved[10]);
2399 dev_info(smu->adev->dev, "SkuReserved[11] = 0x%x\n", pptable->SkuReserved[11]);
2400 dev_info(smu->adev->dev, "SkuReserved[12] = 0x%x\n", pptable->SkuReserved[12]);
2401 dev_info(smu->adev->dev, "SkuReserved[13] = 0x%x\n", pptable->SkuReserved[13]);
2402 dev_info(smu->adev->dev, "SkuReserved[14] = 0x%x\n", pptable->SkuReserved[14]);
2404 dev_info(smu->adev->dev, "GamingClk[0] = 0x%x\n", pptable->GamingClk[0]);
2405 dev_info(smu->adev->dev, "GamingClk[1] = 0x%x\n", pptable->GamingClk[1]);
2406 dev_info(smu->adev->dev, "GamingClk[2] = 0x%x\n", pptable->GamingClk[2]);
2407 dev_info(smu->adev->dev, "GamingClk[3] = 0x%x\n", pptable->GamingClk[3]);
2408 dev_info(smu->adev->dev, "GamingClk[4] = 0x%x\n", pptable->GamingClk[4]);
2409 dev_info(smu->adev->dev, "GamingClk[5] = 0x%x\n", pptable->GamingClk[5]);
2411 for (i = 0; i < NUM_I2C_CONTROLLERS; i++) {
2412 dev_info(smu->adev->dev, "I2cControllers[%d]:\n", i);
2413 dev_info(smu->adev->dev, " .Enabled = 0x%x\n",
2414 pptable->I2cControllers[i].Enabled);
2415 dev_info(smu->adev->dev, " .Speed = 0x%x\n",
2416 pptable->I2cControllers[i].Speed);
2417 dev_info(smu->adev->dev, " .SlaveAddress = 0x%x\n",
2418 pptable->I2cControllers[i].SlaveAddress);
2419 dev_info(smu->adev->dev, " .ControllerPort = 0x%x\n",
2420 pptable->I2cControllers[i].ControllerPort);
2421 dev_info(smu->adev->dev, " .ControllerName = 0x%x\n",
2422 pptable->I2cControllers[i].ControllerName);
2423 dev_info(smu->adev->dev, " .ThermalThrottler = 0x%x\n",
2424 pptable->I2cControllers[i].ThermalThrotter);
2425 dev_info(smu->adev->dev, " .I2cProtocol = 0x%x\n",
2426 pptable->I2cControllers[i].I2cProtocol);
2427 dev_info(smu->adev->dev, " .PaddingConfig = 0x%x\n",
2428 pptable->I2cControllers[i].PaddingConfig);
2431 dev_info(smu->adev->dev, "GpioScl = 0x%x\n", pptable->GpioScl);
2432 dev_info(smu->adev->dev, "GpioSda = 0x%x\n", pptable->GpioSda);
2433 dev_info(smu->adev->dev, "FchUsbPdSlaveAddr = 0x%x\n", pptable->FchUsbPdSlaveAddr);
2434 dev_info(smu->adev->dev, "I2cSpare[0] = 0x%x\n", pptable->I2cSpare[0]);
2436 dev_info(smu->adev->dev, "Board Parameters:\n");
2437 dev_info(smu->adev->dev, "VddGfxVrMapping = 0x%x\n", pptable->VddGfxVrMapping);
2438 dev_info(smu->adev->dev, "VddSocVrMapping = 0x%x\n", pptable->VddSocVrMapping);
2439 dev_info(smu->adev->dev, "VddMem0VrMapping = 0x%x\n", pptable->VddMem0VrMapping);
2440 dev_info(smu->adev->dev, "VddMem1VrMapping = 0x%x\n", pptable->VddMem1VrMapping);
2441 dev_info(smu->adev->dev, "GfxUlvPhaseSheddingMask = 0x%x\n", pptable->GfxUlvPhaseSheddingMask);
2442 dev_info(smu->adev->dev, "SocUlvPhaseSheddingMask = 0x%x\n", pptable->SocUlvPhaseSheddingMask);
2443 dev_info(smu->adev->dev, "VddciUlvPhaseSheddingMask = 0x%x\n", pptable->VddciUlvPhaseSheddingMask);
2444 dev_info(smu->adev->dev, "MvddUlvPhaseSheddingMask = 0x%x\n", pptable->MvddUlvPhaseSheddingMask);
2446 dev_info(smu->adev->dev, "GfxMaxCurrent = 0x%x\n", pptable->GfxMaxCurrent);
2447 dev_info(smu->adev->dev, "GfxOffset = 0x%x\n", pptable->GfxOffset);
2448 dev_info(smu->adev->dev, "Padding_TelemetryGfx = 0x%x\n", pptable->Padding_TelemetryGfx);
2450 dev_info(smu->adev->dev, "SocMaxCurrent = 0x%x\n", pptable->SocMaxCurrent);
2451 dev_info(smu->adev->dev, "SocOffset = 0x%x\n", pptable->SocOffset);
2452 dev_info(smu->adev->dev, "Padding_TelemetrySoc = 0x%x\n", pptable->Padding_TelemetrySoc);
2454 dev_info(smu->adev->dev, "Mem0MaxCurrent = 0x%x\n", pptable->Mem0MaxCurrent);
2455 dev_info(smu->adev->dev, "Mem0Offset = 0x%x\n", pptable->Mem0Offset);
2456 dev_info(smu->adev->dev, "Padding_TelemetryMem0 = 0x%x\n", pptable->Padding_TelemetryMem0);
2458 dev_info(smu->adev->dev, "Mem1MaxCurrent = 0x%x\n", pptable->Mem1MaxCurrent);
2459 dev_info(smu->adev->dev, "Mem1Offset = 0x%x\n", pptable->Mem1Offset);
2460 dev_info(smu->adev->dev, "Padding_TelemetryMem1 = 0x%x\n", pptable->Padding_TelemetryMem1);
2462 dev_info(smu->adev->dev, "MvddRatio = 0x%x\n", pptable->MvddRatio);
2464 dev_info(smu->adev->dev, "AcDcGpio = 0x%x\n", pptable->AcDcGpio);
2465 dev_info(smu->adev->dev, "AcDcPolarity = 0x%x\n", pptable->AcDcPolarity);
2466 dev_info(smu->adev->dev, "VR0HotGpio = 0x%x\n", pptable->VR0HotGpio);
2467 dev_info(smu->adev->dev, "VR0HotPolarity = 0x%x\n", pptable->VR0HotPolarity);
2468 dev_info(smu->adev->dev, "VR1HotGpio = 0x%x\n", pptable->VR1HotGpio);
2469 dev_info(smu->adev->dev, "VR1HotPolarity = 0x%x\n", pptable->VR1HotPolarity);
2470 dev_info(smu->adev->dev, "GthrGpio = 0x%x\n", pptable->GthrGpio);
2471 dev_info(smu->adev->dev, "GthrPolarity = 0x%x\n", pptable->GthrPolarity);
2472 dev_info(smu->adev->dev, "LedPin0 = 0x%x\n", pptable->LedPin0);
2473 dev_info(smu->adev->dev, "LedPin1 = 0x%x\n", pptable->LedPin1);
2474 dev_info(smu->adev->dev, "LedPin2 = 0x%x\n", pptable->LedPin2);
2475 dev_info(smu->adev->dev, "LedEnableMask = 0x%x\n", pptable->LedEnableMask);
2476 dev_info(smu->adev->dev, "LedPcie = 0x%x\n", pptable->LedPcie);
2477 dev_info(smu->adev->dev, "LedError = 0x%x\n", pptable->LedError);
2478 dev_info(smu->adev->dev, "LedSpare1[0] = 0x%x\n", pptable->LedSpare1[0]);
2479 dev_info(smu->adev->dev, "LedSpare1[1] = 0x%x\n", pptable->LedSpare1[1]);
2481 dev_info(smu->adev->dev, "PllGfxclkSpreadEnabled = 0x%x\n", pptable->PllGfxclkSpreadEnabled);
2482 dev_info(smu->adev->dev, "PllGfxclkSpreadPercent = 0x%x\n", pptable->PllGfxclkSpreadPercent);
2483 dev_info(smu->adev->dev, "PllGfxclkSpreadFreq = 0x%x\n", pptable->PllGfxclkSpreadFreq);
2485 dev_info(smu->adev->dev, "DfllGfxclkSpreadEnabled = 0x%x\n", pptable->DfllGfxclkSpreadEnabled);
2486 dev_info(smu->adev->dev, "DfllGfxclkSpreadPercent = 0x%x\n", pptable->DfllGfxclkSpreadPercent);
2487 dev_info(smu->adev->dev, "DfllGfxclkSpreadFreq = 0x%x\n", pptable->DfllGfxclkSpreadFreq);
2489 dev_info(smu->adev->dev, "UclkSpreadEnabled = 0x%x\n", pptable->UclkSpreadEnabled);
2490 dev_info(smu->adev->dev, "UclkSpreadPercent = 0x%x\n", pptable->UclkSpreadPercent);
2491 dev_info(smu->adev->dev, "UclkSpreadFreq = 0x%x\n", pptable->UclkSpreadFreq);
2493 dev_info(smu->adev->dev, "FclkSpreadEnabled = 0x%x\n", pptable->FclkSpreadEnabled);
2494 dev_info(smu->adev->dev, "FclkSpreadPercent = 0x%x\n", pptable->FclkSpreadPercent);
2495 dev_info(smu->adev->dev, "FclkSpreadFreq = 0x%x\n", pptable->FclkSpreadFreq);
2497 dev_info(smu->adev->dev, "MemoryChannelEnabled = 0x%x\n", pptable->MemoryChannelEnabled);
2498 dev_info(smu->adev->dev, "DramBitWidth = 0x%x\n", pptable->DramBitWidth);
2499 dev_info(smu->adev->dev, "PaddingMem1[0] = 0x%x\n", pptable->PaddingMem1[0]);
2500 dev_info(smu->adev->dev, "PaddingMem1[1] = 0x%x\n", pptable->PaddingMem1[1]);
2501 dev_info(smu->adev->dev, "PaddingMem1[2] = 0x%x\n", pptable->PaddingMem1[2]);
2503 dev_info(smu->adev->dev, "TotalBoardPower = 0x%x\n", pptable->TotalBoardPower);
2504 dev_info(smu->adev->dev, "BoardPowerPadding = 0x%x\n", pptable->BoardPowerPadding);
2506 dev_info(smu->adev->dev, "XgmiLinkSpeed\n");
2507 for (i = 0; i < NUM_XGMI_PSTATE_LEVELS; i++)
2508 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->XgmiLinkSpeed[i]);
2509 dev_info(smu->adev->dev, "XgmiLinkWidth\n");
2510 for (i = 0; i < NUM_XGMI_PSTATE_LEVELS; i++)
2511 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->XgmiLinkWidth[i]);
2512 dev_info(smu->adev->dev, "XgmiFclkFreq\n");
2513 for (i = 0; i < NUM_XGMI_PSTATE_LEVELS; i++)
2514 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->XgmiFclkFreq[i]);
2515 dev_info(smu->adev->dev, "XgmiSocVoltage\n");
2516 for (i = 0; i < NUM_XGMI_PSTATE_LEVELS; i++)
2517 dev_info(smu->adev->dev, " .[%d] = 0x%x\n", i, pptable->XgmiSocVoltage[i]);
2519 dev_info(smu->adev->dev, "HsrEnabled = 0x%x\n", pptable->HsrEnabled);
2520 dev_info(smu->adev->dev, "VddqOffEnabled = 0x%x\n", pptable->VddqOffEnabled);
2521 dev_info(smu->adev->dev, "PaddingUmcFlags[0] = 0x%x\n", pptable->PaddingUmcFlags[0]);
2522 dev_info(smu->adev->dev, "PaddingUmcFlags[1] = 0x%x\n", pptable->PaddingUmcFlags[1]);
2524 dev_info(smu->adev->dev, "BoardReserved[0] = 0x%x\n", pptable->BoardReserved[0]);
2525 dev_info(smu->adev->dev, "BoardReserved[1] = 0x%x\n", pptable->BoardReserved[1]);
2526 dev_info(smu->adev->dev, "BoardReserved[2] = 0x%x\n", pptable->BoardReserved[2]);
2527 dev_info(smu->adev->dev, "BoardReserved[3] = 0x%x\n", pptable->BoardReserved[3]);
2528 dev_info(smu->adev->dev, "BoardReserved[4] = 0x%x\n", pptable->BoardReserved[4]);
2529 dev_info(smu->adev->dev, "BoardReserved[5] = 0x%x\n", pptable->BoardReserved[5]);
2530 dev_info(smu->adev->dev, "BoardReserved[6] = 0x%x\n", pptable->BoardReserved[6]);
2531 dev_info(smu->adev->dev, "BoardReserved[7] = 0x%x\n", pptable->BoardReserved[7]);
2532 dev_info(smu->adev->dev, "BoardReserved[8] = 0x%x\n", pptable->BoardReserved[8]);
2533 dev_info(smu->adev->dev, "BoardReserved[9] = 0x%x\n", pptable->BoardReserved[9]);
2534 dev_info(smu->adev->dev, "BoardReserved[10] = 0x%x\n", pptable->BoardReserved[10]);
2535 dev_info(smu->adev->dev, "BoardReserved[11] = 0x%x\n", pptable->BoardReserved[11]);
2536 dev_info(smu->adev->dev, "BoardReserved[12] = 0x%x\n", pptable->BoardReserved[12]);
2537 dev_info(smu->adev->dev, "BoardReserved[13] = 0x%x\n", pptable->BoardReserved[13]);
2538 dev_info(smu->adev->dev, "BoardReserved[14] = 0x%x\n", pptable->BoardReserved[14]);
2540 dev_info(smu->adev->dev, "MmHubPadding[0] = 0x%x\n", pptable->MmHubPadding[0]);
2541 dev_info(smu->adev->dev, "MmHubPadding[1] = 0x%x\n", pptable->MmHubPadding[1]);
2542 dev_info(smu->adev->dev, "MmHubPadding[2] = 0x%x\n", pptable->MmHubPadding[2]);
2543 dev_info(smu->adev->dev, "MmHubPadding[3] = 0x%x\n", pptable->MmHubPadding[3]);
2544 dev_info(smu->adev->dev, "MmHubPadding[4] = 0x%x\n", pptable->MmHubPadding[4]);
2545 dev_info(smu->adev->dev, "MmHubPadding[5] = 0x%x\n", pptable->MmHubPadding[5]);
2546 dev_info(smu->adev->dev, "MmHubPadding[6] = 0x%x\n", pptable->MmHubPadding[6]);
2547 dev_info(smu->adev->dev, "MmHubPadding[7] = 0x%x\n", pptable->MmHubPadding[7]);
2550 static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
2551 .tables_init = sienna_cichlid_tables_init,
2552 .alloc_dpm_context = sienna_cichlid_allocate_dpm_context,
2553 .get_smu_msg_index = sienna_cichlid_get_smu_msg_index,
2554 .get_smu_clk_index = sienna_cichlid_get_smu_clk_index,
2555 .get_smu_feature_index = sienna_cichlid_get_smu_feature_index,
2556 .get_smu_table_index = sienna_cichlid_get_smu_table_index,
2557 .get_smu_power_index = sienna_cichlid_get_pwr_src_index,
2558 .get_workload_type = sienna_cichlid_get_workload_type,
2559 .get_allowed_feature_mask = sienna_cichlid_get_allowed_feature_mask,
2560 .set_default_dpm_table = sienna_cichlid_set_default_dpm_table,
2561 .dpm_set_vcn_enable = sienna_cichlid_dpm_set_vcn_enable,
2562 .dpm_set_jpeg_enable = sienna_cichlid_dpm_set_jpeg_enable,
2563 .get_current_clk_freq_by_table = sienna_cichlid_get_current_clk_freq_by_table,
2564 .print_clk_levels = sienna_cichlid_print_clk_levels,
2565 .force_clk_levels = sienna_cichlid_force_clk_levels,
2566 .populate_umd_state_clk = sienna_cichlid_populate_umd_state_clk,
2567 .pre_display_config_changed = sienna_cichlid_pre_display_config_changed,
2568 .display_config_changed = sienna_cichlid_display_config_changed,
2569 .notify_smc_display_config = sienna_cichlid_notify_smc_display_config,
2570 .force_dpm_limit_value = sienna_cichlid_force_dpm_limit_value,
2571 .unforce_dpm_levels = sienna_cichlid_unforce_dpm_levels,
2572 .is_dpm_running = sienna_cichlid_is_dpm_running,
2573 .get_fan_speed_percent = sienna_cichlid_get_fan_speed_percent,
2574 .get_fan_speed_rpm = sienna_cichlid_get_fan_speed_rpm,
2575 .get_power_profile_mode = sienna_cichlid_get_power_profile_mode,
2576 .set_power_profile_mode = sienna_cichlid_set_power_profile_mode,
2577 .get_profiling_clk_mask = sienna_cichlid_get_profiling_clk_mask,
2578 .set_watermarks_table = sienna_cichlid_set_watermarks_table,
2579 .read_sensor = sienna_cichlid_read_sensor,
2580 .get_uclk_dpm_states = sienna_cichlid_get_uclk_dpm_states,
2581 .set_performance_level = sienna_cichlid_set_performance_level,
2582 .get_thermal_temperature_range = sienna_cichlid_get_thermal_temperature_range,
2583 .display_disable_memory_clock_switch = sienna_cichlid_display_disable_memory_clock_switch,
2584 .get_power_limit = sienna_cichlid_get_power_limit,
2585 .update_pcie_parameters = sienna_cichlid_update_pcie_parameters,
2586 .dump_pptable = sienna_cichlid_dump_pptable,
2587 .init_microcode = smu_v11_0_init_microcode,
2588 .load_microcode = smu_v11_0_load_microcode,
2589 .init_smc_tables = smu_v11_0_init_smc_tables,
2590 .fini_smc_tables = smu_v11_0_fini_smc_tables,
2591 .init_power = smu_v11_0_init_power,
2592 .fini_power = smu_v11_0_fini_power,
2593 .check_fw_status = smu_v11_0_check_fw_status,
2594 .setup_pptable = sienna_cichlid_setup_pptable,
2595 .get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
2596 .populate_smc_tables = smu_v11_0_populate_smc_pptable,
2597 .check_fw_version = smu_v11_0_check_fw_version,
2598 .write_pptable = smu_v11_0_write_pptable,
2599 .set_min_dcef_deep_sleep = NULL,
2600 .set_driver_table_location = smu_v11_0_set_driver_table_location,
2601 .set_tool_table_location = smu_v11_0_set_tool_table_location,
2602 .notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,
2603 .system_features_control = smu_v11_0_system_features_control,
2604 .send_smc_msg_with_param = smu_v11_0_send_msg_with_param,
2605 .init_display_count = NULL,
2606 .set_allowed_mask = smu_v11_0_set_allowed_mask,
2607 .get_enabled_mask = smu_v11_0_get_enabled_mask,
2608 .notify_display_change = NULL,
2609 .set_power_limit = smu_v11_0_set_power_limit,
2610 .get_current_clk_freq = smu_v11_0_get_current_clk_freq,
2611 .init_max_sustainable_clocks = smu_v11_0_init_max_sustainable_clocks,
2612 .enable_thermal_alert = smu_v11_0_enable_thermal_alert,
2613 .disable_thermal_alert = smu_v11_0_disable_thermal_alert,
2614 .set_deep_sleep_dcefclk = smu_v11_0_set_deep_sleep_dcefclk,
2615 .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
2616 .get_fan_control_mode = smu_v11_0_get_fan_control_mode,
2617 .set_fan_control_mode = smu_v11_0_set_fan_control_mode,
2618 .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
2619 .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
2620 .set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
2621 .gfx_off_control = smu_v11_0_gfx_off_control,
2622 .register_irq_handler = smu_v11_0_register_irq_handler,
2623 .set_azalia_d3_pme = smu_v11_0_set_azalia_d3_pme,
2624 .get_max_sustainable_clocks_by_dc = smu_v11_0_get_max_sustainable_clocks_by_dc,
2625 .baco_is_support= sienna_cichlid_is_baco_supported,
2626 .baco_get_state = smu_v11_0_baco_get_state,
2627 .baco_set_state = smu_v11_0_baco_set_state,
2628 .baco_enter = smu_v11_0_baco_enter,
2629 .baco_exit = smu_v11_0_baco_exit,
2630 .get_dpm_ultimate_freq = sienna_cichlid_get_dpm_ultimate_freq,
2631 .set_soft_freq_limited_range = sienna_cichlid_set_soft_freq_limited_range,
2632 .override_pcie_parameters = smu_v11_0_override_pcie_parameters,
2633 .set_thermal_range = sienna_cichlid_set_thermal_range,
2636 void sienna_cichlid_set_ppt_funcs(struct smu_context *smu)
2638 smu->ppt_funcs = &sienna_cichlid_ppt_funcs;