Merge tag 'vfs-6.7.misc' of gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs
[linux-block.git] / drivers / gpu / drm / amd / pm / swsmu / smu13 / smu_v13_0_6_ppt.c
CommitLineData
511a9555
LL
1/*
2 * Copyright 2021 Advanced Micro Devices, Inc.
3 *
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:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
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.
21 *
22 */
23
24#define SWSMU_CODE_LAYER_L2
25
26#include <linux/firmware.h>
27#include "amdgpu.h"
28#include "amdgpu_smu.h"
29#include "atomfirmware.h"
30#include "amdgpu_atomfirmware.h"
31#include "amdgpu_atombios.h"
32#include "smu_v13_0_6_pmfw.h"
33#include "smu13_driver_if_v13_0_6.h"
34#include "smu_v13_0_6_ppsmc.h"
35#include "soc15_common.h"
36#include "atom.h"
37#include "power_state.h"
38#include "smu_v13_0.h"
39#include "smu_v13_0_6_ppt.h"
40#include "nbio/nbio_7_4_offset.h"
41#include "nbio/nbio_7_4_sh_mask.h"
42#include "thm/thm_11_0_2_offset.h"
43#include "thm/thm_11_0_2_sh_mask.h"
44#include "amdgpu_xgmi.h"
45#include <linux/pci.h>
46#include "amdgpu_ras.h"
47#include "smu_cmn.h"
48#include "mp/mp_13_0_6_offset.h"
49#include "mp/mp_13_0_6_sh_mask.h"
50
51#undef MP1_Public
52#undef smnMP1_FIRMWARE_FLAGS
53
54/* TODO: Check final register offsets */
55#define MP1_Public 0x03b00000
56#define smnMP1_FIRMWARE_FLAGS 0x3010028
57/*
58 * DO NOT use these for err/warn/info/debug messages.
59 * Use dev_err, dev_warn, dev_info and dev_dbg instead.
60 * They are more MGPU friendly.
61 */
62#undef pr_err
63#undef pr_warn
64#undef pr_info
65#undef pr_debug
66
67#define to_amdgpu_device(x) (container_of(x, struct amdgpu_device, pm.smu_i2c))
68
69#define SMU_13_0_6_FEA_MAP(smu_feature, smu_13_0_6_feature) \
70 [smu_feature] = { 1, (smu_13_0_6_feature) }
71
72#define FEATURE_MASK(feature) (1ULL << feature)
73#define SMC_DPM_FEATURE \
74 (FEATURE_MASK(FEATURE_DATA_CALCULATION) | \
75 FEATURE_MASK(FEATURE_DPM_GFXCLK) | FEATURE_MASK(FEATURE_DPM_UCLK) | \
76 FEATURE_MASK(FEATURE_DPM_SOCCLK) | FEATURE_MASK(FEATURE_DPM_FCLK) | \
77 FEATURE_MASK(FEATURE_DPM_LCLK) | FEATURE_MASK(FEATURE_DPM_XGMI) | \
78 FEATURE_MASK(FEATURE_DPM_VCN))
79
80/* possible frequency drift (1Mhz) */
81#define EPSILON 1
82
f1d1abd6 83#define smnPCIE_ESM_CTRL 0x93D0
1d02ae4e 84#define smnPCIE_LC_LINK_WIDTH_CNTL 0x1a340288
1718e973
LL
85#define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD_MASK 0x00000070L
86#define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD__SHIFT 0x4
1d02ae4e 87#define MAX_LINK_WIDTH 6
511a9555 88
f1d1abd6
AK
89#define smnPCIE_LC_SPEED_CNTL 0x1a340290
90#define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK 0xE0
91#define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT 0x5
92#define LINK_SPEED_MAX 4
93
511a9555
LL
94static const struct cmn2asic_msg_mapping smu_v13_0_6_message_map[SMU_MSG_MAX_COUNT] = {
95 MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 0),
96 MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1),
97 MSG_MAP(GetDriverIfVersion, PPSMC_MSG_GetDriverIfVersion, 1),
ae77d2fa
YW
98 MSG_MAP(EnableAllSmuFeatures, PPSMC_MSG_EnableAllSmuFeatures, 0),
99 MSG_MAP(DisableAllSmuFeatures, PPSMC_MSG_DisableAllSmuFeatures, 0),
511a9555
LL
100 MSG_MAP(RequestI2cTransaction, PPSMC_MSG_RequestI2cTransaction, 0),
101 MSG_MAP(GetMetricsTable, PPSMC_MSG_GetMetricsTable, 1),
102 MSG_MAP(GetEnabledSmuFeaturesHigh, PPSMC_MSG_GetEnabledSmuFeaturesHigh, 1),
103 MSG_MAP(GetEnabledSmuFeaturesLow, PPSMC_MSG_GetEnabledSmuFeaturesLow, 1),
104 MSG_MAP(SetDriverDramAddrHigh, PPSMC_MSG_SetDriverDramAddrHigh, 1),
105 MSG_MAP(SetDriverDramAddrLow, PPSMC_MSG_SetDriverDramAddrLow, 1),
106 MSG_MAP(SetToolsDramAddrHigh, PPSMC_MSG_SetToolsDramAddrHigh, 0),
107 MSG_MAP(SetToolsDramAddrLow, PPSMC_MSG_SetToolsDramAddrLow, 0),
108 MSG_MAP(SetSoftMinByFreq, PPSMC_MSG_SetSoftMinByFreq, 0),
109 MSG_MAP(SetSoftMaxByFreq, PPSMC_MSG_SetSoftMaxByFreq, 0),
ae77d2fa
YW
110 MSG_MAP(GetMinDpmFreq, PPSMC_MSG_GetMinDpmFreq, 1),
111 MSG_MAP(GetMaxDpmFreq, PPSMC_MSG_GetMaxDpmFreq, 1),
511a9555
LL
112 MSG_MAP(GetDpmFreqByIndex, PPSMC_MSG_GetDpmFreqByIndex, 1),
113 MSG_MAP(SetPptLimit, PPSMC_MSG_SetPptLimit, 0),
114 MSG_MAP(GetPptLimit, PPSMC_MSG_GetPptLimit, 1),
115 MSG_MAP(GfxDeviceDriverReset, PPSMC_MSG_GfxDriverReset, 0),
116 MSG_MAP(DramLogSetDramAddrHigh, PPSMC_MSG_DramLogSetDramAddrHigh, 0),
117 MSG_MAP(DramLogSetDramAddrLow, PPSMC_MSG_DramLogSetDramAddrLow, 0),
118 MSG_MAP(DramLogSetDramSize, PPSMC_MSG_DramLogSetDramSize, 0),
119 MSG_MAP(GetDebugData, PPSMC_MSG_GetDebugData, 0),
120 MSG_MAP(SetNumBadHbmPagesRetired, PPSMC_MSG_SetNumBadHbmPagesRetired, 0),
121 MSG_MAP(DFCstateControl, PPSMC_MSG_DFCstateControl, 0),
122 MSG_MAP(GetGmiPwrDnHyst, PPSMC_MSG_GetGmiPwrDnHyst, 0),
123 MSG_MAP(SetGmiPwrDnHyst, PPSMC_MSG_SetGmiPwrDnHyst, 0),
124 MSG_MAP(GmiPwrDnControl, PPSMC_MSG_GmiPwrDnControl, 0),
125 MSG_MAP(EnterGfxoff, PPSMC_MSG_EnterGfxoff, 0),
126 MSG_MAP(ExitGfxoff, PPSMC_MSG_ExitGfxoff, 0),
127 MSG_MAP(EnableDeterminism, PPSMC_MSG_EnableDeterminism, 0),
128 MSG_MAP(DisableDeterminism, PPSMC_MSG_DisableDeterminism, 0),
129 MSG_MAP(GfxDriverResetRecovery, PPSMC_MSG_GfxDriverResetRecovery, 0),
ae77d2fa
YW
130 MSG_MAP(GetMinGfxclkFrequency, PPSMC_MSG_GetMinGfxDpmFreq, 1),
131 MSG_MAP(GetMaxGfxclkFrequency, PPSMC_MSG_GetMaxGfxDpmFreq, 1),
511a9555
LL
132 MSG_MAP(SetSoftMinGfxclk, PPSMC_MSG_SetSoftMinGfxClk, 0),
133 MSG_MAP(SetSoftMaxGfxClk, PPSMC_MSG_SetSoftMaxGfxClk, 0),
7214c08c 134 MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareForDriverUnload, 0),
1836bb0a 135 MSG_MAP(GetCTFLimit, PPSMC_MSG_GetCTFLimit, 0),
511a9555
LL
136};
137
138static const struct cmn2asic_mapping smu_v13_0_6_clk_map[SMU_CLK_COUNT] = {
139 CLK_MAP(SOCCLK, PPCLK_SOCCLK),
140 CLK_MAP(FCLK, PPCLK_FCLK),
141 CLK_MAP(UCLK, PPCLK_UCLK),
142 CLK_MAP(MCLK, PPCLK_UCLK),
143 CLK_MAP(DCLK, PPCLK_DCLK),
144 CLK_MAP(VCLK, PPCLK_VCLK),
145 CLK_MAP(LCLK, PPCLK_LCLK),
146};
147
148static const struct cmn2asic_mapping smu_v13_0_6_feature_mask_map[SMU_FEATURE_COUNT] = {
149 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DATA_CALCULATIONS_BIT, FEATURE_DATA_CALCULATION),
150 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DPM_GFXCLK_BIT, FEATURE_DPM_GFXCLK),
151 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DPM_UCLK_BIT, FEATURE_DPM_UCLK),
152 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DPM_SOCCLK_BIT, FEATURE_DPM_SOCCLK),
153 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DPM_FCLK_BIT, FEATURE_DPM_FCLK),
154 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DPM_LCLK_BIT, FEATURE_DPM_LCLK),
155 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DPM_VCLK_BIT, FEATURE_DPM_VCN),
156 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DPM_DCLK_BIT, FEATURE_DPM_VCN),
157 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DPM_XGMI_BIT, FEATURE_DPM_XGMI),
158 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DS_GFXCLK_BIT, FEATURE_DS_GFXCLK),
159 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DS_SOCCLK_BIT, FEATURE_DS_SOCCLK),
160 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DS_LCLK_BIT, FEATURE_DS_LCLK),
161 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DS_FCLK_BIT, FEATURE_DS_FCLK),
162 SMU_13_0_6_FEA_MAP(SMU_FEATURE_VCN_DPM_BIT, FEATURE_DPM_VCN),
163 SMU_13_0_6_FEA_MAP(SMU_FEATURE_PPT_BIT, FEATURE_PPT),
164 SMU_13_0_6_FEA_MAP(SMU_FEATURE_TDC_BIT, FEATURE_TDC),
165 SMU_13_0_6_FEA_MAP(SMU_FEATURE_APCC_DFLL_BIT, FEATURE_APCC_DFLL),
166 SMU_13_0_6_FEA_MAP(SMU_FEATURE_MP1_CG_BIT, FEATURE_SMU_CG),
167 SMU_13_0_6_FEA_MAP(SMU_FEATURE_GFXOFF_BIT, FEATURE_GFXOFF),
168 SMU_13_0_6_FEA_MAP(SMU_FEATURE_FW_CTF_BIT, FEATURE_FW_CTF),
169 SMU_13_0_6_FEA_MAP(SMU_FEATURE_THERMAL_BIT, FEATURE_THERMAL),
170 SMU_13_0_6_FEA_MAP(SMU_FEATURE_XGMI_PER_LINK_PWR_DWN_BIT, FEATURE_XGMI_PER_LINK_PWR_DOWN),
171 SMU_13_0_6_FEA_MAP(SMU_FEATURE_DF_CSTATE_BIT, FEATURE_DF_CSTATE),
172};
173
174#define TABLE_PMSTATUSLOG 0
175#define TABLE_SMU_METRICS 1
176#define TABLE_I2C_COMMANDS 2
177#define TABLE_COUNT 3
178
179static const struct cmn2asic_mapping smu_v13_0_6_table_map[SMU_TABLE_COUNT] = {
180 TAB_MAP(PMSTATUSLOG),
181 TAB_MAP(SMU_METRICS),
182 TAB_MAP(I2C_COMMANDS),
183};
184
511a9555
LL
185static const uint8_t smu_v13_0_6_throttler_map[] = {
186 [THROTTLER_PPT_BIT] = (SMU_THROTTLER_PPT0_BIT),
93682f8a
LL
187 [THROTTLER_THERMAL_SOCKET_BIT] = (SMU_THROTTLER_TEMP_GPU_BIT),
188 [THROTTLER_THERMAL_HBM_BIT] = (SMU_THROTTLER_TEMP_MEM_BIT),
189 [THROTTLER_THERMAL_VR_BIT] = (SMU_THROTTLER_TEMP_VR_GFX_BIT),
190 [THROTTLER_PROCHOT_BIT] = (SMU_THROTTLER_PROCHOT_GFX_BIT),
511a9555
LL
191};
192
193struct PPTable_t {
194 uint32_t MaxSocketPowerLimit;
195 uint32_t MaxGfxclkFrequency;
196 uint32_t MinGfxclkFrequency;
197 uint32_t FclkFrequencyTable[4];
198 uint32_t UclkFrequencyTable[4];
199 uint32_t SocclkFrequencyTable[4];
200 uint32_t VclkFrequencyTable[4];
201 uint32_t DclkFrequencyTable[4];
202 uint32_t LclkFrequencyTable[4];
203 uint32_t MaxLclkDpmRange;
204 uint32_t MinLclkDpmRange;
5e86aa29 205 uint64_t PublicSerialNumber_AID;
511a9555
LL
206 bool Init;
207};
208
209#define SMUQ10_TO_UINT(x) ((x) >> 10)
210
211struct smu_v13_0_6_dpm_map {
212 enum smu_clk_type clk_type;
213 uint32_t feature_num;
214 struct smu_13_0_dpm_table *dpm_table;
215 uint32_t *freq_table;
216};
217
218static int smu_v13_0_6_tables_init(struct smu_context *smu)
219{
220 struct smu_table_context *smu_table = &smu->smu_table;
221 struct smu_table *tables = smu_table->tables;
222 struct amdgpu_device *adev = smu->adev;
223
224 if (!(adev->flags & AMD_IS_APU))
225 SMU_TABLE_INIT(tables, SMU_TABLE_PMSTATUSLOG, SMU13_TOOL_SIZE,
226 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
227
228 SMU_TABLE_INIT(tables, SMU_TABLE_SMU_METRICS, sizeof(MetricsTable_t),
228ce176
RB
229 PAGE_SIZE,
230 AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);
511a9555
LL
231
232 SMU_TABLE_INIT(tables, SMU_TABLE_I2C_COMMANDS, sizeof(SwI2cRequest_t),
228ce176
RB
233 PAGE_SIZE,
234 AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);
511a9555
LL
235
236 smu_table->metrics_table = kzalloc(sizeof(MetricsTable_t), GFP_KERNEL);
237 if (!smu_table->metrics_table)
238 return -ENOMEM;
239 smu_table->metrics_time = 0;
240
241 smu_table->gpu_metrics_table_size = sizeof(struct gpu_metrics_v1_3);
242 smu_table->gpu_metrics_table =
243 kzalloc(smu_table->gpu_metrics_table_size, GFP_KERNEL);
244 if (!smu_table->gpu_metrics_table) {
245 kfree(smu_table->metrics_table);
246 return -ENOMEM;
247 }
248
249 smu_table->driver_pptable =
250 kzalloc(sizeof(struct PPTable_t), GFP_KERNEL);
251 if (!smu_table->driver_pptable) {
252 kfree(smu_table->metrics_table);
253 kfree(smu_table->gpu_metrics_table);
254 return -ENOMEM;
255 }
256
257 return 0;
258}
259
260static int smu_v13_0_6_allocate_dpm_context(struct smu_context *smu)
261{
262 struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
263
264 smu_dpm->dpm_context =
265 kzalloc(sizeof(struct smu_13_0_dpm_context), GFP_KERNEL);
266 if (!smu_dpm->dpm_context)
267 return -ENOMEM;
268 smu_dpm->dpm_context_size = sizeof(struct smu_13_0_dpm_context);
269
270 return 0;
271}
272
273static int smu_v13_0_6_init_smc_tables(struct smu_context *smu)
274{
275 int ret = 0;
276
277 ret = smu_v13_0_6_tables_init(smu);
278 if (ret)
279 return ret;
280
281 ret = smu_v13_0_6_allocate_dpm_context(smu);
282
283 return ret;
284}
285
286static int smu_v13_0_6_get_allowed_feature_mask(struct smu_context *smu,
287 uint32_t *feature_mask,
288 uint32_t num)
289{
290 if (num > 2)
291 return -EINVAL;
292
293 /* pptable will handle the features to enable */
294 memset(feature_mask, 0xFF, sizeof(uint32_t) * num);
295
296 return 0;
297}
298
299static int smu_v13_0_6_get_metrics_table(struct smu_context *smu,
300 void *metrics_table, bool bypass_cache)
301{
302 struct smu_table_context *smu_table = &smu->smu_table;
303 uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
304 struct smu_table *table = &smu_table->driver_table;
305 int ret;
306
307 if (bypass_cache || !smu_table->metrics_time ||
308 time_after(jiffies,
309 smu_table->metrics_time + msecs_to_jiffies(1))) {
310 ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetMetricsTable, NULL);
311 if (ret) {
312 dev_info(smu->adev->dev,
313 "Failed to export SMU metrics table!\n");
314 return ret;
315 }
316
317 amdgpu_asic_invalidate_hdp(smu->adev, NULL);
318 memcpy(smu_table->metrics_table, table->cpu_addr, table_size);
319
320 smu_table->metrics_time = jiffies;
321 }
322
323 if (metrics_table)
324 memcpy(metrics_table, smu_table->metrics_table, table_size);
325
326 return 0;
327}
328
329static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)
330{
331 struct smu_table_context *smu_table = &smu->smu_table;
332 MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table;
333 struct PPTable_t *pptable =
334 (struct PPTable_t *)smu_table->driver_pptable;
e01eeffc 335 int ret, i, retry = 100;
511a9555
LL
336
337 /* Store one-time values in driver PPTable */
338 if (!pptable->Init) {
81cc8779 339 while (--retry) {
e01eeffc
YW
340 ret = smu_v13_0_6_get_metrics_table(smu, NULL, true);
341 if (ret)
342 return ret;
343
344 /* Ensure that metrics have been updated */
345 if (metrics->AccumulationCounter)
346 break;
347
348 usleep_range(1000, 1100);
349 }
350
351 if (!retry)
352 return -ETIME;
511a9555
LL
353
354 pptable->MaxSocketPowerLimit =
355 SMUQ10_TO_UINT(metrics->MaxSocketPowerLimit);
356 pptable->MaxGfxclkFrequency =
357 SMUQ10_TO_UINT(metrics->MaxGfxclkFrequency);
358 pptable->MinGfxclkFrequency =
359 SMUQ10_TO_UINT(metrics->MinGfxclkFrequency);
360
0bad3200 361 for (i = 0; i < 4; ++i) {
511a9555
LL
362 pptable->FclkFrequencyTable[i] =
363 SMUQ10_TO_UINT(metrics->FclkFrequencyTable[i]);
364 pptable->UclkFrequencyTable[i] =
365 SMUQ10_TO_UINT(metrics->UclkFrequencyTable[i]);
366 pptable->SocclkFrequencyTable[i] = SMUQ10_TO_UINT(
367 metrics->SocclkFrequencyTable[i]);
368 pptable->VclkFrequencyTable[i] =
369 SMUQ10_TO_UINT(metrics->VclkFrequencyTable[i]);
370 pptable->DclkFrequencyTable[i] =
371 SMUQ10_TO_UINT(metrics->DclkFrequencyTable[i]);
372 pptable->LclkFrequencyTable[i] =
373 SMUQ10_TO_UINT(metrics->LclkFrequencyTable[i]);
374 }
375
5e86aa29
YW
376 /* use AID0 serial number by default */
377 pptable->PublicSerialNumber_AID = metrics->PublicSerialNumber_AID[0];
378
511a9555
LL
379 pptable->Init = true;
380 }
381
382 return 0;
383}
384
385static int smu_v13_0_6_get_dpm_ultimate_freq(struct smu_context *smu,
386 enum smu_clk_type clk_type,
387 uint32_t *min, uint32_t *max)
388{
389 struct smu_table_context *smu_table = &smu->smu_table;
390 struct PPTable_t *pptable =
391 (struct PPTable_t *)smu_table->driver_pptable;
392 uint32_t clock_limit = 0, param;
393 int ret = 0, clk_id = 0;
394
395 if (!smu_cmn_clk_dpm_is_enabled(smu, clk_type)) {
396 switch (clk_type) {
397 case SMU_MCLK:
398 case SMU_UCLK:
399 if (pptable->Init)
400 clock_limit = pptable->UclkFrequencyTable[0];
401 break;
402 case SMU_GFXCLK:
403 case SMU_SCLK:
404 if (pptable->Init)
405 clock_limit = pptable->MinGfxclkFrequency;
406 break;
407 case SMU_SOCCLK:
408 if (pptable->Init)
463e953e 409 clock_limit = pptable->SocclkFrequencyTable[0];
511a9555
LL
410 break;
411 case SMU_FCLK:
412 if (pptable->Init)
413 clock_limit = pptable->FclkFrequencyTable[0];
414 break;
415 case SMU_VCLK:
416 if (pptable->Init)
417 clock_limit = pptable->VclkFrequencyTable[0];
418 break;
419 case SMU_DCLK:
420 if (pptable->Init)
421 clock_limit = pptable->DclkFrequencyTable[0];
422 break;
423 default:
424 break;
425 }
426
427 if (min)
428 *min = clock_limit;
429
430 if (max)
431 *max = clock_limit;
432
433 return 0;
434 }
435
436 if (!(clk_type == SMU_GFXCLK || clk_type == SMU_SCLK)) {
437 clk_id = smu_cmn_to_asic_specific_index(
438 smu, CMN2ASIC_MAPPING_CLK, clk_type);
439 if (clk_id < 0) {
440 ret = -EINVAL;
441 goto failed;
442 }
443 param = (clk_id & 0xffff) << 16;
444 }
445
446 if (max) {
447 if (clk_type == SMU_GFXCLK || clk_type == SMU_SCLK)
448 ret = smu_cmn_send_smc_msg(
449 smu, SMU_MSG_GetMaxGfxclkFrequency, max);
450 else
451 ret = smu_cmn_send_smc_msg_with_param(
452 smu, SMU_MSG_GetMaxDpmFreq, param, max);
453 if (ret)
454 goto failed;
455 }
456
457 if (min) {
458 if (clk_type == SMU_GFXCLK || clk_type == SMU_SCLK)
459 ret = smu_cmn_send_smc_msg(
460 smu, SMU_MSG_GetMinGfxclkFrequency, min);
461 else
462 ret = smu_cmn_send_smc_msg_with_param(
463 smu, SMU_MSG_GetMinDpmFreq, param, min);
464 }
465
466failed:
467 return ret;
468}
469
470static int smu_v13_0_6_get_dpm_level_count(struct smu_context *smu,
471 enum smu_clk_type clk_type,
472 uint32_t *levels)
473{
474 int ret;
475
476 ret = smu_v13_0_get_dpm_freq_by_index(smu, clk_type, 0xff, levels);
477 if (!ret)
478 ++(*levels);
479
480 return ret;
481}
482
483static int smu_v13_0_6_set_default_dpm_table(struct smu_context *smu)
484{
485 struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
486 struct smu_table_context *smu_table = &smu->smu_table;
487 struct smu_13_0_dpm_table *dpm_table = NULL;
488 struct PPTable_t *pptable =
489 (struct PPTable_t *)smu_table->driver_pptable;
490 uint32_t gfxclkmin, gfxclkmax, levels;
0bad3200 491 int ret = 0, i, j;
511a9555
LL
492 struct smu_v13_0_6_dpm_map dpm_map[] = {
493 { SMU_SOCCLK, SMU_FEATURE_DPM_SOCCLK_BIT,
494 &dpm_context->dpm_tables.soc_table,
495 pptable->SocclkFrequencyTable },
496 { SMU_UCLK, SMU_FEATURE_DPM_UCLK_BIT,
497 &dpm_context->dpm_tables.uclk_table,
498 pptable->UclkFrequencyTable },
499 { SMU_FCLK, SMU_FEATURE_DPM_FCLK_BIT,
500 &dpm_context->dpm_tables.fclk_table,
501 pptable->FclkFrequencyTable },
502 { SMU_VCLK, SMU_FEATURE_DPM_VCLK_BIT,
503 &dpm_context->dpm_tables.vclk_table,
504 pptable->VclkFrequencyTable },
505 { SMU_DCLK, SMU_FEATURE_DPM_DCLK_BIT,
506 &dpm_context->dpm_tables.dclk_table,
507 pptable->DclkFrequencyTable },
508 };
509
510 smu_v13_0_6_setup_driver_pptable(smu);
511
512 /* gfxclk dpm table setup */
513 dpm_table = &dpm_context->dpm_tables.gfx_table;
514 if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_GFXCLK_BIT)) {
515 /* In the case of gfxclk, only fine-grained dpm is honored.
516 * Get min/max values from FW.
517 */
518 ret = smu_v13_0_6_get_dpm_ultimate_freq(smu, SMU_GFXCLK,
519 &gfxclkmin, &gfxclkmax);
520 if (ret)
521 return ret;
522
523 dpm_table->count = 2;
524 dpm_table->dpm_levels[0].value = gfxclkmin;
525 dpm_table->dpm_levels[0].enabled = true;
526 dpm_table->dpm_levels[1].value = gfxclkmax;
527 dpm_table->dpm_levels[1].enabled = true;
528 dpm_table->min = dpm_table->dpm_levels[0].value;
529 dpm_table->max = dpm_table->dpm_levels[1].value;
530 } else {
531 dpm_table->count = 1;
532 dpm_table->dpm_levels[0].value = pptable->MinGfxclkFrequency;
533 dpm_table->dpm_levels[0].enabled = true;
534 dpm_table->min = dpm_table->dpm_levels[0].value;
535 dpm_table->max = dpm_table->dpm_levels[0].value;
536 }
537
0bad3200 538 for (j = 0; j < ARRAY_SIZE(dpm_map); j++) {
511a9555
LL
539 dpm_table = dpm_map[j].dpm_table;
540 levels = 1;
541 if (smu_cmn_feature_is_enabled(smu, dpm_map[j].feature_num)) {
542 ret = smu_v13_0_6_get_dpm_level_count(
543 smu, dpm_map[j].clk_type, &levels);
544 if (ret)
545 return ret;
546 }
547 dpm_table->count = levels;
548 for (i = 0; i < dpm_table->count; ++i) {
549 dpm_table->dpm_levels[i].value =
550 dpm_map[j].freq_table[i];
551 dpm_table->dpm_levels[i].enabled = true;
552
553 }
554 dpm_table->min = dpm_table->dpm_levels[0].value;
555 dpm_table->max = dpm_table->dpm_levels[levels - 1].value;
556
557 }
558
559 return 0;
560}
561
562static int smu_v13_0_6_setup_pptable(struct smu_context *smu)
563{
564 struct smu_table_context *table_context = &smu->smu_table;
565
566 /* TODO: PPTable is not available.
567 * 1) Find an alternate way to get 'PPTable values' here.
568 * 2) Check if there is SW CTF
569 */
570 table_context->thermal_controller_type = 0;
571
572 return 0;
573}
574
575static int smu_v13_0_6_check_fw_status(struct smu_context *smu)
576{
577 struct amdgpu_device *adev = smu->adev;
578 uint32_t mp1_fw_flags;
579
580 mp1_fw_flags =
581 RREG32_PCIE(MP1_Public | (smnMP1_FIRMWARE_FLAGS & 0xffffffff));
582
583 if ((mp1_fw_flags & MP1_FIRMWARE_FLAGS__INTERRUPTS_ENABLED_MASK) >>
584 MP1_FIRMWARE_FLAGS__INTERRUPTS_ENABLED__SHIFT)
585 return 0;
586
587 return -EIO;
588}
589
590static int smu_v13_0_6_populate_umd_state_clk(struct smu_context *smu)
591{
592 struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
593 struct smu_13_0_dpm_table *gfx_table =
594 &dpm_context->dpm_tables.gfx_table;
595 struct smu_13_0_dpm_table *mem_table =
596 &dpm_context->dpm_tables.uclk_table;
597 struct smu_13_0_dpm_table *soc_table =
598 &dpm_context->dpm_tables.soc_table;
599 struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
600
601 pstate_table->gfxclk_pstate.min = gfx_table->min;
602 pstate_table->gfxclk_pstate.peak = gfx_table->max;
603 pstate_table->gfxclk_pstate.curr.min = gfx_table->min;
604 pstate_table->gfxclk_pstate.curr.max = gfx_table->max;
605
606 pstate_table->uclk_pstate.min = mem_table->min;
607 pstate_table->uclk_pstate.peak = mem_table->max;
608 pstate_table->uclk_pstate.curr.min = mem_table->min;
609 pstate_table->uclk_pstate.curr.max = mem_table->max;
610
611 pstate_table->socclk_pstate.min = soc_table->min;
612 pstate_table->socclk_pstate.peak = soc_table->max;
613 pstate_table->socclk_pstate.curr.min = soc_table->min;
614 pstate_table->socclk_pstate.curr.max = soc_table->max;
615
616 if (gfx_table->count > SMU_13_0_6_UMD_PSTATE_GFXCLK_LEVEL &&
617 mem_table->count > SMU_13_0_6_UMD_PSTATE_MCLK_LEVEL &&
618 soc_table->count > SMU_13_0_6_UMD_PSTATE_SOCCLK_LEVEL) {
619 pstate_table->gfxclk_pstate.standard =
620 gfx_table->dpm_levels[SMU_13_0_6_UMD_PSTATE_GFXCLK_LEVEL].value;
621 pstate_table->uclk_pstate.standard =
622 mem_table->dpm_levels[SMU_13_0_6_UMD_PSTATE_MCLK_LEVEL].value;
623 pstate_table->socclk_pstate.standard =
624 soc_table->dpm_levels[SMU_13_0_6_UMD_PSTATE_SOCCLK_LEVEL].value;
625 } else {
626 pstate_table->gfxclk_pstate.standard =
627 pstate_table->gfxclk_pstate.min;
628 pstate_table->uclk_pstate.standard =
629 pstate_table->uclk_pstate.min;
630 pstate_table->socclk_pstate.standard =
631 pstate_table->socclk_pstate.min;
632 }
633
634 return 0;
635}
636
637static int smu_v13_0_6_get_clk_table(struct smu_context *smu,
638 struct pp_clock_levels_with_latency *clocks,
639 struct smu_13_0_dpm_table *dpm_table)
640{
641 int i, count;
642
643 count = (dpm_table->count > MAX_NUM_CLOCKS) ? MAX_NUM_CLOCKS :
644 dpm_table->count;
645 clocks->num_levels = count;
646
647 for (i = 0; i < count; i++) {
648 clocks->data[i].clocks_in_khz =
649 dpm_table->dpm_levels[i].value * 1000;
650 clocks->data[i].latency_in_us = 0;
651 }
652
653 return 0;
654}
655
656static int smu_v13_0_6_freqs_in_same_level(int32_t frequency1,
657 int32_t frequency2)
658{
659 return (abs(frequency1 - frequency2) <= EPSILON);
660}
661
93682f8a 662static uint32_t smu_v13_0_6_get_throttler_status(struct smu_context *smu)
511a9555 663{
93682f8a
LL
664 struct smu_power_context *smu_power = &smu->smu_power;
665 struct smu_13_0_power_context *power_context = smu_power->power_context;
511a9555
LL
666 uint32_t throttler_status = 0;
667
93682f8a
LL
668 throttler_status = atomic_read(&power_context->throttle_status);
669 dev_dbg(smu->adev->dev, "SMU Throttler status: %u", throttler_status);
511a9555
LL
670
671 return throttler_status;
672}
673
674static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
675 MetricsMember_t member,
676 uint32_t *value)
677{
678 struct smu_table_context *smu_table = &smu->smu_table;
679 MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table;
a1b0dafa
A
680 struct amdgpu_device *adev = smu->adev;
681 uint32_t smu_version;
511a9555 682 int ret = 0;
a1b0dafa 683 int xcc_id;
511a9555
LL
684
685 ret = smu_v13_0_6_get_metrics_table(smu, NULL, false);
686 if (ret)
687 return ret;
688
689 /* For clocks with multiple instances, only report the first one */
690 switch (member) {
691 case METRICS_CURR_GFXCLK:
692 case METRICS_AVERAGE_GFXCLK:
a1b0dafa
A
693 smu_cmn_get_smc_version(smu, NULL, &smu_version);
694 if (smu_version >= 0x552F00) {
695 xcc_id = GET_INST(GC, 0);
696 *value = SMUQ10_TO_UINT(metrics->GfxclkFrequency[xcc_id]);
697 } else {
698 *value = 0;
699 }
511a9555
LL
700 break;
701 case METRICS_CURR_SOCCLK:
702 case METRICS_AVERAGE_SOCCLK:
703 *value = SMUQ10_TO_UINT(metrics->SocclkFrequency[0]);
704 break;
705 case METRICS_CURR_UCLK:
706 case METRICS_AVERAGE_UCLK:
707 *value = SMUQ10_TO_UINT(metrics->UclkFrequency);
708 break;
709 case METRICS_CURR_VCLK:
710 *value = SMUQ10_TO_UINT(metrics->VclkFrequency[0]);
711 break;
712 case METRICS_CURR_DCLK:
713 *value = SMUQ10_TO_UINT(metrics->DclkFrequency[0]);
714 break;
715 case METRICS_CURR_FCLK:
716 *value = SMUQ10_TO_UINT(metrics->FclkFrequency);
717 break;
718 case METRICS_AVERAGE_GFXACTIVITY:
719 *value = SMUQ10_TO_UINT(metrics->SocketGfxBusy);
720 break;
721 case METRICS_AVERAGE_MEMACTIVITY:
722 *value = SMUQ10_TO_UINT(metrics->DramBandwidthUtilization);
723 break;
47f1724d 724 case METRICS_CURR_SOCKETPOWER:
511a9555
LL
725 *value = SMUQ10_TO_UINT(metrics->SocketPower) << 8;
726 break;
511a9555 727 case METRICS_TEMPERATURE_HOTSPOT:
669f2372
LL
728 *value = SMUQ10_TO_UINT(metrics->MaxSocketTemperature) *
729 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
511a9555
LL
730 break;
731 case METRICS_TEMPERATURE_MEM:
669f2372
LL
732 *value = SMUQ10_TO_UINT(metrics->MaxHbmTemperature) *
733 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
511a9555
LL
734 break;
735 /* This is the max of all VRs and not just SOC VR.
736 * No need to define another data type for the same.
737 */
738 case METRICS_TEMPERATURE_VRSOC:
669f2372
LL
739 *value = SMUQ10_TO_UINT(metrics->MaxVrTemperature) *
740 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
511a9555 741 break;
511a9555
LL
742 default:
743 *value = UINT_MAX;
744 break;
745 }
746
747 return ret;
748}
749
750static int smu_v13_0_6_get_current_clk_freq_by_table(struct smu_context *smu,
751 enum smu_clk_type clk_type,
752 uint32_t *value)
753{
754 MetricsMember_t member_type;
755
756 if (!value)
757 return -EINVAL;
758
759 switch (clk_type) {
760 case SMU_GFXCLK:
761 member_type = METRICS_CURR_GFXCLK;
762 break;
763 case SMU_UCLK:
764 member_type = METRICS_CURR_UCLK;
765 break;
766 case SMU_SOCCLK:
767 member_type = METRICS_CURR_SOCCLK;
768 break;
769 case SMU_VCLK:
770 member_type = METRICS_CURR_VCLK;
771 break;
772 case SMU_DCLK:
773 member_type = METRICS_CURR_DCLK;
774 break;
775 case SMU_FCLK:
776 member_type = METRICS_CURR_FCLK;
777 break;
778 default:
779 return -EINVAL;
780 }
781
782 return smu_v13_0_6_get_smu_metrics_data(smu, member_type, value);
783}
784
785static int smu_v13_0_6_print_clk_levels(struct smu_context *smu,
786 enum smu_clk_type type, char *buf)
787{
788 int i, now, size = 0;
789 int ret = 0;
790 struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
791 struct pp_clock_levels_with_latency clocks;
792 struct smu_13_0_dpm_table *single_dpm_table;
793 struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
794 struct smu_13_0_dpm_context *dpm_context = NULL;
511a9555
LL
795 uint32_t min_clk, max_clk;
796
797 smu_cmn_get_sysfs_buf(&buf, &size);
798
799 if (amdgpu_ras_intr_triggered()) {
800 size += sysfs_emit_at(buf, size, "unavailable\n");
801 return size;
802 }
803
804 dpm_context = smu_dpm->dpm_context;
805
806 switch (type) {
807 case SMU_OD_SCLK:
808 size += sysfs_emit_at(buf, size, "%s:\n", "GFXCLK");
809 fallthrough;
810 case SMU_SCLK:
811 ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_GFXCLK,
812 &now);
813 if (ret) {
814 dev_err(smu->adev->dev,
815 "Attempt to get current gfx clk Failed!");
816 return ret;
817 }
818
511a9555
LL
819 min_clk = pstate_table->gfxclk_pstate.curr.min;
820 max_clk = pstate_table->gfxclk_pstate.curr.max;
821
54f9e1ca
YW
822 if (!smu_v13_0_6_freqs_in_same_level(now, min_clk) &&
823 !smu_v13_0_6_freqs_in_same_level(now, max_clk)) {
824 size += sysfs_emit_at(buf, size, "0: %uMhz\n",
825 min_clk);
826 size += sysfs_emit_at(buf, size, "1: %uMhz *\n",
827 now);
828 size += sysfs_emit_at(buf, size, "2: %uMhz\n",
829 max_clk);
511a9555 830 } else {
54f9e1ca
YW
831 size += sysfs_emit_at(buf, size, "0: %uMhz %s\n",
832 min_clk,
833 smu_v13_0_6_freqs_in_same_level(now, min_clk) ? "*" : "");
834 size += sysfs_emit_at(buf, size, "1: %uMhz %s\n",
835 max_clk,
836 smu_v13_0_6_freqs_in_same_level(now, max_clk) ? "*" : "");
511a9555
LL
837 }
838
839 break;
840
841 case SMU_OD_MCLK:
842 size += sysfs_emit_at(buf, size, "%s:\n", "MCLK");
843 fallthrough;
844 case SMU_MCLK:
845 ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_UCLK,
846 &now);
847 if (ret) {
848 dev_err(smu->adev->dev,
849 "Attempt to get current mclk Failed!");
850 return ret;
851 }
852
853 single_dpm_table = &(dpm_context->dpm_tables.uclk_table);
854 ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
855 if (ret) {
856 dev_err(smu->adev->dev,
857 "Attempt to get memory clk levels Failed!");
858 return ret;
859 }
860
861 for (i = 0; i < clocks.num_levels; i++)
862 size += sysfs_emit_at(
863 buf, size, "%d: %uMhz %s\n", i,
864 clocks.data[i].clocks_in_khz / 1000,
865 (clocks.num_levels == 1) ?
866 "*" :
867 (smu_v13_0_6_freqs_in_same_level(
868 clocks.data[i].clocks_in_khz /
869 1000,
870 now) ?
871 "*" :
872 ""));
873 break;
874
875 case SMU_SOCCLK:
876 ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_SOCCLK,
877 &now);
878 if (ret) {
879 dev_err(smu->adev->dev,
880 "Attempt to get current socclk Failed!");
881 return ret;
882 }
883
884 single_dpm_table = &(dpm_context->dpm_tables.soc_table);
885 ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
886 if (ret) {
887 dev_err(smu->adev->dev,
888 "Attempt to get socclk levels Failed!");
889 return ret;
890 }
891
892 for (i = 0; i < clocks.num_levels; i++)
893 size += sysfs_emit_at(
894 buf, size, "%d: %uMhz %s\n", i,
895 clocks.data[i].clocks_in_khz / 1000,
896 (clocks.num_levels == 1) ?
897 "*" :
898 (smu_v13_0_6_freqs_in_same_level(
899 clocks.data[i].clocks_in_khz /
900 1000,
901 now) ?
902 "*" :
903 ""));
904 break;
905
906 case SMU_FCLK:
907 ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_FCLK,
908 &now);
909 if (ret) {
910 dev_err(smu->adev->dev,
911 "Attempt to get current fclk Failed!");
912 return ret;
913 }
914
915 single_dpm_table = &(dpm_context->dpm_tables.fclk_table);
916 ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
917 if (ret) {
918 dev_err(smu->adev->dev,
919 "Attempt to get fclk levels Failed!");
920 return ret;
921 }
922
923 for (i = 0; i < single_dpm_table->count; i++)
924 size += sysfs_emit_at(
925 buf, size, "%d: %uMhz %s\n", i,
926 single_dpm_table->dpm_levels[i].value,
927 (clocks.num_levels == 1) ?
928 "*" :
929 (smu_v13_0_6_freqs_in_same_level(
930 clocks.data[i].clocks_in_khz /
931 1000,
932 now) ?
933 "*" :
934 ""));
935 break;
936
937 case SMU_VCLK:
938 ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_VCLK,
939 &now);
940 if (ret) {
941 dev_err(smu->adev->dev,
942 "Attempt to get current vclk Failed!");
943 return ret;
944 }
945
946 single_dpm_table = &(dpm_context->dpm_tables.vclk_table);
947 ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
948 if (ret) {
949 dev_err(smu->adev->dev,
950 "Attempt to get vclk levels Failed!");
951 return ret;
952 }
953
954 for (i = 0; i < single_dpm_table->count; i++)
955 size += sysfs_emit_at(
956 buf, size, "%d: %uMhz %s\n", i,
957 single_dpm_table->dpm_levels[i].value,
958 (clocks.num_levels == 1) ?
959 "*" :
960 (smu_v13_0_6_freqs_in_same_level(
961 clocks.data[i].clocks_in_khz /
962 1000,
963 now) ?
964 "*" :
965 ""));
966 break;
967
968 case SMU_DCLK:
969 ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_DCLK,
970 &now);
971 if (ret) {
972 dev_err(smu->adev->dev,
973 "Attempt to get current dclk Failed!");
974 return ret;
975 }
976
977 single_dpm_table = &(dpm_context->dpm_tables.dclk_table);
978 ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
979 if (ret) {
980 dev_err(smu->adev->dev,
981 "Attempt to get dclk levels Failed!");
982 return ret;
983 }
984
985 for (i = 0; i < single_dpm_table->count; i++)
986 size += sysfs_emit_at(
987 buf, size, "%d: %uMhz %s\n", i,
988 single_dpm_table->dpm_levels[i].value,
989 (clocks.num_levels == 1) ?
990 "*" :
991 (smu_v13_0_6_freqs_in_same_level(
992 clocks.data[i].clocks_in_khz /
993 1000,
994 now) ?
995 "*" :
996 ""));
997 break;
998
999 default:
1000 break;
1001 }
1002
1003 return size;
1004}
1005
1006static int smu_v13_0_6_upload_dpm_level(struct smu_context *smu, bool max,
1007 uint32_t feature_mask, uint32_t level)
1008{
1009 struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
1010 uint32_t freq;
1011 int ret = 0;
1012
1013 if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_GFXCLK_BIT) &&
1014 (feature_mask & FEATURE_MASK(FEATURE_DPM_GFXCLK))) {
1015 freq = dpm_context->dpm_tables.gfx_table.dpm_levels[level].value;
1016 ret = smu_cmn_send_smc_msg_with_param(
1017 smu,
1018 (max ? SMU_MSG_SetSoftMaxGfxClk :
1019 SMU_MSG_SetSoftMinGfxclk),
1020 freq & 0xffff, NULL);
1021 if (ret) {
1022 dev_err(smu->adev->dev,
1023 "Failed to set soft %s gfxclk !\n",
1024 max ? "max" : "min");
1025 return ret;
1026 }
1027 }
1028
1029 if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT) &&
1030 (feature_mask & FEATURE_MASK(FEATURE_DPM_UCLK))) {
1031 freq = dpm_context->dpm_tables.uclk_table.dpm_levels[level]
1032 .value;
1033 ret = smu_cmn_send_smc_msg_with_param(
1034 smu,
1035 (max ? SMU_MSG_SetSoftMaxByFreq :
1036 SMU_MSG_SetSoftMinByFreq),
1037 (PPCLK_UCLK << 16) | (freq & 0xffff), NULL);
1038 if (ret) {
1039 dev_err(smu->adev->dev,
1040 "Failed to set soft %s memclk !\n",
1041 max ? "max" : "min");
1042 return ret;
1043 }
1044 }
1045
1046 if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT) &&
1047 (feature_mask & FEATURE_MASK(FEATURE_DPM_SOCCLK))) {
1048 freq = dpm_context->dpm_tables.soc_table.dpm_levels[level].value;
1049 ret = smu_cmn_send_smc_msg_with_param(
1050 smu,
1051 (max ? SMU_MSG_SetSoftMaxByFreq :
1052 SMU_MSG_SetSoftMinByFreq),
1053 (PPCLK_SOCCLK << 16) | (freq & 0xffff), NULL);
1054 if (ret) {
1055 dev_err(smu->adev->dev,
1056 "Failed to set soft %s socclk !\n",
1057 max ? "max" : "min");
1058 return ret;
1059 }
1060 }
1061
1062 return ret;
1063}
1064
1065static int smu_v13_0_6_force_clk_levels(struct smu_context *smu,
1066 enum smu_clk_type type, uint32_t mask)
1067{
1068 struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
1069 struct smu_13_0_dpm_table *single_dpm_table = NULL;
1070 uint32_t soft_min_level, soft_max_level;
1071 int ret = 0;
1072
1073 soft_min_level = mask ? (ffs(mask) - 1) : 0;
1074 soft_max_level = mask ? (fls(mask) - 1) : 0;
1075
1076 switch (type) {
1077 case SMU_SCLK:
1078 single_dpm_table = &(dpm_context->dpm_tables.gfx_table);
1079 if (soft_max_level >= single_dpm_table->count) {
1080 dev_err(smu->adev->dev,
1081 "Clock level specified %d is over max allowed %d\n",
1082 soft_max_level, single_dpm_table->count - 1);
1083 ret = -EINVAL;
1084 break;
1085 }
1086
1087 ret = smu_v13_0_6_upload_dpm_level(
1088 smu, false, FEATURE_MASK(FEATURE_DPM_GFXCLK),
1089 soft_min_level);
1090 if (ret) {
1091 dev_err(smu->adev->dev,
1092 "Failed to upload boot level to lowest!\n");
1093 break;
1094 }
1095
1096 ret = smu_v13_0_6_upload_dpm_level(
1097 smu, true, FEATURE_MASK(FEATURE_DPM_GFXCLK),
1098 soft_max_level);
1099 if (ret)
1100 dev_err(smu->adev->dev,
1101 "Failed to upload dpm max level to highest!\n");
1102
1103 break;
1104
1105 case SMU_MCLK:
1106 case SMU_SOCCLK:
1107 case SMU_FCLK:
1108 /*
1109 * Should not arrive here since smu_13_0_6 does not
1110 * support mclk/socclk/fclk softmin/softmax settings
1111 */
1112 ret = -EINVAL;
1113 break;
1114
1115 default:
1116 break;
1117 }
1118
1119 return ret;
1120}
1121
511a9555
LL
1122static int smu_v13_0_6_get_current_activity_percent(struct smu_context *smu,
1123 enum amd_pp_sensors sensor,
1124 uint32_t *value)
1125{
1126 int ret = 0;
1127
1128 if (!value)
1129 return -EINVAL;
1130
1131 switch (sensor) {
1132 case AMDGPU_PP_SENSOR_GPU_LOAD:
1133 ret = smu_v13_0_6_get_smu_metrics_data(
1134 smu, METRICS_AVERAGE_GFXACTIVITY, value);
1135 break;
1136 case AMDGPU_PP_SENSOR_MEM_LOAD:
1137 ret = smu_v13_0_6_get_smu_metrics_data(
1138 smu, METRICS_AVERAGE_MEMACTIVITY, value);
1139 break;
1140 default:
1141 dev_err(smu->adev->dev,
1142 "Invalid sensor for retrieving clock activity\n");
1143 return -EINVAL;
1144 }
1145
1146 return ret;
1147}
1148
511a9555
LL
1149static int smu_v13_0_6_thermal_get_temperature(struct smu_context *smu,
1150 enum amd_pp_sensors sensor,
1151 uint32_t *value)
1152{
1153 int ret = 0;
1154
1155 if (!value)
1156 return -EINVAL;
1157
1158 switch (sensor) {
1159 case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
1160 ret = smu_v13_0_6_get_smu_metrics_data(
1161 smu, METRICS_TEMPERATURE_HOTSPOT, value);
1162 break;
511a9555
LL
1163 case AMDGPU_PP_SENSOR_MEM_TEMP:
1164 ret = smu_v13_0_6_get_smu_metrics_data(
1165 smu, METRICS_TEMPERATURE_MEM, value);
1166 break;
1167 default:
1168 dev_err(smu->adev->dev, "Invalid sensor for retrieving temp\n");
1169 return -EINVAL;
1170 }
1171
1172 return ret;
1173}
1174
1175static int smu_v13_0_6_read_sensor(struct smu_context *smu,
1176 enum amd_pp_sensors sensor, void *data,
1177 uint32_t *size)
1178{
1179 int ret = 0;
1180
1181 if (amdgpu_ras_intr_triggered())
1182 return 0;
1183
1184 if (!data || !size)
1185 return -EINVAL;
1186
1187 switch (sensor) {
1188 case AMDGPU_PP_SENSOR_MEM_LOAD:
1189 case AMDGPU_PP_SENSOR_GPU_LOAD:
1190 ret = smu_v13_0_6_get_current_activity_percent(smu, sensor,
1191 (uint32_t *)data);
1192 *size = 4;
1193 break;
47f1724d
ML
1194 case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
1195 ret = smu_v13_0_6_get_smu_metrics_data(smu,
1196 METRICS_CURR_SOCKETPOWER,
1197 (uint32_t *)data);
511a9555
LL
1198 *size = 4;
1199 break;
1200 case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
511a9555
LL
1201 case AMDGPU_PP_SENSOR_MEM_TEMP:
1202 ret = smu_v13_0_6_thermal_get_temperature(smu, sensor,
1203 (uint32_t *)data);
1204 *size = 4;
1205 break;
1206 case AMDGPU_PP_SENSOR_GFX_MCLK:
1207 ret = smu_v13_0_6_get_current_clk_freq_by_table(
1208 smu, SMU_UCLK, (uint32_t *)data);
1209 /* the output clock frequency in 10K unit */
1210 *(uint32_t *)data *= 100;
1211 *size = 4;
1212 break;
1213 case AMDGPU_PP_SENSOR_GFX_SCLK:
1214 ret = smu_v13_0_6_get_current_clk_freq_by_table(
1215 smu, SMU_GFXCLK, (uint32_t *)data);
1216 *(uint32_t *)data *= 100;
1217 *size = 4;
1218 break;
1219 case AMDGPU_PP_SENSOR_VDDGFX:
1220 ret = smu_v13_0_get_gfx_vdd(smu, (uint32_t *)data);
1221 *size = 4;
1222 break;
9366c2e8 1223 case AMDGPU_PP_SENSOR_GPU_AVG_POWER:
511a9555
LL
1224 default:
1225 ret = -EOPNOTSUPP;
1226 break;
1227 }
1228
1229 return ret;
1230}
1231
1232static int smu_v13_0_6_get_power_limit(struct smu_context *smu,
1233 uint32_t *current_power_limit,
1234 uint32_t *default_power_limit,
1235 uint32_t *max_power_limit)
1236{
d397fa5e
RS
1237 struct smu_table_context *smu_table = &smu->smu_table;
1238 struct PPTable_t *pptable =
1239 (struct PPTable_t *)smu_table->driver_pptable;
511a9555
LL
1240 uint32_t power_limit = 0;
1241 int ret;
1242
511a9555
LL
1243 ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetPptLimit, &power_limit);
1244
1245 if (ret) {
1246 dev_err(smu->adev->dev, "Couldn't get PPT limit");
1247 return -EINVAL;
1248 }
1249
1250 if (current_power_limit)
1251 *current_power_limit = power_limit;
1252 if (default_power_limit)
1253 *default_power_limit = power_limit;
1254
1255 if (max_power_limit) {
1256 *max_power_limit = pptable->MaxSocketPowerLimit;
1257 }
1258
1259 return 0;
1260}
1261
1262static int smu_v13_0_6_set_power_limit(struct smu_context *smu,
1263 enum smu_ppt_limit_type limit_type,
1264 uint32_t limit)
1265{
1266 return smu_v13_0_set_power_limit(smu, limit_type, limit);
1267}
1268
676915e4
A
1269static int smu_v13_0_6_irq_process(struct amdgpu_device *adev,
1270 struct amdgpu_irq_src *source,
1271 struct amdgpu_iv_entry *entry)
1272{
1273 struct smu_context *smu = adev->powerplay.pp_handle;
93682f8a
LL
1274 struct smu_power_context *smu_power = &smu->smu_power;
1275 struct smu_13_0_power_context *power_context = smu_power->power_context;
676915e4 1276 uint32_t client_id = entry->client_id;
676915e4 1277 uint32_t ctxid = entry->src_data[0];
93682f8a 1278 uint32_t src_id = entry->src_id;
676915e4
A
1279 uint32_t data;
1280
1281 if (client_id == SOC15_IH_CLIENTID_MP1) {
1282 if (src_id == IH_INTERRUPT_ID_TO_DRIVER) {
1283 /* ACK SMUToHost interrupt */
1284 data = RREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL);
1285 data = REG_SET_FIELD(data, MP1_SMN_IH_SW_INT_CTRL, INT_ACK, 1);
1286 WREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL, data);
93682f8a
LL
1287 /*
1288 * ctxid is used to distinguish different events for SMCToHost
1289 * interrupt.
1290 */
676915e4
A
1291 switch (ctxid) {
1292 case IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING:
1293 /*
1294 * Increment the throttle interrupt counter
1295 */
1296 atomic64_inc(&smu->throttle_int_counter);
1297
1298 if (!atomic_read(&adev->throttling_logging_enabled))
1299 return 0;
1300
93682f8a
LL
1301 /* This uses the new method which fixes the
1302 * incorrect throttling status reporting
1303 * through metrics table. For older FWs,
1304 * it will be ignored.
1305 */
1306 if (__ratelimit(&adev->throttling_logging_rs)) {
1307 atomic_set(
1308 &power_context->throttle_status,
1309 entry->src_data[1]);
676915e4 1310 schedule_work(&smu->throttling_logging_work);
93682f8a 1311 }
676915e4
A
1312
1313 break;
1314 }
1315 }
1316 }
1317
1318 return 0;
1319}
1320
87f4c2d9 1321static int smu_v13_0_6_set_irq_state(struct amdgpu_device *adev,
676915e4
A
1322 struct amdgpu_irq_src *source,
1323 unsigned tyep,
1324 enum amdgpu_interrupt_state state)
1325{
1326 uint32_t val = 0;
1327
1328 switch (state) {
1329 case AMDGPU_IRQ_STATE_DISABLE:
1330 /* For MP1 SW irqs */
1331 val = RREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL);
1332 val = REG_SET_FIELD(val, MP1_SMN_IH_SW_INT_CTRL, INT_MASK, 1);
1333 WREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL, val);
1334
1335 break;
1336 case AMDGPU_IRQ_STATE_ENABLE:
1337 /* For MP1 SW irqs */
1338 val = RREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT);
1339 val = REG_SET_FIELD(val, MP1_SMN_IH_SW_INT, ID, 0xFE);
1340 val = REG_SET_FIELD(val, MP1_SMN_IH_SW_INT, VALID, 0);
1341 WREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT, val);
1342
1343 val = RREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL);
1344 val = REG_SET_FIELD(val, MP1_SMN_IH_SW_INT_CTRL, INT_MASK, 0);
1345 WREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL, val);
1346
1347 break;
1348 default:
1349 break;
1350 }
1351
1352 return 0;
1353}
1354
d397fa5e 1355static const struct amdgpu_irq_src_funcs smu_v13_0_6_irq_funcs = {
676915e4
A
1356 .set = smu_v13_0_6_set_irq_state,
1357 .process = smu_v13_0_6_irq_process,
1358};
1359
87f4c2d9 1360static int smu_v13_0_6_register_irq_handler(struct smu_context *smu)
676915e4
A
1361{
1362 struct amdgpu_device *adev = smu->adev;
1363 struct amdgpu_irq_src *irq_src = &smu->irq_source;
1364 int ret = 0;
1365
1366 if (amdgpu_sriov_vf(adev))
1367 return 0;
1368
1369 irq_src->num_types = 1;
1370 irq_src->funcs = &smu_v13_0_6_irq_funcs;
1371
1372 ret = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_MP1,
1373 IH_INTERRUPT_ID_TO_DRIVER,
1374 irq_src);
1375 if (ret)
1376 return ret;
1377
1378 return ret;
1379}
1380
7214c08c
LL
1381static int smu_v13_0_6_notify_unload(struct smu_context *smu)
1382{
1383 uint32_t smu_version;
1384
1385 smu_cmn_get_smc_version(smu, NULL, &smu_version);
1386 if (smu_version <= 0x553500)
1387 return 0;
1388
1389 dev_dbg(smu->adev->dev, "Notify PMFW about driver unload");
1390 /* Ignore return, just intimate FW that driver is not going to be there */
1391 smu_cmn_send_smc_msg(smu, SMU_MSG_PrepareMp1ForUnload, NULL);
1392
1393 return 0;
1394}
1395
511a9555
LL
1396static int smu_v13_0_6_system_features_control(struct smu_context *smu,
1397 bool enable)
1398{
7214c08c 1399 struct amdgpu_device *adev = smu->adev;
09a77a40 1400 int ret = 0;
7214c08c 1401
ae77d2fa
YW
1402 if (amdgpu_sriov_vf(adev))
1403 return 0;
1404
09a77a40
LM
1405 if (enable) {
1406 if (!(adev->flags & AMD_IS_APU))
1407 ret = smu_v13_0_system_features_control(smu, enable);
1408 } else {
1409 /* Notify FW that the device is no longer driver managed */
1410 smu_v13_0_6_notify_unload(smu);
7214c08c 1411 }
511a9555 1412
511a9555
LL
1413 return ret;
1414}
1415
1416static int smu_v13_0_6_set_gfx_soft_freq_limited_range(struct smu_context *smu,
1417 uint32_t min,
1418 uint32_t max)
1419{
1420 int ret;
1421
1422 ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetSoftMaxGfxClk,
1423 max & 0xffff, NULL);
1424 if (ret)
1425 return ret;
1426
1427 ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetSoftMinGfxclk,
1428 min & 0xffff, NULL);
1429
1430 return ret;
1431}
1432
1433static int smu_v13_0_6_set_performance_level(struct smu_context *smu,
1434 enum amd_dpm_forced_level level)
1435{
1436 struct smu_dpm_context *smu_dpm = &(smu->smu_dpm);
1437 struct smu_13_0_dpm_context *dpm_context = smu_dpm->dpm_context;
1438 struct smu_13_0_dpm_table *gfx_table =
1439 &dpm_context->dpm_tables.gfx_table;
1440 struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
1441 int ret;
1442
1443 /* Disable determinism if switching to another mode */
1444 if ((smu_dpm->dpm_level == AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) &&
1445 (level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM)) {
1446 smu_cmn_send_smc_msg(smu, SMU_MSG_DisableDeterminism, NULL);
1447 pstate_table->gfxclk_pstate.curr.max = gfx_table->max;
1448 }
1449
1450 switch (level) {
1451 case AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM:
1452 return 0;
1453
1454 case AMD_DPM_FORCED_LEVEL_AUTO:
1455 if ((gfx_table->min == pstate_table->gfxclk_pstate.curr.min) &&
1456 (gfx_table->max == pstate_table->gfxclk_pstate.curr.max))
1457 return 0;
1458
1459 ret = smu_v13_0_6_set_gfx_soft_freq_limited_range(
1460 smu, gfx_table->min, gfx_table->max);
1461 if (ret)
1462 return ret;
1463
1464 pstate_table->gfxclk_pstate.curr.min = gfx_table->min;
1465 pstate_table->gfxclk_pstate.curr.max = gfx_table->max;
1466 return 0;
1467 case AMD_DPM_FORCED_LEVEL_MANUAL:
1468 return 0;
1469 default:
1470 break;
1471 }
1472
1473 return -EINVAL;
1474}
1475
1476static int smu_v13_0_6_set_soft_freq_limited_range(struct smu_context *smu,
1477 enum smu_clk_type clk_type,
1478 uint32_t min, uint32_t max)
1479{
1480 struct smu_dpm_context *smu_dpm = &(smu->smu_dpm);
1481 struct smu_13_0_dpm_context *dpm_context = smu_dpm->dpm_context;
1482 struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
1483 struct amdgpu_device *adev = smu->adev;
1484 uint32_t min_clk;
1485 uint32_t max_clk;
1486 int ret = 0;
1487
1488 if (clk_type != SMU_GFXCLK && clk_type != SMU_SCLK)
1489 return -EINVAL;
1490
1491 if ((smu_dpm->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) &&
1492 (smu_dpm->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM))
1493 return -EINVAL;
1494
1495 if (smu_dpm->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL) {
1496 if (min >= max) {
1497 dev_err(smu->adev->dev,
1498 "Minimum GFX clk should be less than the maximum allowed clock\n");
1499 return -EINVAL;
1500 }
1501
1502 if ((min == pstate_table->gfxclk_pstate.curr.min) &&
1503 (max == pstate_table->gfxclk_pstate.curr.max))
1504 return 0;
1505
1506 ret = smu_v13_0_6_set_gfx_soft_freq_limited_range(smu, min, max);
1507 if (!ret) {
1508 pstate_table->gfxclk_pstate.curr.min = min;
1509 pstate_table->gfxclk_pstate.curr.max = max;
1510 }
1511
1512 return ret;
1513 }
1514
1515 if (smu_dpm->dpm_level == AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) {
1516 if (!max || (max < dpm_context->dpm_tables.gfx_table.min) ||
1517 (max > dpm_context->dpm_tables.gfx_table.max)) {
1518 dev_warn(
1519 adev->dev,
1520 "Invalid max frequency %d MHz specified for determinism\n",
1521 max);
1522 return -EINVAL;
1523 }
1524
1525 /* Restore default min/max clocks and enable determinism */
1526 min_clk = dpm_context->dpm_tables.gfx_table.min;
1527 max_clk = dpm_context->dpm_tables.gfx_table.max;
1528 ret = smu_v13_0_6_set_gfx_soft_freq_limited_range(smu, min_clk,
1529 max_clk);
1530 if (!ret) {
1531 usleep_range(500, 1000);
1532 ret = smu_cmn_send_smc_msg_with_param(
1533 smu, SMU_MSG_EnableDeterminism, max, NULL);
1534 if (ret) {
1535 dev_err(adev->dev,
1536 "Failed to enable determinism at GFX clock %d MHz\n",
1537 max);
1538 } else {
1539 pstate_table->gfxclk_pstate.curr.min = min_clk;
1540 pstate_table->gfxclk_pstate.curr.max = max;
1541 }
1542 }
1543 }
1544
1545 return ret;
1546}
1547
1548static int smu_v13_0_6_usr_edit_dpm_table(struct smu_context *smu,
1549 enum PP_OD_DPM_TABLE_COMMAND type,
1550 long input[], uint32_t size)
1551{
1552 struct smu_dpm_context *smu_dpm = &(smu->smu_dpm);
1553 struct smu_13_0_dpm_context *dpm_context = smu_dpm->dpm_context;
1554 struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
1555 uint32_t min_clk;
1556 uint32_t max_clk;
1557 int ret = 0;
1558
1559 /* Only allowed in manual or determinism mode */
1560 if ((smu_dpm->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) &&
1561 (smu_dpm->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM))
1562 return -EINVAL;
1563
1564 switch (type) {
1565 case PP_OD_EDIT_SCLK_VDDC_TABLE:
1566 if (size != 2) {
1567 dev_err(smu->adev->dev,
1568 "Input parameter number not correct\n");
1569 return -EINVAL;
1570 }
1571
1572 if (input[0] == 0) {
1573 if (input[1] < dpm_context->dpm_tables.gfx_table.min) {
1574 dev_warn(
1575 smu->adev->dev,
1576 "Minimum GFX clk (%ld) MHz specified is less than the minimum allowed (%d) MHz\n",
1577 input[1],
1578 dpm_context->dpm_tables.gfx_table.min);
1579 pstate_table->gfxclk_pstate.custom.min =
1580 pstate_table->gfxclk_pstate.curr.min;
1581 return -EINVAL;
1582 }
1583
1584 pstate_table->gfxclk_pstate.custom.min = input[1];
1585 } else if (input[0] == 1) {
1586 if (input[1] > dpm_context->dpm_tables.gfx_table.max) {
1587 dev_warn(
1588 smu->adev->dev,
1589 "Maximum GFX clk (%ld) MHz specified is greater than the maximum allowed (%d) MHz\n",
1590 input[1],
1591 dpm_context->dpm_tables.gfx_table.max);
1592 pstate_table->gfxclk_pstate.custom.max =
1593 pstate_table->gfxclk_pstate.curr.max;
1594 return -EINVAL;
1595 }
1596
1597 pstate_table->gfxclk_pstate.custom.max = input[1];
1598 } else {
1599 return -EINVAL;
1600 }
1601 break;
1602 case PP_OD_RESTORE_DEFAULT_TABLE:
1603 if (size != 0) {
1604 dev_err(smu->adev->dev,
1605 "Input parameter number not correct\n");
1606 return -EINVAL;
1607 } else {
1608 /* Use the default frequencies for manual and determinism mode */
1609 min_clk = dpm_context->dpm_tables.gfx_table.min;
1610 max_clk = dpm_context->dpm_tables.gfx_table.max;
1611
1612 return smu_v13_0_6_set_soft_freq_limited_range(
1613 smu, SMU_GFXCLK, min_clk, max_clk);
1614 }
1615 break;
1616 case PP_OD_COMMIT_DPM_TABLE:
1617 if (size != 0) {
1618 dev_err(smu->adev->dev,
1619 "Input parameter number not correct\n");
1620 return -EINVAL;
1621 } else {
1622 if (!pstate_table->gfxclk_pstate.custom.min)
1623 pstate_table->gfxclk_pstate.custom.min =
1624 pstate_table->gfxclk_pstate.curr.min;
1625
1626 if (!pstate_table->gfxclk_pstate.custom.max)
1627 pstate_table->gfxclk_pstate.custom.max =
1628 pstate_table->gfxclk_pstate.curr.max;
1629
1630 min_clk = pstate_table->gfxclk_pstate.custom.min;
1631 max_clk = pstate_table->gfxclk_pstate.custom.max;
1632
1633 return smu_v13_0_6_set_soft_freq_limited_range(
1634 smu, SMU_GFXCLK, min_clk, max_clk);
1635 }
1636 break;
1637 default:
1638 return -ENOSYS;
1639 }
1640
1641 return ret;
1642}
1643
1644static int smu_v13_0_6_get_enabled_mask(struct smu_context *smu,
1645 uint64_t *feature_mask)
1646{
1647 uint32_t smu_version;
1648 int ret;
1649
1650 smu_cmn_get_smc_version(smu, NULL, &smu_version);
1651 ret = smu_cmn_get_enabled_mask(smu, feature_mask);
1652
1653 if (ret == -EIO && smu_version < 0x552F00) {
1654 *feature_mask = 0;
1655 ret = 0;
1656 }
1657
1658 return ret;
1659}
1660
1661static bool smu_v13_0_6_is_dpm_running(struct smu_context *smu)
1662{
1663 int ret;
1664 uint64_t feature_enabled;
1665
1666 ret = smu_v13_0_6_get_enabled_mask(smu, &feature_enabled);
1667
1668 if (ret)
1669 return false;
1670
1671 return !!(feature_enabled & SMC_DPM_FEATURE);
1672}
1673
1674static int smu_v13_0_6_request_i2c_xfer(struct smu_context *smu,
1675 void *table_data)
1676{
1677 struct smu_table_context *smu_table = &smu->smu_table;
1678 struct smu_table *table = &smu_table->driver_table;
1679 struct amdgpu_device *adev = smu->adev;
1680 uint32_t table_size;
1681 int ret = 0;
1682
1683 if (!table_data)
1684 return -EINVAL;
1685
1686 table_size = smu_table->tables[SMU_TABLE_I2C_COMMANDS].size;
1687
1688 memcpy(table->cpu_addr, table_data, table_size);
1689 /* Flush hdp cache */
1690 amdgpu_asic_flush_hdp(adev, NULL);
1691 ret = smu_cmn_send_smc_msg(smu, SMU_MSG_RequestI2cTransaction,
1692 NULL);
1693
1694 return ret;
1695}
1696
1697static int smu_v13_0_6_i2c_xfer(struct i2c_adapter *i2c_adap,
1698 struct i2c_msg *msg, int num_msgs)
1699{
1700 struct amdgpu_smu_i2c_bus *smu_i2c = i2c_get_adapdata(i2c_adap);
1701 struct amdgpu_device *adev = smu_i2c->adev;
1702 struct smu_context *smu = adev->powerplay.pp_handle;
1703 struct smu_table_context *smu_table = &smu->smu_table;
1704 struct smu_table *table = &smu_table->driver_table;
1705 SwI2cRequest_t *req, *res = (SwI2cRequest_t *)table->cpu_addr;
1706 int i, j, r, c;
1707 u16 dir;
1708
1709 if (!adev->pm.dpm_enabled)
1710 return -EBUSY;
1711
1712 req = kzalloc(sizeof(*req), GFP_KERNEL);
1713 if (!req)
1714 return -ENOMEM;
1715
1716 req->I2CcontrollerPort = smu_i2c->port;
1717 req->I2CSpeed = I2C_SPEED_FAST_400K;
1718 req->SlaveAddress = msg[0].addr << 1; /* wants an 8-bit address */
1719 dir = msg[0].flags & I2C_M_RD;
1720
1721 for (c = i = 0; i < num_msgs; i++) {
1722 for (j = 0; j < msg[i].len; j++, c++) {
1723 SwI2cCmd_t *cmd = &req->SwI2cCmds[c];
1724
1725 if (!(msg[i].flags & I2C_M_RD)) {
1726 /* write */
1727 cmd->CmdConfig |= CMDCONFIG_READWRITE_MASK;
1728 cmd->ReadWriteData = msg[i].buf[j];
1729 }
1730
1731 if ((dir ^ msg[i].flags) & I2C_M_RD) {
1732 /* The direction changes.
1733 */
1734 dir = msg[i].flags & I2C_M_RD;
1735 cmd->CmdConfig |= CMDCONFIG_RESTART_MASK;
1736 }
1737
1738 req->NumCmds++;
1739
1740 /*
1741 * Insert STOP if we are at the last byte of either last
1742 * message for the transaction or the client explicitly
1743 * requires a STOP at this particular message.
1744 */
1745 if ((j == msg[i].len - 1) &&
1746 ((i == num_msgs - 1) || (msg[i].flags & I2C_M_STOP))) {
1747 cmd->CmdConfig &= ~CMDCONFIG_RESTART_MASK;
1748 cmd->CmdConfig |= CMDCONFIG_STOP_MASK;
1749 }
1750 }
1751 }
1752 mutex_lock(&adev->pm.mutex);
1753 r = smu_v13_0_6_request_i2c_xfer(smu, req);
511a9555
LL
1754 if (r)
1755 goto fail;
1756
1757 for (c = i = 0; i < num_msgs; i++) {
1758 if (!(msg[i].flags & I2C_M_RD)) {
1759 c += msg[i].len;
1760 continue;
1761 }
1762 for (j = 0; j < msg[i].len; j++, c++) {
1763 SwI2cCmd_t *cmd = &res->SwI2cCmds[c];
1764
1765 msg[i].buf[j] = cmd->ReadWriteData;
1766 }
1767 }
1768 r = num_msgs;
1769fail:
d934e537 1770 mutex_unlock(&adev->pm.mutex);
511a9555
LL
1771 kfree(req);
1772 return r;
1773}
1774
1775static u32 smu_v13_0_6_i2c_func(struct i2c_adapter *adap)
1776{
1777 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
1778}
1779
1780static const struct i2c_algorithm smu_v13_0_6_i2c_algo = {
1781 .master_xfer = smu_v13_0_6_i2c_xfer,
1782 .functionality = smu_v13_0_6_i2c_func,
1783};
1784
1785static const struct i2c_adapter_quirks smu_v13_0_6_i2c_control_quirks = {
1786 .flags = I2C_AQ_COMB | I2C_AQ_COMB_SAME_ADDR | I2C_AQ_NO_ZERO_LEN,
1787 .max_read_len = MAX_SW_I2C_COMMANDS,
1788 .max_write_len = MAX_SW_I2C_COMMANDS,
1789 .max_comb_1st_msg_len = 2,
1790 .max_comb_2nd_msg_len = MAX_SW_I2C_COMMANDS - 2,
1791};
1792
1793static int smu_v13_0_6_i2c_control_init(struct smu_context *smu)
1794{
1795 struct amdgpu_device *adev = smu->adev;
1796 int res, i;
1797
1798 for (i = 0; i < MAX_SMU_I2C_BUSES; i++) {
1799 struct amdgpu_smu_i2c_bus *smu_i2c = &adev->pm.smu_i2c[i];
1800 struct i2c_adapter *control = &smu_i2c->adapter;
1801
1802 smu_i2c->adev = adev;
1803 smu_i2c->port = i;
1804 mutex_init(&smu_i2c->mutex);
1805 control->owner = THIS_MODULE;
1806 control->class = I2C_CLASS_SPD;
1807 control->dev.parent = &adev->pdev->dev;
1808 control->algo = &smu_v13_0_6_i2c_algo;
1809 snprintf(control->name, sizeof(control->name), "AMDGPU SMU %d", i);
1810 control->quirks = &smu_v13_0_6_i2c_control_quirks;
1811 i2c_set_adapdata(control, smu_i2c);
1812
1813 res = i2c_add_adapter(control);
1814 if (res) {
1815 DRM_ERROR("Failed to register hw i2c, err: %d\n", res);
1816 goto Out_err;
1817 }
1818 }
1819
1820 adev->pm.ras_eeprom_i2c_bus = &adev->pm.smu_i2c[0].adapter;
1821 adev->pm.fru_eeprom_i2c_bus = &adev->pm.smu_i2c[0].adapter;
1822
1823 return 0;
1824Out_err:
1825 for ( ; i >= 0; i--) {
1826 struct amdgpu_smu_i2c_bus *smu_i2c = &adev->pm.smu_i2c[i];
1827 struct i2c_adapter *control = &smu_i2c->adapter;
1828
1829 i2c_del_adapter(control);
1830 }
1831 return res;
1832}
1833
1834static void smu_v13_0_6_i2c_control_fini(struct smu_context *smu)
1835{
1836 struct amdgpu_device *adev = smu->adev;
1837 int i;
1838
1839 for (i = 0; i < MAX_SMU_I2C_BUSES; i++) {
1840 struct amdgpu_smu_i2c_bus *smu_i2c = &adev->pm.smu_i2c[i];
1841 struct i2c_adapter *control = &smu_i2c->adapter;
1842
1843 i2c_del_adapter(control);
1844 }
1845 adev->pm.ras_eeprom_i2c_bus = NULL;
1846 adev->pm.fru_eeprom_i2c_bus = NULL;
1847}
1848
1849static void smu_v13_0_6_get_unique_id(struct smu_context *smu)
1850{
1851 struct amdgpu_device *adev = smu->adev;
5e86aa29
YW
1852 struct smu_table_context *smu_table = &smu->smu_table;
1853 struct PPTable_t *pptable =
1854 (struct PPTable_t *)smu_table->driver_pptable;
511a9555 1855
5e86aa29 1856 adev->unique_id = pptable->PublicSerialNumber_AID;
511a9555
LL
1857 if (adev->serial[0] == '\0')
1858 sprintf(adev->serial, "%016llx", adev->unique_id);
1859}
1860
1861static bool smu_v13_0_6_is_baco_supported(struct smu_context *smu)
1862{
1863 /* smu_13_0_6 does not support baco */
1864
1865 return false;
1866}
1867
1868static int smu_v13_0_6_set_df_cstate(struct smu_context *smu,
1869 enum pp_df_cstate state)
1870{
1871 return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_DFCstateControl,
1872 state, NULL);
1873}
1874
1875static int smu_v13_0_6_allow_xgmi_power_down(struct smu_context *smu, bool en)
1876{
1877 return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GmiPwrDnControl,
1878 en ? 0 : 1, NULL);
1879}
1880
93682f8a
LL
1881static const char *const throttling_logging_label[] = {
1882 [THROTTLER_PROCHOT_BIT] = "Prochot",
1883 [THROTTLER_PPT_BIT] = "PPT",
1884 [THROTTLER_THERMAL_SOCKET_BIT] = "SOC",
1885 [THROTTLER_THERMAL_VR_BIT] = "VR",
1886 [THROTTLER_THERMAL_HBM_BIT] = "HBM"
511a9555 1887};
93682f8a 1888
511a9555
LL
1889static void smu_v13_0_6_log_thermal_throttling_event(struct smu_context *smu)
1890{
511a9555
LL
1891 int throttler_idx, throtting_events = 0, buf_idx = 0;
1892 struct amdgpu_device *adev = smu->adev;
1893 uint32_t throttler_status;
1894 char log_buf[256];
1895
93682f8a
LL
1896 throttler_status = smu_v13_0_6_get_throttler_status(smu);
1897 if (!throttler_status)
511a9555
LL
1898 return;
1899
1900 memset(log_buf, 0, sizeof(log_buf));
93682f8a
LL
1901 for (throttler_idx = 0;
1902 throttler_idx < ARRAY_SIZE(throttling_logging_label);
511a9555 1903 throttler_idx++) {
93682f8a 1904 if (throttler_status & (1U << throttler_idx)) {
511a9555 1905 throtting_events++;
93682f8a
LL
1906 buf_idx += snprintf(
1907 log_buf + buf_idx, sizeof(log_buf) - buf_idx,
1908 "%s%s", throtting_events > 1 ? " and " : "",
1909 throttling_logging_label[throttler_idx]);
511a9555
LL
1910 if (buf_idx >= sizeof(log_buf)) {
1911 dev_err(adev->dev, "buffer overflow!\n");
1912 log_buf[sizeof(log_buf) - 1] = '\0';
1913 break;
1914 }
1915 }
1916 }
1917
93682f8a
LL
1918 dev_warn(adev->dev,
1919 "WARN: GPU is throttled, expect performance decrease. %s.\n",
1920 log_buf);
511a9555
LL
1921 kgd2kfd_smi_event_throttle(
1922 smu->adev->kfd.dev,
1923 smu_cmn_get_indep_throttler_status(throttler_status,
1924 smu_v13_0_6_throttler_map));
1925}
1926
1718e973
LL
1927static int
1928smu_v13_0_6_get_current_pcie_link_width_level(struct smu_context *smu)
1929{
1930 struct amdgpu_device *adev = smu->adev;
1931
1932 return REG_GET_FIELD(RREG32_PCIE(smnPCIE_LC_LINK_WIDTH_CNTL),
1933 PCIE_LC_LINK_WIDTH_CNTL, LC_LINK_WIDTH_RD);
1934}
1935
511a9555
LL
1936static int smu_v13_0_6_get_current_pcie_link_speed(struct smu_context *smu)
1937{
1938 struct amdgpu_device *adev = smu->adev;
f1d1abd6 1939 uint32_t speed_level;
511a9555
LL
1940 uint32_t esm_ctrl;
1941
1942 /* TODO: confirm this on real target */
1943 esm_ctrl = RREG32_PCIE(smnPCIE_ESM_CTRL);
1944 if ((esm_ctrl >> 15) & 0x1FFFF)
1945 return (((esm_ctrl >> 8) & 0x3F) + 128);
1946
f1d1abd6
AK
1947 speed_level = (RREG32_PCIE(smnPCIE_LC_SPEED_CNTL) &
1948 PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK)
1949 >> PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
1950 if (speed_level > LINK_SPEED_MAX)
1951 speed_level = 0;
1952
1953 return pcie_gen_to_speed(speed_level + 1);
511a9555
LL
1954}
1955
1956static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table)
1957{
1958 struct smu_table_context *smu_table = &smu->smu_table;
1959 struct gpu_metrics_v1_3 *gpu_metrics =
1960 (struct gpu_metrics_v1_3 *)smu_table->gpu_metrics_table;
1718e973
LL
1961 struct amdgpu_device *adev = smu->adev;
1962 int ret = 0, inst0, xcc0;
511a9555 1963 MetricsTable_t *metrics;
1d02ae4e 1964 u16 link_width_level;
1718e973
LL
1965
1966 inst0 = adev->sdma.instance[0].aid_id;
1967 xcc0 = GET_INST(GC, 0);
511a9555
LL
1968
1969 metrics = kzalloc(sizeof(MetricsTable_t), GFP_KERNEL);
1970 ret = smu_v13_0_6_get_metrics_table(smu, metrics, true);
1971 if (ret)
1972 return ret;
1973
1974 smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 3);
1975
1718e973
LL
1976 gpu_metrics->temperature_hotspot =
1977 SMUQ10_TO_UINT(metrics->MaxSocketTemperature);
1978 /* Individual HBM stack temperature is not reported */
1979 gpu_metrics->temperature_mem =
1980 SMUQ10_TO_UINT(metrics->MaxHbmTemperature);
1981 /* Reports max temperature of all voltage rails */
1982 gpu_metrics->temperature_vrsoc =
1983 SMUQ10_TO_UINT(metrics->MaxVrTemperature);
1984
1985 gpu_metrics->average_gfx_activity =
1986 SMUQ10_TO_UINT(metrics->SocketGfxBusy);
1987 gpu_metrics->average_umc_activity =
1988 SMUQ10_TO_UINT(metrics->DramBandwidthUtilization);
1989
1990 gpu_metrics->average_socket_power =
1991 SMUQ10_TO_UINT(metrics->SocketPower);
3b885ab2
LL
1992 /* Energy counter reported in 15.259uJ (2^-16) units */
1993 gpu_metrics->energy_accumulator = metrics->SocketEnergyAcc;
1718e973
LL
1994
1995 gpu_metrics->current_gfxclk =
1996 SMUQ10_TO_UINT(metrics->GfxclkFrequency[xcc0]);
1997 gpu_metrics->current_socclk =
1998 SMUQ10_TO_UINT(metrics->SocclkFrequency[inst0]);
1999 gpu_metrics->current_uclk = SMUQ10_TO_UINT(metrics->UclkFrequency);
2000 gpu_metrics->current_vclk0 =
2001 SMUQ10_TO_UINT(metrics->VclkFrequency[inst0]);
2002 gpu_metrics->current_dclk0 =
2003 SMUQ10_TO_UINT(metrics->DclkFrequency[inst0]);
2004
2005 gpu_metrics->average_gfxclk_frequency = gpu_metrics->current_gfxclk;
2006 gpu_metrics->average_socclk_frequency = gpu_metrics->current_socclk;
2007 gpu_metrics->average_uclk_frequency = gpu_metrics->current_uclk;
2008 gpu_metrics->average_vclk0_frequency = gpu_metrics->current_vclk0;
2009 gpu_metrics->average_dclk0_frequency = gpu_metrics->current_dclk0;
2010
2011 /* Throttle status is not reported through metrics now */
511a9555 2012 gpu_metrics->throttle_status = 0;
511a9555 2013
1718e973 2014 if (!(adev->flags & AMD_IS_APU)) {
1d02ae4e
AK
2015 link_width_level = smu_v13_0_6_get_current_pcie_link_width_level(smu);
2016 if (link_width_level > MAX_LINK_WIDTH)
2017 link_width_level = 0;
2018
1718e973 2019 gpu_metrics->pcie_link_width =
1d02ae4e 2020 DECODE_LANE_WIDTH(link_width_level);
1718e973
LL
2021 gpu_metrics->pcie_link_speed =
2022 smu_v13_0_6_get_current_pcie_link_speed(smu);
2023 }
511a9555
LL
2024
2025 gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
2026
1718e973
LL
2027 gpu_metrics->gfx_activity_acc =
2028 SMUQ10_TO_UINT(metrics->SocketGfxBusyAcc);
2029 gpu_metrics->mem_activity_acc =
2030 SMUQ10_TO_UINT(metrics->DramBandwidthUtilizationAcc);
511a9555 2031
1718e973 2032 gpu_metrics->firmware_timestamp = metrics->Timestamp;
511a9555
LL
2033
2034 *table = (void *)gpu_metrics;
2035 kfree(metrics);
2036
2037 return sizeof(struct gpu_metrics_v1_3);
2038}
2039
2040static int smu_v13_0_6_mode2_reset(struct smu_context *smu)
2041{
511a9555
LL
2042 int ret = 0, index;
2043 struct amdgpu_device *adev = smu->adev;
2044 int timeout = 10;
2045
511a9555
LL
2046 index = smu_cmn_to_asic_specific_index(smu, CMN2ASIC_MAPPING_MSG,
2047 SMU_MSG_GfxDeviceDriverReset);
2048
2049 mutex_lock(&smu->message_lock);
8f2ccaaa 2050
511a9555
LL
2051 ret = smu_cmn_send_msg_without_waiting(smu, (uint16_t)index,
2052 SMU_RESET_MODE_2);
8f2ccaaa 2053
511a9555
LL
2054 /* This is similar to FLR, wait till max FLR timeout */
2055 msleep(100);
8f2ccaaa 2056
511a9555
LL
2057 dev_dbg(smu->adev->dev, "restore config space...\n");
2058 /* Restore the config space saved during init */
2059 amdgpu_device_load_pci_state(adev->pdev);
2060
2061 dev_dbg(smu->adev->dev, "wait for reset ack\n");
8f2ccaaa 2062 do {
511a9555
LL
2063 ret = smu_cmn_wait_for_response(smu);
2064 /* Wait a bit more time for getting ACK */
2065 if (ret == -ETIME) {
2066 --timeout;
2067 usleep_range(500, 1000);
2068 continue;
2069 }
2070
8f2ccaaa 2071 if (ret) {
511a9555 2072 dev_err(adev->dev,
8f2ccaaa 2073 "failed to send mode2 message \tparam: 0x%08x error code %d\n",
511a9555
LL
2074 SMU_RESET_MODE_2, ret);
2075 goto out;
2076 }
8f2ccaaa 2077 } while (ret == -ETIME && timeout);
511a9555 2078
511a9555
LL
2079out:
2080 mutex_unlock(&smu->message_lock);
2081
2082 return ret;
2083}
2084
1836bb0a
AK
2085static int smu_v13_0_6_get_thermal_temperature_range(struct smu_context *smu,
2086 struct smu_temperature_range *range)
2087{
2088 struct amdgpu_device *adev = smu->adev;
e1c0d2e7 2089 u32 aid_temp, xcd_temp, mem_temp;
1836bb0a
AK
2090 uint32_t smu_version;
2091 u32 ccd_temp = 0;
2092 int ret;
2093
2094 if (amdgpu_sriov_vf(smu->adev))
2095 return 0;
2096
2097 if (!range)
2098 return -EINVAL;
2099
2100 /*Check smu version, GetCtfLimit message only supported for smu version 85.69 or higher */
2101 smu_cmn_get_smc_version(smu, NULL, &smu_version);
2102 if (smu_version < 0x554500)
2103 return 0;
2104
2105 ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
2106 PPSMC_AID_THM_TYPE, &aid_temp);
2107 if (ret)
2108 goto failed;
2109
2110 if (adev->flags & AMD_IS_APU) {
2111 ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
2112 PPSMC_CCD_THM_TYPE, &ccd_temp);
2113 if (ret)
2114 goto failed;
2115 }
2116
2117 ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
2118 PPSMC_XCD_THM_TYPE, &xcd_temp);
2119 if (ret)
2120 goto failed;
2121
e1c0d2e7
AK
2122 range->hotspot_crit_max = max3(aid_temp, xcd_temp, ccd_temp) *
2123 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
1836bb0a 2124 ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
e1c0d2e7 2125 PPSMC_HBM_THM_TYPE, &mem_temp);
1836bb0a
AK
2126 if (ret)
2127 goto failed;
2128
e1c0d2e7 2129 range->mem_crit_max = mem_temp * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
1836bb0a
AK
2130failed:
2131 return ret;
2132}
2133
511a9555
LL
2134static int smu_v13_0_6_mode1_reset(struct smu_context *smu)
2135{
2136 struct amdgpu_device *adev = smu->adev;
2137 struct amdgpu_ras *ras;
2138 u32 fatal_err, param;
2139 int ret = 0;
2140
2141 ras = amdgpu_ras_get_context(adev);
2142 fatal_err = 0;
2143 param = SMU_RESET_MODE_1;
2144
2145 /* fatal error triggered by ras, PMFW supports the flag */
2146 if (ras && atomic_read(&ras->in_recovery))
2147 fatal_err = 1;
2148
2149 param |= (fatal_err << 16);
2150 ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GfxDeviceDriverReset,
2151 param, NULL);
2152
2153 if (!ret)
2154 msleep(SMU13_MODE1_RESET_WAIT_TIME_IN_MS);
2155
2156 return ret;
2157}
2158
2159static bool smu_v13_0_6_is_mode1_reset_supported(struct smu_context *smu)
2160{
05347402 2161 return true;
511a9555
LL
2162}
2163
2164static bool smu_v13_0_6_is_mode2_reset_supported(struct smu_context *smu)
2165{
2166 return true;
2167}
2168
2169static int smu_v13_0_6_smu_send_hbm_bad_page_num(struct smu_context *smu,
2170 uint32_t size)
2171{
2172 int ret = 0;
2173
2174 /* message SMU to update the bad page number on SMUBUS */
2175 ret = smu_cmn_send_smc_msg_with_param(
2176 smu, SMU_MSG_SetNumBadHbmPagesRetired, size, NULL);
2177 if (ret)
2178 dev_err(smu->adev->dev,
2179 "[%s] failed to message SMU to update HBM bad pages number\n",
2180 __func__);
2181
2182 return ret;
2183}
2184
2185static const struct pptable_funcs smu_v13_0_6_ppt_funcs = {
2186 /* init dpm */
2187 .get_allowed_feature_mask = smu_v13_0_6_get_allowed_feature_mask,
2188 /* dpm/clk tables */
2189 .set_default_dpm_table = smu_v13_0_6_set_default_dpm_table,
2190 .populate_umd_state_clk = smu_v13_0_6_populate_umd_state_clk,
511a9555
LL
2191 .print_clk_levels = smu_v13_0_6_print_clk_levels,
2192 .force_clk_levels = smu_v13_0_6_force_clk_levels,
2193 .read_sensor = smu_v13_0_6_read_sensor,
2194 .set_performance_level = smu_v13_0_6_set_performance_level,
2195 .get_power_limit = smu_v13_0_6_get_power_limit,
2196 .is_dpm_running = smu_v13_0_6_is_dpm_running,
2197 .get_unique_id = smu_v13_0_6_get_unique_id,
2198 .init_smc_tables = smu_v13_0_6_init_smc_tables,
2199 .fini_smc_tables = smu_v13_0_fini_smc_tables,
2200 .init_power = smu_v13_0_init_power,
2201 .fini_power = smu_v13_0_fini_power,
2202 .check_fw_status = smu_v13_0_6_check_fw_status,
2203 /* pptable related */
2204 .check_fw_version = smu_v13_0_check_fw_version,
2205 .set_driver_table_location = smu_v13_0_set_driver_table_location,
2206 .set_tool_table_location = smu_v13_0_set_tool_table_location,
2207 .notify_memory_pool_location = smu_v13_0_notify_memory_pool_location,
2208 .system_features_control = smu_v13_0_6_system_features_control,
2209 .send_smc_msg_with_param = smu_cmn_send_smc_msg_with_param,
2210 .send_smc_msg = smu_cmn_send_smc_msg,
2211 .get_enabled_mask = smu_v13_0_6_get_enabled_mask,
2212 .feature_is_enabled = smu_cmn_feature_is_enabled,
2213 .set_power_limit = smu_v13_0_6_set_power_limit,
2214 .set_xgmi_pstate = smu_v13_0_set_xgmi_pstate,
676915e4 2215 .register_irq_handler = smu_v13_0_6_register_irq_handler,
511a9555
LL
2216 .enable_thermal_alert = smu_v13_0_enable_thermal_alert,
2217 .disable_thermal_alert = smu_v13_0_disable_thermal_alert,
511a9555
LL
2218 .setup_pptable = smu_v13_0_6_setup_pptable,
2219 .baco_is_support = smu_v13_0_6_is_baco_supported,
2220 .get_dpm_ultimate_freq = smu_v13_0_6_get_dpm_ultimate_freq,
2221 .set_soft_freq_limited_range = smu_v13_0_6_set_soft_freq_limited_range,
2222 .od_edit_dpm_table = smu_v13_0_6_usr_edit_dpm_table,
2223 .set_df_cstate = smu_v13_0_6_set_df_cstate,
2224 .allow_xgmi_power_down = smu_v13_0_6_allow_xgmi_power_down,
2225 .log_thermal_throttling_event = smu_v13_0_6_log_thermal_throttling_event,
2226 .get_pp_feature_mask = smu_cmn_get_pp_feature_mask,
2227 .set_pp_feature_mask = smu_cmn_set_pp_feature_mask,
2228 .get_gpu_metrics = smu_v13_0_6_get_gpu_metrics,
1836bb0a 2229 .get_thermal_temperature_range = smu_v13_0_6_get_thermal_temperature_range,
511a9555
LL
2230 .mode1_reset_is_support = smu_v13_0_6_is_mode1_reset_supported,
2231 .mode2_reset_is_support = smu_v13_0_6_is_mode2_reset_supported,
2232 .mode1_reset = smu_v13_0_6_mode1_reset,
2233 .mode2_reset = smu_v13_0_6_mode2_reset,
2234 .wait_for_event = smu_v13_0_wait_for_event,
2235 .i2c_init = smu_v13_0_6_i2c_control_init,
2236 .i2c_fini = smu_v13_0_6_i2c_control_fini,
2237 .send_hbm_bad_pages_num = smu_v13_0_6_smu_send_hbm_bad_page_num,
2238};
2239
2240void smu_v13_0_6_set_ppt_funcs(struct smu_context *smu)
2241{
2242 smu->ppt_funcs = &smu_v13_0_6_ppt_funcs;
2243 smu->message_map = smu_v13_0_6_message_map;
2244 smu->clock_map = smu_v13_0_6_clk_map;
2245 smu->feature_map = smu_v13_0_6_feature_mask_map;
2246 smu->table_map = smu_v13_0_6_table_map;
9661bf68 2247 smu->smc_driver_if_version = SMU13_0_6_DRIVER_IF_VERSION;
511a9555
LL
2248 smu_v13_0_set_smu_mailbox_registers(smu);
2249}