cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vega20_processpptables.c (40619B)


      1/*
      2 * Copyright 2018 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#include <linux/module.h>
     24#include <linux/slab.h>
     25#include <linux/fb.h>
     26
     27#include "smu11_driver_if.h"
     28#include "vega20_processpptables.h"
     29#include "ppatomfwctrl.h"
     30#include "atomfirmware.h"
     31#include "pp_debug.h"
     32#include "cgs_common.h"
     33#include "vega20_pptable.h"
     34
     35#define VEGA20_FAN_TARGET_TEMPERATURE_OVERRIDE 105
     36
     37static void set_hw_cap(struct pp_hwmgr *hwmgr, bool enable,
     38		enum phm_platform_caps cap)
     39{
     40	if (enable)
     41		phm_cap_set(hwmgr->platform_descriptor.platformCaps, cap);
     42	else
     43		phm_cap_unset(hwmgr->platform_descriptor.platformCaps, cap);
     44}
     45
     46static const void *get_powerplay_table(struct pp_hwmgr *hwmgr)
     47{
     48	int index = GetIndexIntoMasterDataTable(powerplayinfo);
     49
     50	u16 size;
     51	u8 frev, crev;
     52	const void *table_address = hwmgr->soft_pp_table;
     53
     54	if (!table_address) {
     55		table_address = (ATOM_Vega20_POWERPLAYTABLE *)
     56				smu_atom_get_data_table(hwmgr->adev, index,
     57						&size, &frev, &crev);
     58
     59		hwmgr->soft_pp_table = table_address;
     60		hwmgr->soft_pp_table_size = size;
     61	}
     62
     63	return table_address;
     64}
     65
     66#if 0
     67static void dump_pptable(PPTable_t *pptable)
     68{
     69	int i;
     70
     71	pr_info("Version = 0x%08x\n", pptable->Version);
     72
     73	pr_info("FeaturesToRun[0] = 0x%08x\n", pptable->FeaturesToRun[0]);
     74	pr_info("FeaturesToRun[1] = 0x%08x\n", pptable->FeaturesToRun[1]);
     75
     76	pr_info("SocketPowerLimitAc0 = %d\n", pptable->SocketPowerLimitAc0);
     77	pr_info("SocketPowerLimitAc0Tau = %d\n", pptable->SocketPowerLimitAc0Tau);
     78	pr_info("SocketPowerLimitAc1 = %d\n", pptable->SocketPowerLimitAc1);
     79	pr_info("SocketPowerLimitAc1Tau = %d\n", pptable->SocketPowerLimitAc1Tau);
     80	pr_info("SocketPowerLimitAc2 = %d\n", pptable->SocketPowerLimitAc2);
     81	pr_info("SocketPowerLimitAc2Tau = %d\n", pptable->SocketPowerLimitAc2Tau);
     82	pr_info("SocketPowerLimitAc3 = %d\n", pptable->SocketPowerLimitAc3);
     83	pr_info("SocketPowerLimitAc3Tau = %d\n", pptable->SocketPowerLimitAc3Tau);
     84	pr_info("SocketPowerLimitDc = %d\n", pptable->SocketPowerLimitDc);
     85	pr_info("SocketPowerLimitDcTau = %d\n", pptable->SocketPowerLimitDcTau);
     86	pr_info("TdcLimitSoc = %d\n", pptable->TdcLimitSoc);
     87	pr_info("TdcLimitSocTau = %d\n", pptable->TdcLimitSocTau);
     88	pr_info("TdcLimitGfx = %d\n", pptable->TdcLimitGfx);
     89	pr_info("TdcLimitGfxTau = %d\n", pptable->TdcLimitGfxTau);
     90
     91	pr_info("TedgeLimit = %d\n", pptable->TedgeLimit);
     92	pr_info("ThotspotLimit = %d\n", pptable->ThotspotLimit);
     93	pr_info("ThbmLimit = %d\n", pptable->ThbmLimit);
     94	pr_info("Tvr_gfxLimit = %d\n", pptable->Tvr_gfxLimit);
     95	pr_info("Tvr_memLimit = %d\n", pptable->Tvr_memLimit);
     96	pr_info("Tliquid1Limit = %d\n", pptable->Tliquid1Limit);
     97	pr_info("Tliquid2Limit = %d\n", pptable->Tliquid2Limit);
     98	pr_info("TplxLimit = %d\n", pptable->TplxLimit);
     99	pr_info("FitLimit = %d\n", pptable->FitLimit);
    100
    101	pr_info("PpmPowerLimit = %d\n", pptable->PpmPowerLimit);
    102	pr_info("PpmTemperatureThreshold = %d\n", pptable->PpmTemperatureThreshold);
    103
    104	pr_info("MemoryOnPackage = 0x%02x\n", pptable->MemoryOnPackage);
    105	pr_info("padding8_limits = 0x%02x\n", pptable->padding8_limits);
    106	pr_info("Tvr_SocLimit = %d\n", pptable->Tvr_SocLimit);
    107
    108	pr_info("UlvVoltageOffsetSoc = %d\n", pptable->UlvVoltageOffsetSoc);
    109	pr_info("UlvVoltageOffsetGfx = %d\n", pptable->UlvVoltageOffsetGfx);
    110
    111	pr_info("UlvSmnclkDid = %d\n", pptable->UlvSmnclkDid);
    112	pr_info("UlvMp1clkDid = %d\n", pptable->UlvMp1clkDid);
    113	pr_info("UlvGfxclkBypass = %d\n", pptable->UlvGfxclkBypass);
    114	pr_info("Padding234 = 0x%02x\n", pptable->Padding234);
    115
    116	pr_info("MinVoltageGfx = %d\n", pptable->MinVoltageGfx);
    117	pr_info("MinVoltageSoc = %d\n", pptable->MinVoltageSoc);
    118	pr_info("MaxVoltageGfx = %d\n", pptable->MaxVoltageGfx);
    119	pr_info("MaxVoltageSoc = %d\n", pptable->MaxVoltageSoc);
    120
    121	pr_info("LoadLineResistanceGfx = %d\n", pptable->LoadLineResistanceGfx);
    122	pr_info("LoadLineResistanceSoc = %d\n", pptable->LoadLineResistanceSoc);
    123
    124	pr_info("[PPCLK_GFXCLK]\n"
    125			"  .VoltageMode          = 0x%02x\n"
    126			"  .SnapToDiscrete       = 0x%02x\n"
    127			"  .NumDiscreteLevels    = 0x%02x\n"
    128			"  .padding              = 0x%02x\n"
    129			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    130			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    131			pptable->DpmDescriptor[PPCLK_GFXCLK].VoltageMode,
    132			pptable->DpmDescriptor[PPCLK_GFXCLK].SnapToDiscrete,
    133			pptable->DpmDescriptor[PPCLK_GFXCLK].NumDiscreteLevels,
    134			pptable->DpmDescriptor[PPCLK_GFXCLK].padding,
    135			pptable->DpmDescriptor[PPCLK_GFXCLK].ConversionToAvfsClk.m,
    136			pptable->DpmDescriptor[PPCLK_GFXCLK].ConversionToAvfsClk.b,
    137			pptable->DpmDescriptor[PPCLK_GFXCLK].SsCurve.a,
    138			pptable->DpmDescriptor[PPCLK_GFXCLK].SsCurve.b,
    139			pptable->DpmDescriptor[PPCLK_GFXCLK].SsCurve.c);
    140
    141	pr_info("[PPCLK_VCLK]\n"
    142			"  .VoltageMode          = 0x%02x\n"
    143			"  .SnapToDiscrete       = 0x%02x\n"
    144			"  .NumDiscreteLevels    = 0x%02x\n"
    145			"  .padding              = 0x%02x\n"
    146			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    147			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    148			pptable->DpmDescriptor[PPCLK_VCLK].VoltageMode,
    149			pptable->DpmDescriptor[PPCLK_VCLK].SnapToDiscrete,
    150			pptable->DpmDescriptor[PPCLK_VCLK].NumDiscreteLevels,
    151			pptable->DpmDescriptor[PPCLK_VCLK].padding,
    152			pptable->DpmDescriptor[PPCLK_VCLK].ConversionToAvfsClk.m,
    153			pptable->DpmDescriptor[PPCLK_VCLK].ConversionToAvfsClk.b,
    154			pptable->DpmDescriptor[PPCLK_VCLK].SsCurve.a,
    155			pptable->DpmDescriptor[PPCLK_VCLK].SsCurve.b,
    156			pptable->DpmDescriptor[PPCLK_VCLK].SsCurve.c);
    157
    158	pr_info("[PPCLK_DCLK]\n"
    159			"  .VoltageMode          = 0x%02x\n"
    160			"  .SnapToDiscrete       = 0x%02x\n"
    161			"  .NumDiscreteLevels    = 0x%02x\n"
    162			"  .padding              = 0x%02x\n"
    163			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    164			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    165			pptable->DpmDescriptor[PPCLK_DCLK].VoltageMode,
    166			pptable->DpmDescriptor[PPCLK_DCLK].SnapToDiscrete,
    167			pptable->DpmDescriptor[PPCLK_DCLK].NumDiscreteLevels,
    168			pptable->DpmDescriptor[PPCLK_DCLK].padding,
    169			pptable->DpmDescriptor[PPCLK_DCLK].ConversionToAvfsClk.m,
    170			pptable->DpmDescriptor[PPCLK_DCLK].ConversionToAvfsClk.b,
    171			pptable->DpmDescriptor[PPCLK_DCLK].SsCurve.a,
    172			pptable->DpmDescriptor[PPCLK_DCLK].SsCurve.b,
    173			pptable->DpmDescriptor[PPCLK_DCLK].SsCurve.c);
    174
    175	pr_info("[PPCLK_ECLK]\n"
    176			"  .VoltageMode          = 0x%02x\n"
    177			"  .SnapToDiscrete       = 0x%02x\n"
    178			"  .NumDiscreteLevels    = 0x%02x\n"
    179			"  .padding              = 0x%02x\n"
    180			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    181			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    182			pptable->DpmDescriptor[PPCLK_ECLK].VoltageMode,
    183			pptable->DpmDescriptor[PPCLK_ECLK].SnapToDiscrete,
    184			pptable->DpmDescriptor[PPCLK_ECLK].NumDiscreteLevels,
    185			pptable->DpmDescriptor[PPCLK_ECLK].padding,
    186			pptable->DpmDescriptor[PPCLK_ECLK].ConversionToAvfsClk.m,
    187			pptable->DpmDescriptor[PPCLK_ECLK].ConversionToAvfsClk.b,
    188			pptable->DpmDescriptor[PPCLK_ECLK].SsCurve.a,
    189			pptable->DpmDescriptor[PPCLK_ECLK].SsCurve.b,
    190			pptable->DpmDescriptor[PPCLK_ECLK].SsCurve.c);
    191
    192	pr_info("[PPCLK_SOCCLK]\n"
    193			"  .VoltageMode          = 0x%02x\n"
    194			"  .SnapToDiscrete       = 0x%02x\n"
    195			"  .NumDiscreteLevels    = 0x%02x\n"
    196			"  .padding              = 0x%02x\n"
    197			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    198			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    199			pptable->DpmDescriptor[PPCLK_SOCCLK].VoltageMode,
    200			pptable->DpmDescriptor[PPCLK_SOCCLK].SnapToDiscrete,
    201			pptable->DpmDescriptor[PPCLK_SOCCLK].NumDiscreteLevels,
    202			pptable->DpmDescriptor[PPCLK_SOCCLK].padding,
    203			pptable->DpmDescriptor[PPCLK_SOCCLK].ConversionToAvfsClk.m,
    204			pptable->DpmDescriptor[PPCLK_SOCCLK].ConversionToAvfsClk.b,
    205			pptable->DpmDescriptor[PPCLK_SOCCLK].SsCurve.a,
    206			pptable->DpmDescriptor[PPCLK_SOCCLK].SsCurve.b,
    207			pptable->DpmDescriptor[PPCLK_SOCCLK].SsCurve.c);
    208
    209	pr_info("[PPCLK_UCLK]\n"
    210			"  .VoltageMode          = 0x%02x\n"
    211			"  .SnapToDiscrete       = 0x%02x\n"
    212			"  .NumDiscreteLevels    = 0x%02x\n"
    213			"  .padding              = 0x%02x\n"
    214			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    215			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    216			pptable->DpmDescriptor[PPCLK_UCLK].VoltageMode,
    217			pptable->DpmDescriptor[PPCLK_UCLK].SnapToDiscrete,
    218			pptable->DpmDescriptor[PPCLK_UCLK].NumDiscreteLevels,
    219			pptable->DpmDescriptor[PPCLK_UCLK].padding,
    220			pptable->DpmDescriptor[PPCLK_UCLK].ConversionToAvfsClk.m,
    221			pptable->DpmDescriptor[PPCLK_UCLK].ConversionToAvfsClk.b,
    222			pptable->DpmDescriptor[PPCLK_UCLK].SsCurve.a,
    223			pptable->DpmDescriptor[PPCLK_UCLK].SsCurve.b,
    224			pptable->DpmDescriptor[PPCLK_UCLK].SsCurve.c);
    225
    226	pr_info("[PPCLK_DCEFCLK]\n"
    227			"  .VoltageMode          = 0x%02x\n"
    228			"  .SnapToDiscrete       = 0x%02x\n"
    229			"  .NumDiscreteLevels    = 0x%02x\n"
    230			"  .padding              = 0x%02x\n"
    231			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    232			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    233			pptable->DpmDescriptor[PPCLK_DCEFCLK].VoltageMode,
    234			pptable->DpmDescriptor[PPCLK_DCEFCLK].SnapToDiscrete,
    235			pptable->DpmDescriptor[PPCLK_DCEFCLK].NumDiscreteLevels,
    236			pptable->DpmDescriptor[PPCLK_DCEFCLK].padding,
    237			pptable->DpmDescriptor[PPCLK_DCEFCLK].ConversionToAvfsClk.m,
    238			pptable->DpmDescriptor[PPCLK_DCEFCLK].ConversionToAvfsClk.b,
    239			pptable->DpmDescriptor[PPCLK_DCEFCLK].SsCurve.a,
    240			pptable->DpmDescriptor[PPCLK_DCEFCLK].SsCurve.b,
    241			pptable->DpmDescriptor[PPCLK_DCEFCLK].SsCurve.c);
    242
    243	pr_info("[PPCLK_DISPCLK]\n"
    244			"  .VoltageMode          = 0x%02x\n"
    245			"  .SnapToDiscrete       = 0x%02x\n"
    246			"  .NumDiscreteLevels    = 0x%02x\n"
    247			"  .padding              = 0x%02x\n"
    248			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    249			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    250			pptable->DpmDescriptor[PPCLK_DISPCLK].VoltageMode,
    251			pptable->DpmDescriptor[PPCLK_DISPCLK].SnapToDiscrete,
    252			pptable->DpmDescriptor[PPCLK_DISPCLK].NumDiscreteLevels,
    253			pptable->DpmDescriptor[PPCLK_DISPCLK].padding,
    254			pptable->DpmDescriptor[PPCLK_DISPCLK].ConversionToAvfsClk.m,
    255			pptable->DpmDescriptor[PPCLK_DISPCLK].ConversionToAvfsClk.b,
    256			pptable->DpmDescriptor[PPCLK_DISPCLK].SsCurve.a,
    257			pptable->DpmDescriptor[PPCLK_DISPCLK].SsCurve.b,
    258			pptable->DpmDescriptor[PPCLK_DISPCLK].SsCurve.c);
    259
    260	pr_info("[PPCLK_PIXCLK]\n"
    261			"  .VoltageMode          = 0x%02x\n"
    262			"  .SnapToDiscrete       = 0x%02x\n"
    263			"  .NumDiscreteLevels    = 0x%02x\n"
    264			"  .padding              = 0x%02x\n"
    265			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    266			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    267			pptable->DpmDescriptor[PPCLK_PIXCLK].VoltageMode,
    268			pptable->DpmDescriptor[PPCLK_PIXCLK].SnapToDiscrete,
    269			pptable->DpmDescriptor[PPCLK_PIXCLK].NumDiscreteLevels,
    270			pptable->DpmDescriptor[PPCLK_PIXCLK].padding,
    271			pptable->DpmDescriptor[PPCLK_PIXCLK].ConversionToAvfsClk.m,
    272			pptable->DpmDescriptor[PPCLK_PIXCLK].ConversionToAvfsClk.b,
    273			pptable->DpmDescriptor[PPCLK_PIXCLK].SsCurve.a,
    274			pptable->DpmDescriptor[PPCLK_PIXCLK].SsCurve.b,
    275			pptable->DpmDescriptor[PPCLK_PIXCLK].SsCurve.c);
    276
    277	pr_info("[PPCLK_PHYCLK]\n"
    278			"  .VoltageMode          = 0x%02x\n"
    279			"  .SnapToDiscrete       = 0x%02x\n"
    280			"  .NumDiscreteLevels    = 0x%02x\n"
    281			"  .padding              = 0x%02x\n"
    282			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    283			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    284			pptable->DpmDescriptor[PPCLK_PHYCLK].VoltageMode,
    285			pptable->DpmDescriptor[PPCLK_PHYCLK].SnapToDiscrete,
    286			pptable->DpmDescriptor[PPCLK_PHYCLK].NumDiscreteLevels,
    287			pptable->DpmDescriptor[PPCLK_PHYCLK].padding,
    288			pptable->DpmDescriptor[PPCLK_PHYCLK].ConversionToAvfsClk.m,
    289			pptable->DpmDescriptor[PPCLK_PHYCLK].ConversionToAvfsClk.b,
    290			pptable->DpmDescriptor[PPCLK_PHYCLK].SsCurve.a,
    291			pptable->DpmDescriptor[PPCLK_PHYCLK].SsCurve.b,
    292			pptable->DpmDescriptor[PPCLK_PHYCLK].SsCurve.c);
    293
    294	pr_info("[PPCLK_FCLK]\n"
    295			"  .VoltageMode          = 0x%02x\n"
    296			"  .SnapToDiscrete       = 0x%02x\n"
    297			"  .NumDiscreteLevels    = 0x%02x\n"
    298			"  .padding              = 0x%02x\n"
    299			"  .ConversionToAvfsClk{m = 0x%08x b = 0x%08x}\n"
    300			"  .SsCurve            {a = 0x%08x b = 0x%08x c = 0x%08x}\n",
    301			pptable->DpmDescriptor[PPCLK_FCLK].VoltageMode,
    302			pptable->DpmDescriptor[PPCLK_FCLK].SnapToDiscrete,
    303			pptable->DpmDescriptor[PPCLK_FCLK].NumDiscreteLevels,
    304			pptable->DpmDescriptor[PPCLK_FCLK].padding,
    305			pptable->DpmDescriptor[PPCLK_FCLK].ConversionToAvfsClk.m,
    306			pptable->DpmDescriptor[PPCLK_FCLK].ConversionToAvfsClk.b,
    307			pptable->DpmDescriptor[PPCLK_FCLK].SsCurve.a,
    308			pptable->DpmDescriptor[PPCLK_FCLK].SsCurve.b,
    309			pptable->DpmDescriptor[PPCLK_FCLK].SsCurve.c);
    310
    311
    312	pr_info("FreqTableGfx\n");
    313	for (i = 0; i < NUM_GFXCLK_DPM_LEVELS; i++)
    314		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableGfx[i]);
    315
    316	pr_info("FreqTableVclk\n");
    317	for (i = 0; i < NUM_VCLK_DPM_LEVELS; i++)
    318		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableVclk[i]);
    319
    320	pr_info("FreqTableDclk\n");
    321	for (i = 0; i < NUM_DCLK_DPM_LEVELS; i++)
    322		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableDclk[i]);
    323
    324	pr_info("FreqTableEclk\n");
    325	for (i = 0; i < NUM_ECLK_DPM_LEVELS; i++)
    326		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableEclk[i]);
    327
    328	pr_info("FreqTableSocclk\n");
    329	for (i = 0; i < NUM_SOCCLK_DPM_LEVELS; i++)
    330		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableSocclk[i]);
    331
    332	pr_info("FreqTableUclk\n");
    333	for (i = 0; i < NUM_UCLK_DPM_LEVELS; i++)
    334		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableUclk[i]);
    335
    336	pr_info("FreqTableFclk\n");
    337	for (i = 0; i < NUM_FCLK_DPM_LEVELS; i++)
    338		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableFclk[i]);
    339
    340	pr_info("FreqTableDcefclk\n");
    341	for (i = 0; i < NUM_DCEFCLK_DPM_LEVELS; i++)
    342		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableDcefclk[i]);
    343
    344	pr_info("FreqTableDispclk\n");
    345	for (i = 0; i < NUM_DISPCLK_DPM_LEVELS; i++)
    346		pr_info("  .[%02d] = %d\n", i, pptable->FreqTableDispclk[i]);
    347
    348	pr_info("FreqTablePixclk\n");
    349	for (i = 0; i < NUM_PIXCLK_DPM_LEVELS; i++)
    350		pr_info("  .[%02d] = %d\n", i, pptable->FreqTablePixclk[i]);
    351
    352	pr_info("FreqTablePhyclk\n");
    353	for (i = 0; i < NUM_PHYCLK_DPM_LEVELS; i++)
    354		pr_info("  .[%02d] = %d\n", i, pptable->FreqTablePhyclk[i]);
    355
    356	pr_info("DcModeMaxFreq[PPCLK_GFXCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_GFXCLK]);
    357	pr_info("DcModeMaxFreq[PPCLK_VCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_VCLK]);
    358	pr_info("DcModeMaxFreq[PPCLK_DCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_DCLK]);
    359	pr_info("DcModeMaxFreq[PPCLK_ECLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_ECLK]);
    360	pr_info("DcModeMaxFreq[PPCLK_SOCCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_SOCCLK]);
    361	pr_info("DcModeMaxFreq[PPCLK_UCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_UCLK]);
    362	pr_info("DcModeMaxFreq[PPCLK_DCEFCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_DCEFCLK]);
    363	pr_info("DcModeMaxFreq[PPCLK_DISPCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_DISPCLK]);
    364	pr_info("DcModeMaxFreq[PPCLK_PIXCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_PIXCLK]);
    365	pr_info("DcModeMaxFreq[PPCLK_PHYCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_PHYCLK]);
    366	pr_info("DcModeMaxFreq[PPCLK_FCLK] = %d\n", pptable->DcModeMaxFreq[PPCLK_FCLK]);
    367	pr_info("Padding8_Clks = %d\n", pptable->Padding8_Clks);
    368
    369	pr_info("Mp0clkFreq\n");
    370	for (i = 0; i < NUM_MP0CLK_DPM_LEVELS; i++)
    371		pr_info("  .[%d] = %d\n", i, pptable->Mp0clkFreq[i]);
    372
    373	pr_info("Mp0DpmVoltage\n");
    374	for (i = 0; i < NUM_MP0CLK_DPM_LEVELS; i++)
    375		pr_info("  .[%d] = %d\n", i, pptable->Mp0DpmVoltage[i]);
    376
    377	pr_info("GfxclkFidle = 0x%x\n", pptable->GfxclkFidle);
    378	pr_info("GfxclkSlewRate = 0x%x\n", pptable->GfxclkSlewRate);
    379	pr_info("CksEnableFreq = 0x%x\n", pptable->CksEnableFreq);
    380	pr_info("Padding789 = 0x%x\n", pptable->Padding789);
    381	pr_info("CksVoltageOffset[a = 0x%08x b = 0x%08x c = 0x%08x]\n",
    382			pptable->CksVoltageOffset.a,
    383			pptable->CksVoltageOffset.b,
    384			pptable->CksVoltageOffset.c);
    385	pr_info("Padding567[0] = 0x%x\n", pptable->Padding567[0]);
    386	pr_info("Padding567[1] = 0x%x\n", pptable->Padding567[1]);
    387	pr_info("Padding567[2] = 0x%x\n", pptable->Padding567[2]);
    388	pr_info("Padding567[3] = 0x%x\n", pptable->Padding567[3]);
    389	pr_info("GfxclkDsMaxFreq = %d\n", pptable->GfxclkDsMaxFreq);
    390	pr_info("GfxclkSource = 0x%x\n", pptable->GfxclkSource);
    391	pr_info("Padding456 = 0x%x\n", pptable->Padding456);
    392
    393	pr_info("LowestUclkReservedForUlv = %d\n", pptable->LowestUclkReservedForUlv);
    394	pr_info("Padding8_Uclk[0] = 0x%x\n", pptable->Padding8_Uclk[0]);
    395	pr_info("Padding8_Uclk[1] = 0x%x\n", pptable->Padding8_Uclk[1]);
    396	pr_info("Padding8_Uclk[2] = 0x%x\n", pptable->Padding8_Uclk[2]);
    397
    398	pr_info("PcieGenSpeed\n");
    399	for (i = 0; i < NUM_LINK_LEVELS; i++)
    400		pr_info("  .[%d] = %d\n", i, pptable->PcieGenSpeed[i]);
    401
    402	pr_info("PcieLaneCount\n");
    403	for (i = 0; i < NUM_LINK_LEVELS; i++)
    404		pr_info("  .[%d] = %d\n", i, pptable->PcieLaneCount[i]);
    405
    406	pr_info("LclkFreq\n");
    407	for (i = 0; i < NUM_LINK_LEVELS; i++)
    408		pr_info("  .[%d] = %d\n", i, pptable->LclkFreq[i]);
    409
    410	pr_info("EnableTdpm = %d\n", pptable->EnableTdpm);
    411	pr_info("TdpmHighHystTemperature = %d\n", pptable->TdpmHighHystTemperature);
    412	pr_info("TdpmLowHystTemperature = %d\n", pptable->TdpmLowHystTemperature);
    413	pr_info("GfxclkFreqHighTempLimit = %d\n", pptable->GfxclkFreqHighTempLimit);
    414
    415	pr_info("FanStopTemp = %d\n", pptable->FanStopTemp);
    416	pr_info("FanStartTemp = %d\n", pptable->FanStartTemp);
    417
    418	pr_info("FanGainEdge = %d\n", pptable->FanGainEdge);
    419	pr_info("FanGainHotspot = %d\n", pptable->FanGainHotspot);
    420	pr_info("FanGainLiquid = %d\n", pptable->FanGainLiquid);
    421	pr_info("FanGainVrGfx = %d\n", pptable->FanGainVrGfx);
    422	pr_info("FanGainVrSoc = %d\n", pptable->FanGainVrSoc);
    423	pr_info("FanGainPlx = %d\n", pptable->FanGainPlx);
    424	pr_info("FanGainHbm = %d\n", pptable->FanGainHbm);
    425	pr_info("FanPwmMin = %d\n", pptable->FanPwmMin);
    426	pr_info("FanAcousticLimitRpm = %d\n", pptable->FanAcousticLimitRpm);
    427	pr_info("FanThrottlingRpm = %d\n", pptable->FanThrottlingRpm);
    428	pr_info("FanMaximumRpm = %d\n", pptable->FanMaximumRpm);
    429	pr_info("FanTargetTemperature = %d\n", pptable->FanTargetTemperature);
    430	pr_info("FanTargetGfxclk = %d\n", pptable->FanTargetGfxclk);
    431	pr_info("FanZeroRpmEnable = %d\n", pptable->FanZeroRpmEnable);
    432	pr_info("FanTachEdgePerRev = %d\n", pptable->FanTachEdgePerRev);
    433
    434	pr_info("FuzzyFan_ErrorSetDelta = %d\n", pptable->FuzzyFan_ErrorSetDelta);
    435	pr_info("FuzzyFan_ErrorRateSetDelta = %d\n", pptable->FuzzyFan_ErrorRateSetDelta);
    436	pr_info("FuzzyFan_PwmSetDelta = %d\n", pptable->FuzzyFan_PwmSetDelta);
    437	pr_info("FuzzyFan_Reserved = %d\n", pptable->FuzzyFan_Reserved);
    438
    439	pr_info("OverrideAvfsGb[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->OverrideAvfsGb[AVFS_VOLTAGE_GFX]);
    440	pr_info("OverrideAvfsGb[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->OverrideAvfsGb[AVFS_VOLTAGE_SOC]);
    441	pr_info("Padding8_Avfs[0] = %d\n", pptable->Padding8_Avfs[0]);
    442	pr_info("Padding8_Avfs[1] = %d\n", pptable->Padding8_Avfs[1]);
    443
    444	pr_info("qAvfsGb[AVFS_VOLTAGE_GFX]{a = 0x%x b = 0x%x c = 0x%x}\n",
    445			pptable->qAvfsGb[AVFS_VOLTAGE_GFX].a,
    446			pptable->qAvfsGb[AVFS_VOLTAGE_GFX].b,
    447			pptable->qAvfsGb[AVFS_VOLTAGE_GFX].c);
    448	pr_info("qAvfsGb[AVFS_VOLTAGE_SOC]{a = 0x%x b = 0x%x c = 0x%x}\n",
    449			pptable->qAvfsGb[AVFS_VOLTAGE_SOC].a,
    450			pptable->qAvfsGb[AVFS_VOLTAGE_SOC].b,
    451			pptable->qAvfsGb[AVFS_VOLTAGE_SOC].c);
    452	pr_info("dBtcGbGfxCksOn{a = 0x%x b = 0x%x c = 0x%x}\n",
    453			pptable->dBtcGbGfxCksOn.a,
    454			pptable->dBtcGbGfxCksOn.b,
    455			pptable->dBtcGbGfxCksOn.c);
    456	pr_info("dBtcGbGfxCksOff{a = 0x%x b = 0x%x c = 0x%x}\n",
    457			pptable->dBtcGbGfxCksOff.a,
    458			pptable->dBtcGbGfxCksOff.b,
    459			pptable->dBtcGbGfxCksOff.c);
    460	pr_info("dBtcGbGfxAfll{a = 0x%x b = 0x%x c = 0x%x}\n",
    461			pptable->dBtcGbGfxAfll.a,
    462			pptable->dBtcGbGfxAfll.b,
    463			pptable->dBtcGbGfxAfll.c);
    464	pr_info("dBtcGbSoc{a = 0x%x b = 0x%x c = 0x%x}\n",
    465			pptable->dBtcGbSoc.a,
    466			pptable->dBtcGbSoc.b,
    467			pptable->dBtcGbSoc.c);
    468	pr_info("qAgingGb[AVFS_VOLTAGE_GFX]{m = 0x%x b = 0x%x}\n",
    469			pptable->qAgingGb[AVFS_VOLTAGE_GFX].m,
    470			pptable->qAgingGb[AVFS_VOLTAGE_GFX].b);
    471	pr_info("qAgingGb[AVFS_VOLTAGE_SOC]{m = 0x%x b = 0x%x}\n",
    472			pptable->qAgingGb[AVFS_VOLTAGE_SOC].m,
    473			pptable->qAgingGb[AVFS_VOLTAGE_SOC].b);
    474
    475	pr_info("qStaticVoltageOffset[AVFS_VOLTAGE_GFX]{a = 0x%x b = 0x%x c = 0x%x}\n",
    476			pptable->qStaticVoltageOffset[AVFS_VOLTAGE_GFX].a,
    477			pptable->qStaticVoltageOffset[AVFS_VOLTAGE_GFX].b,
    478			pptable->qStaticVoltageOffset[AVFS_VOLTAGE_GFX].c);
    479	pr_info("qStaticVoltageOffset[AVFS_VOLTAGE_SOC]{a = 0x%x b = 0x%x c = 0x%x}\n",
    480			pptable->qStaticVoltageOffset[AVFS_VOLTAGE_SOC].a,
    481			pptable->qStaticVoltageOffset[AVFS_VOLTAGE_SOC].b,
    482			pptable->qStaticVoltageOffset[AVFS_VOLTAGE_SOC].c);
    483
    484	pr_info("DcTol[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcTol[AVFS_VOLTAGE_GFX]);
    485	pr_info("DcTol[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcTol[AVFS_VOLTAGE_SOC]);
    486
    487	pr_info("DcBtcEnabled[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcEnabled[AVFS_VOLTAGE_GFX]);
    488	pr_info("DcBtcEnabled[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcEnabled[AVFS_VOLTAGE_SOC]);
    489	pr_info("Padding8_GfxBtc[0] = 0x%x\n", pptable->Padding8_GfxBtc[0]);
    490	pr_info("Padding8_GfxBtc[1] = 0x%x\n", pptable->Padding8_GfxBtc[1]);
    491
    492	pr_info("DcBtcMin[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcMin[AVFS_VOLTAGE_GFX]);
    493	pr_info("DcBtcMin[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcMin[AVFS_VOLTAGE_SOC]);
    494	pr_info("DcBtcMax[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcMax[AVFS_VOLTAGE_GFX]);
    495	pr_info("DcBtcMax[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcMax[AVFS_VOLTAGE_SOC]);
    496
    497	pr_info("XgmiLinkSpeed\n");
    498	for (i = 0; i < NUM_XGMI_LEVELS; i++)
    499		pr_info("  .[%d] = %d\n", i, pptable->XgmiLinkSpeed[i]);
    500	pr_info("XgmiLinkWidth\n");
    501	for (i = 0; i < NUM_XGMI_LEVELS; i++)
    502		pr_info("  .[%d] = %d\n", i, pptable->XgmiLinkWidth[i]);
    503	pr_info("XgmiFclkFreq\n");
    504	for (i = 0; i < NUM_XGMI_LEVELS; i++)
    505		pr_info("  .[%d] = %d\n", i, pptable->XgmiFclkFreq[i]);
    506	pr_info("XgmiUclkFreq\n");
    507	for (i = 0; i < NUM_XGMI_LEVELS; i++)
    508		pr_info("  .[%d] = %d\n", i, pptable->XgmiUclkFreq[i]);
    509	pr_info("XgmiSocclkFreq\n");
    510	for (i = 0; i < NUM_XGMI_LEVELS; i++)
    511		pr_info("  .[%d] = %d\n", i, pptable->XgmiSocclkFreq[i]);
    512	pr_info("XgmiSocVoltage\n");
    513	for (i = 0; i < NUM_XGMI_LEVELS; i++)
    514		pr_info("  .[%d] = %d\n", i, pptable->XgmiSocVoltage[i]);
    515
    516	pr_info("DebugOverrides = 0x%x\n", pptable->DebugOverrides);
    517	pr_info("ReservedEquation0{a = 0x%x b = 0x%x c = 0x%x}\n",
    518			pptable->ReservedEquation0.a,
    519			pptable->ReservedEquation0.b,
    520			pptable->ReservedEquation0.c);
    521	pr_info("ReservedEquation1{a = 0x%x b = 0x%x c = 0x%x}\n",
    522			pptable->ReservedEquation1.a,
    523			pptable->ReservedEquation1.b,
    524			pptable->ReservedEquation1.c);
    525	pr_info("ReservedEquation2{a = 0x%x b = 0x%x c = 0x%x}\n",
    526			pptable->ReservedEquation2.a,
    527			pptable->ReservedEquation2.b,
    528			pptable->ReservedEquation2.c);
    529	pr_info("ReservedEquation3{a = 0x%x b = 0x%x c = 0x%x}\n",
    530			pptable->ReservedEquation3.a,
    531			pptable->ReservedEquation3.b,
    532			pptable->ReservedEquation3.c);
    533
    534	pr_info("MinVoltageUlvGfx = %d\n", pptable->MinVoltageUlvGfx);
    535	pr_info("MinVoltageUlvSoc = %d\n", pptable->MinVoltageUlvSoc);
    536
    537	pr_info("MGpuFanBoostLimitRpm = %d\n", pptable->MGpuFanBoostLimitRpm);
    538	pr_info("padding16_Fan = %d\n", pptable->padding16_Fan);
    539
    540	pr_info("FanGainVrMem0 = %d\n", pptable->FanGainVrMem0);
    541	pr_info("FanGainVrMem0 = %d\n", pptable->FanGainVrMem0);
    542
    543	pr_info("DcBtcGb[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcGb[AVFS_VOLTAGE_GFX]);
    544	pr_info("DcBtcGb[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcGb[AVFS_VOLTAGE_SOC]);
    545
    546	for (i = 0; i < 11; i++)
    547		pr_info("Reserved[%d] = 0x%x\n", i, pptable->Reserved[i]);
    548
    549	for (i = 0; i < 3; i++)
    550		pr_info("Padding32[%d] = 0x%x\n", i, pptable->Padding32[i]);
    551
    552	pr_info("MaxVoltageStepGfx = 0x%x\n", pptable->MaxVoltageStepGfx);
    553	pr_info("MaxVoltageStepSoc = 0x%x\n", pptable->MaxVoltageStepSoc);
    554
    555	pr_info("VddGfxVrMapping = 0x%x\n", pptable->VddGfxVrMapping);
    556	pr_info("VddSocVrMapping = 0x%x\n", pptable->VddSocVrMapping);
    557	pr_info("VddMem0VrMapping = 0x%x\n", pptable->VddMem0VrMapping);
    558	pr_info("VddMem1VrMapping = 0x%x\n", pptable->VddMem1VrMapping);
    559
    560	pr_info("GfxUlvPhaseSheddingMask = 0x%x\n", pptable->GfxUlvPhaseSheddingMask);
    561	pr_info("SocUlvPhaseSheddingMask = 0x%x\n", pptable->SocUlvPhaseSheddingMask);
    562	pr_info("ExternalSensorPresent = 0x%x\n", pptable->ExternalSensorPresent);
    563	pr_info("Padding8_V = 0x%x\n", pptable->Padding8_V);
    564
    565	pr_info("GfxMaxCurrent = 0x%x\n", pptable->GfxMaxCurrent);
    566	pr_info("GfxOffset = 0x%x\n", pptable->GfxOffset);
    567	pr_info("Padding_TelemetryGfx = 0x%x\n", pptable->Padding_TelemetryGfx);
    568
    569	pr_info("SocMaxCurrent = 0x%x\n", pptable->SocMaxCurrent);
    570	pr_info("SocOffset = 0x%x\n", pptable->SocOffset);
    571	pr_info("Padding_TelemetrySoc = 0x%x\n", pptable->Padding_TelemetrySoc);
    572
    573	pr_info("Mem0MaxCurrent = 0x%x\n", pptable->Mem0MaxCurrent);
    574	pr_info("Mem0Offset = 0x%x\n", pptable->Mem0Offset);
    575	pr_info("Padding_TelemetryMem0 = 0x%x\n", pptable->Padding_TelemetryMem0);
    576
    577	pr_info("Mem1MaxCurrent = 0x%x\n", pptable->Mem1MaxCurrent);
    578	pr_info("Mem1Offset = 0x%x\n", pptable->Mem1Offset);
    579	pr_info("Padding_TelemetryMem1 = 0x%x\n", pptable->Padding_TelemetryMem1);
    580
    581	pr_info("AcDcGpio = %d\n", pptable->AcDcGpio);
    582	pr_info("AcDcPolarity = %d\n", pptable->AcDcPolarity);
    583	pr_info("VR0HotGpio = %d\n", pptable->VR0HotGpio);
    584	pr_info("VR0HotPolarity = %d\n", pptable->VR0HotPolarity);
    585
    586	pr_info("VR1HotGpio = %d\n", pptable->VR1HotGpio);
    587	pr_info("VR1HotPolarity = %d\n", pptable->VR1HotPolarity);
    588	pr_info("Padding1 = 0x%x\n", pptable->Padding1);
    589	pr_info("Padding2 = 0x%x\n", pptable->Padding2);
    590
    591	pr_info("LedPin0 = %d\n", pptable->LedPin0);
    592	pr_info("LedPin1 = %d\n", pptable->LedPin1);
    593	pr_info("LedPin2 = %d\n", pptable->LedPin2);
    594	pr_info("padding8_4 = 0x%x\n", pptable->padding8_4);
    595
    596	pr_info("PllGfxclkSpreadEnabled = %d\n", pptable->PllGfxclkSpreadEnabled);
    597	pr_info("PllGfxclkSpreadPercent = %d\n", pptable->PllGfxclkSpreadPercent);
    598	pr_info("PllGfxclkSpreadFreq = %d\n", pptable->PllGfxclkSpreadFreq);
    599
    600	pr_info("UclkSpreadEnabled = %d\n", pptable->UclkSpreadEnabled);
    601	pr_info("UclkSpreadPercent = %d\n", pptable->UclkSpreadPercent);
    602	pr_info("UclkSpreadFreq = %d\n", pptable->UclkSpreadFreq);
    603
    604	pr_info("FclkSpreadEnabled = %d\n", pptable->FclkSpreadEnabled);
    605	pr_info("FclkSpreadPercent = %d\n", pptable->FclkSpreadPercent);
    606	pr_info("FclkSpreadFreq = %d\n", pptable->FclkSpreadFreq);
    607
    608	pr_info("FllGfxclkSpreadEnabled = %d\n", pptable->FllGfxclkSpreadEnabled);
    609	pr_info("FllGfxclkSpreadPercent = %d\n", pptable->FllGfxclkSpreadPercent);
    610	pr_info("FllGfxclkSpreadFreq = %d\n", pptable->FllGfxclkSpreadFreq);
    611
    612	for (i = 0; i < I2C_CONTROLLER_NAME_COUNT; i++) {
    613		pr_info("I2cControllers[%d]:\n", i);
    614		pr_info("                   .Enabled = %d\n",
    615				pptable->I2cControllers[i].Enabled);
    616		pr_info("                   .SlaveAddress = 0x%x\n",
    617				pptable->I2cControllers[i].SlaveAddress);
    618		pr_info("                   .ControllerPort = %d\n",
    619				pptable->I2cControllers[i].ControllerPort);
    620		pr_info("                   .ControllerName = %d\n",
    621				pptable->I2cControllers[i].ControllerName);
    622		pr_info("                   .ThermalThrottler = %d\n",
    623				pptable->I2cControllers[i].ThermalThrottler);
    624		pr_info("                   .I2cProtocol = %d\n",
    625				pptable->I2cControllers[i].I2cProtocol);
    626		pr_info("                   .I2cSpeed = %d\n",
    627				pptable->I2cControllers[i].I2cSpeed);
    628	}
    629
    630	for (i = 0; i < 10; i++)
    631		pr_info("BoardReserved[%d] = 0x%x\n", i, pptable->BoardReserved[i]);
    632
    633	for (i = 0; i < 8; i++)
    634		pr_info("MmHubPadding[%d] = 0x%x\n", i, pptable->MmHubPadding[i]);
    635}
    636#endif
    637
    638static int check_powerplay_tables(
    639		struct pp_hwmgr *hwmgr,
    640		const ATOM_Vega20_POWERPLAYTABLE *powerplay_table)
    641{
    642	PP_ASSERT_WITH_CODE((powerplay_table->sHeader.format_revision >=
    643		ATOM_VEGA20_TABLE_REVISION_VEGA20),
    644		"Unsupported PPTable format!", return -1);
    645	PP_ASSERT_WITH_CODE(powerplay_table->sHeader.structuresize > 0,
    646		"Invalid PowerPlay Table!", return -1);
    647
    648	if (powerplay_table->smcPPTable.Version != PPTABLE_V20_SMU_VERSION) {
    649		pr_info("Unmatch PPTable version: "
    650			"pptable from VBIOS is V%d while driver supported is V%d!",
    651			powerplay_table->smcPPTable.Version,
    652			PPTABLE_V20_SMU_VERSION);
    653		return -EINVAL;
    654	}
    655
    656	//dump_pptable(&powerplay_table->smcPPTable);
    657
    658	return 0;
    659}
    660
    661static int set_platform_caps(struct pp_hwmgr *hwmgr, uint32_t powerplay_caps)
    662{
    663	set_hw_cap(
    664		hwmgr,
    665		0 != (powerplay_caps & ATOM_VEGA20_PP_PLATFORM_CAP_POWERPLAY),
    666		PHM_PlatformCaps_PowerPlaySupport);
    667
    668	set_hw_cap(
    669		hwmgr,
    670		0 != (powerplay_caps & ATOM_VEGA20_PP_PLATFORM_CAP_SBIOSPOWERSOURCE),
    671		PHM_PlatformCaps_BiosPowerSourceControl);
    672
    673	set_hw_cap(
    674		hwmgr,
    675		0 != (powerplay_caps & ATOM_VEGA20_PP_PLATFORM_CAP_BACO),
    676		PHM_PlatformCaps_BACO);
    677
    678	set_hw_cap(
    679		hwmgr,
    680		0 != (powerplay_caps & ATOM_VEGA20_PP_PLATFORM_CAP_BAMACO),
    681		 PHM_PlatformCaps_BAMACO);
    682
    683	return 0;
    684}
    685
    686static int copy_overdrive_feature_capabilities_array(
    687		struct pp_hwmgr *hwmgr,
    688		uint8_t **pptable_info_array,
    689		const uint8_t *pptable_array,
    690		uint8_t od_feature_count)
    691{
    692	uint32_t array_size, i;
    693	uint8_t *table;
    694	bool od_supported = false;
    695
    696	array_size = sizeof(uint8_t) * od_feature_count;
    697	table = kzalloc(array_size, GFP_KERNEL);
    698	if (NULL == table)
    699		return -ENOMEM;
    700
    701	for (i = 0; i < od_feature_count; i++) {
    702		table[i] = le32_to_cpu(pptable_array[i]);
    703		if (table[i])
    704			od_supported = true;
    705	}
    706
    707	*pptable_info_array = table;
    708
    709	if (od_supported)
    710		phm_cap_set(hwmgr->platform_descriptor.platformCaps,
    711				PHM_PlatformCaps_ACOverdriveSupport);
    712
    713	return 0;
    714}
    715
    716static int append_vbios_pptable(struct pp_hwmgr *hwmgr, PPTable_t *ppsmc_pptable)
    717{
    718	struct atom_smc_dpm_info_v4_4 *smc_dpm_table;
    719	int index = GetIndexIntoMasterDataTable(smc_dpm_info);
    720	int i;
    721
    722	PP_ASSERT_WITH_CODE(
    723		smc_dpm_table = smu_atom_get_data_table(hwmgr->adev, index, NULL, NULL, NULL),
    724		"[appendVbiosPPTable] Failed to retrieve Smc Dpm Table from VBIOS!",
    725		return -1);
    726
    727	ppsmc_pptable->MaxVoltageStepGfx = smc_dpm_table->maxvoltagestepgfx;
    728	ppsmc_pptable->MaxVoltageStepSoc = smc_dpm_table->maxvoltagestepsoc;
    729
    730	ppsmc_pptable->VddGfxVrMapping = smc_dpm_table->vddgfxvrmapping;
    731	ppsmc_pptable->VddSocVrMapping = smc_dpm_table->vddsocvrmapping;
    732	ppsmc_pptable->VddMem0VrMapping = smc_dpm_table->vddmem0vrmapping;
    733	ppsmc_pptable->VddMem1VrMapping = smc_dpm_table->vddmem1vrmapping;
    734
    735	ppsmc_pptable->GfxUlvPhaseSheddingMask = smc_dpm_table->gfxulvphasesheddingmask;
    736	ppsmc_pptable->SocUlvPhaseSheddingMask = smc_dpm_table->soculvphasesheddingmask;
    737	ppsmc_pptable->ExternalSensorPresent = smc_dpm_table->externalsensorpresent;
    738
    739	ppsmc_pptable->GfxMaxCurrent = smc_dpm_table->gfxmaxcurrent;
    740	ppsmc_pptable->GfxOffset = smc_dpm_table->gfxoffset;
    741	ppsmc_pptable->Padding_TelemetryGfx = smc_dpm_table->padding_telemetrygfx;
    742
    743	ppsmc_pptable->SocMaxCurrent = smc_dpm_table->socmaxcurrent;
    744	ppsmc_pptable->SocOffset = smc_dpm_table->socoffset;
    745	ppsmc_pptable->Padding_TelemetrySoc = smc_dpm_table->padding_telemetrysoc;
    746
    747	ppsmc_pptable->Mem0MaxCurrent = smc_dpm_table->mem0maxcurrent;
    748	ppsmc_pptable->Mem0Offset = smc_dpm_table->mem0offset;
    749	ppsmc_pptable->Padding_TelemetryMem0 = smc_dpm_table->padding_telemetrymem0;
    750
    751	ppsmc_pptable->Mem1MaxCurrent = smc_dpm_table->mem1maxcurrent;
    752	ppsmc_pptable->Mem1Offset = smc_dpm_table->mem1offset;
    753	ppsmc_pptable->Padding_TelemetryMem1 = smc_dpm_table->padding_telemetrymem1;
    754
    755	ppsmc_pptable->AcDcGpio = smc_dpm_table->acdcgpio;
    756	ppsmc_pptable->AcDcPolarity = smc_dpm_table->acdcpolarity;
    757	ppsmc_pptable->VR0HotGpio = smc_dpm_table->vr0hotgpio;
    758	ppsmc_pptable->VR0HotPolarity = smc_dpm_table->vr0hotpolarity;
    759
    760	ppsmc_pptable->VR1HotGpio = smc_dpm_table->vr1hotgpio;
    761	ppsmc_pptable->VR1HotPolarity = smc_dpm_table->vr1hotpolarity;
    762	ppsmc_pptable->Padding1 = smc_dpm_table->padding1;
    763	ppsmc_pptable->Padding2 = smc_dpm_table->padding2;
    764
    765	ppsmc_pptable->LedPin0 = smc_dpm_table->ledpin0;
    766	ppsmc_pptable->LedPin1 = smc_dpm_table->ledpin1;
    767	ppsmc_pptable->LedPin2 = smc_dpm_table->ledpin2;
    768
    769	ppsmc_pptable->PllGfxclkSpreadEnabled = smc_dpm_table->pllgfxclkspreadenabled;
    770	ppsmc_pptable->PllGfxclkSpreadPercent = smc_dpm_table->pllgfxclkspreadpercent;
    771	ppsmc_pptable->PllGfxclkSpreadFreq = smc_dpm_table->pllgfxclkspreadfreq;
    772
    773	ppsmc_pptable->UclkSpreadEnabled = 0;
    774	ppsmc_pptable->UclkSpreadPercent = smc_dpm_table->uclkspreadpercent;
    775	ppsmc_pptable->UclkSpreadFreq = smc_dpm_table->uclkspreadfreq;
    776
    777	ppsmc_pptable->FclkSpreadEnabled = smc_dpm_table->fclkspreadenabled;
    778	ppsmc_pptable->FclkSpreadPercent = smc_dpm_table->fclkspreadpercent;
    779	ppsmc_pptable->FclkSpreadFreq = smc_dpm_table->fclkspreadfreq;
    780
    781	ppsmc_pptable->FllGfxclkSpreadEnabled = smc_dpm_table->fllgfxclkspreadenabled;
    782	ppsmc_pptable->FllGfxclkSpreadPercent = smc_dpm_table->fllgfxclkspreadpercent;
    783	ppsmc_pptable->FllGfxclkSpreadFreq = smc_dpm_table->fllgfxclkspreadfreq;
    784
    785	for (i = 0; i < I2C_CONTROLLER_NAME_COUNT; i++) {
    786		ppsmc_pptable->I2cControllers[i].Enabled =
    787			smc_dpm_table->i2ccontrollers[i].enabled;
    788		ppsmc_pptable->I2cControllers[i].SlaveAddress =
    789			smc_dpm_table->i2ccontrollers[i].slaveaddress;
    790		ppsmc_pptable->I2cControllers[i].ControllerPort =
    791			smc_dpm_table->i2ccontrollers[i].controllerport;
    792		ppsmc_pptable->I2cControllers[i].ThermalThrottler =
    793			smc_dpm_table->i2ccontrollers[i].thermalthrottler;
    794		ppsmc_pptable->I2cControllers[i].I2cProtocol =
    795			smc_dpm_table->i2ccontrollers[i].i2cprotocol;
    796		ppsmc_pptable->I2cControllers[i].I2cSpeed =
    797			smc_dpm_table->i2ccontrollers[i].i2cspeed;
    798	}
    799
    800	return 0;
    801}
    802
    803static int override_powerplay_table_fantargettemperature(struct pp_hwmgr *hwmgr)
    804{
    805	struct phm_ppt_v3_information *pptable_information =
    806		(struct phm_ppt_v3_information *)hwmgr->pptable;
    807	PPTable_t *ppsmc_pptable = (PPTable_t *)(pptable_information->smc_pptable);
    808
    809	ppsmc_pptable->FanTargetTemperature = VEGA20_FAN_TARGET_TEMPERATURE_OVERRIDE;
    810
    811	return 0;
    812}
    813
    814#define VEGA20_ENGINECLOCK_HARDMAX 198000
    815static int init_powerplay_table_information(
    816		struct pp_hwmgr *hwmgr,
    817		const ATOM_Vega20_POWERPLAYTABLE *powerplay_table)
    818{
    819	struct phm_ppt_v3_information *pptable_information =
    820		(struct phm_ppt_v3_information *)hwmgr->pptable;
    821	uint32_t disable_power_control = 0;
    822	uint32_t od_feature_count, od_setting_count, power_saving_clock_count;
    823	int result;
    824
    825	hwmgr->thermal_controller.ucType = powerplay_table->ucThermalControllerType;
    826	pptable_information->uc_thermal_controller_type = powerplay_table->ucThermalControllerType;
    827	hwmgr->thermal_controller.fanInfo.ulMinRPM = 0;
    828	hwmgr->thermal_controller.fanInfo.ulMaxRPM = powerplay_table->smcPPTable.FanMaximumRpm;
    829
    830	set_hw_cap(hwmgr,
    831		ATOM_VEGA20_PP_THERMALCONTROLLER_NONE != hwmgr->thermal_controller.ucType,
    832		PHM_PlatformCaps_ThermalController);
    833
    834	phm_cap_set(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl);
    835
    836	if (powerplay_table->OverDrive8Table.ucODTableRevision == 1) {
    837		od_feature_count =
    838			(le32_to_cpu(powerplay_table->OverDrive8Table.ODFeatureCount) >
    839			 ATOM_VEGA20_ODFEATURE_COUNT) ?
    840			ATOM_VEGA20_ODFEATURE_COUNT :
    841			le32_to_cpu(powerplay_table->OverDrive8Table.ODFeatureCount);
    842		od_setting_count =
    843			(le32_to_cpu(powerplay_table->OverDrive8Table.ODSettingCount) >
    844			 ATOM_VEGA20_ODSETTING_COUNT) ?
    845			ATOM_VEGA20_ODSETTING_COUNT :
    846			le32_to_cpu(powerplay_table->OverDrive8Table.ODSettingCount);
    847
    848		copy_overdrive_feature_capabilities_array(hwmgr,
    849				&pptable_information->od_feature_capabilities,
    850				powerplay_table->OverDrive8Table.ODFeatureCapabilities,
    851				od_feature_count);
    852		phm_copy_overdrive_settings_limits_array(hwmgr,
    853				&pptable_information->od_settings_max,
    854				powerplay_table->OverDrive8Table.ODSettingsMax,
    855				od_setting_count);
    856		phm_copy_overdrive_settings_limits_array(hwmgr,
    857				&pptable_information->od_settings_min,
    858				powerplay_table->OverDrive8Table.ODSettingsMin,
    859				od_setting_count);
    860	}
    861
    862	pptable_information->us_small_power_limit1 = le16_to_cpu(powerplay_table->usSmallPowerLimit1);
    863	pptable_information->us_small_power_limit2 = le16_to_cpu(powerplay_table->usSmallPowerLimit2);
    864	pptable_information->us_boost_power_limit = le16_to_cpu(powerplay_table->usBoostPowerLimit);
    865	pptable_information->us_od_turbo_power_limit = le16_to_cpu(powerplay_table->usODTurboPowerLimit);
    866	pptable_information->us_od_powersave_power_limit = le16_to_cpu(powerplay_table->usODPowerSavePowerLimit);
    867
    868	pptable_information->us_software_shutdown_temp = le16_to_cpu(powerplay_table->usSoftwareShutdownTemp);
    869
    870	hwmgr->platform_descriptor.TDPODLimit = le32_to_cpu(powerplay_table->OverDrive8Table.ODSettingsMax[ATOM_VEGA20_ODSETTING_POWERPERCENTAGE]);
    871
    872	disable_power_control = 0;
    873	if (!disable_power_control && hwmgr->platform_descriptor.TDPODLimit)
    874		/* enable TDP overdrive (PowerControl) feature as well if supported */
    875		phm_cap_set(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_PowerControl);
    876
    877	if (powerplay_table->PowerSavingClockTable.ucTableRevision == 1) {
    878		power_saving_clock_count =
    879			(le32_to_cpu(powerplay_table->PowerSavingClockTable.PowerSavingClockCount) >=
    880			 ATOM_VEGA20_PPCLOCK_COUNT) ?
    881			ATOM_VEGA20_PPCLOCK_COUNT :
    882			le32_to_cpu(powerplay_table->PowerSavingClockTable.PowerSavingClockCount);
    883		phm_copy_clock_limits_array(hwmgr,
    884				&pptable_information->power_saving_clock_max,
    885				powerplay_table->PowerSavingClockTable.PowerSavingClockMax,
    886				power_saving_clock_count);
    887		phm_copy_clock_limits_array(hwmgr,
    888				&pptable_information->power_saving_clock_min,
    889				powerplay_table->PowerSavingClockTable.PowerSavingClockMin,
    890				power_saving_clock_count);
    891	}
    892
    893	pptable_information->smc_pptable = kmemdup(&(powerplay_table->smcPPTable),
    894						   sizeof(PPTable_t),
    895						   GFP_KERNEL);
    896	if (pptable_information->smc_pptable == NULL)
    897		return -ENOMEM;
    898
    899
    900	result = append_vbios_pptable(hwmgr, (pptable_information->smc_pptable));
    901	if (result)
    902		return result;
    903
    904	result = override_powerplay_table_fantargettemperature(hwmgr);
    905
    906	return result;
    907}
    908
    909static int vega20_pp_tables_initialize(struct pp_hwmgr *hwmgr)
    910{
    911	int result = 0;
    912	const ATOM_Vega20_POWERPLAYTABLE *powerplay_table;
    913
    914	hwmgr->pptable = kzalloc(sizeof(struct phm_ppt_v3_information), GFP_KERNEL);
    915	PP_ASSERT_WITH_CODE((hwmgr->pptable != NULL),
    916		"Failed to allocate hwmgr->pptable!", return -ENOMEM);
    917
    918	powerplay_table = get_powerplay_table(hwmgr);
    919	PP_ASSERT_WITH_CODE((powerplay_table != NULL),
    920		"Missing PowerPlay Table!", return -1);
    921
    922	result = check_powerplay_tables(hwmgr, powerplay_table);
    923	PP_ASSERT_WITH_CODE((result == 0),
    924		"check_powerplay_tables failed", return result);
    925
    926	result = set_platform_caps(hwmgr,
    927			le32_to_cpu(powerplay_table->ulPlatformCaps));
    928	PP_ASSERT_WITH_CODE((result == 0),
    929		"set_platform_caps failed", return result);
    930
    931	result = init_powerplay_table_information(hwmgr, powerplay_table);
    932	PP_ASSERT_WITH_CODE((result == 0),
    933		"init_powerplay_table_information failed", return result);
    934
    935	return result;
    936}
    937
    938static int vega20_pp_tables_uninitialize(struct pp_hwmgr *hwmgr)
    939{
    940	struct phm_ppt_v3_information *pp_table_info =
    941			(struct phm_ppt_v3_information *)(hwmgr->pptable);
    942
    943	kfree(pp_table_info->power_saving_clock_max);
    944	pp_table_info->power_saving_clock_max = NULL;
    945
    946	kfree(pp_table_info->power_saving_clock_min);
    947	pp_table_info->power_saving_clock_min = NULL;
    948
    949	kfree(pp_table_info->od_feature_capabilities);
    950	pp_table_info->od_feature_capabilities = NULL;
    951
    952	kfree(pp_table_info->od_settings_max);
    953	pp_table_info->od_settings_max = NULL;
    954
    955	kfree(pp_table_info->od_settings_min);
    956	pp_table_info->od_settings_min = NULL;
    957
    958	kfree(pp_table_info->smc_pptable);
    959	pp_table_info->smc_pptable = NULL;
    960
    961	kfree(hwmgr->pptable);
    962	hwmgr->pptable = NULL;
    963
    964	return 0;
    965}
    966
    967const struct pp_table_func vega20_pptable_funcs = {
    968	.pptable_init = vega20_pp_tables_initialize,
    969	.pptable_fini = vega20_pp_tables_uninitialize,
    970};