1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2015 Advanced Micro Devices, Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice shall be included in 12*4882a593Smuzhiyun * all copies or substantial portions of the Software. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*4882a593Smuzhiyun * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*4882a593Smuzhiyun * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*4882a593Smuzhiyun * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*4882a593Smuzhiyun * OTHER DEALINGS IN THE SOFTWARE. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun #ifndef _SMU73_H_ 24*4882a593Smuzhiyun #define _SMU73_H_ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #pragma pack(push, 1) 27*4882a593Smuzhiyun enum SID_OPTION { 28*4882a593Smuzhiyun SID_OPTION_HI, 29*4882a593Smuzhiyun SID_OPTION_LO, 30*4882a593Smuzhiyun SID_OPTION_COUNT 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun enum Poly3rdOrderCoeff { 34*4882a593Smuzhiyun LEAKAGE_TEMPERATURE_SCALAR, 35*4882a593Smuzhiyun LEAKAGE_VOLTAGE_SCALAR, 36*4882a593Smuzhiyun DYNAMIC_VOLTAGE_SCALAR, 37*4882a593Smuzhiyun POLY_3RD_ORDER_COUNT 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct SMU7_Poly3rdOrder_Data 41*4882a593Smuzhiyun { 42*4882a593Smuzhiyun int32_t a; 43*4882a593Smuzhiyun int32_t b; 44*4882a593Smuzhiyun int32_t c; 45*4882a593Smuzhiyun int32_t d; 46*4882a593Smuzhiyun uint8_t a_shift; 47*4882a593Smuzhiyun uint8_t b_shift; 48*4882a593Smuzhiyun uint8_t c_shift; 49*4882a593Smuzhiyun uint8_t x_shift; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun typedef struct SMU7_Poly3rdOrder_Data SMU7_Poly3rdOrder_Data; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct Power_Calculator_Data 55*4882a593Smuzhiyun { 56*4882a593Smuzhiyun uint16_t NoLoadVoltage; 57*4882a593Smuzhiyun uint16_t LoadVoltage; 58*4882a593Smuzhiyun uint16_t Resistance; 59*4882a593Smuzhiyun uint16_t Temperature; 60*4882a593Smuzhiyun uint16_t BaseLeakage; 61*4882a593Smuzhiyun uint16_t LkgTempScalar; 62*4882a593Smuzhiyun uint16_t LkgVoltScalar; 63*4882a593Smuzhiyun uint16_t LkgAreaScalar; 64*4882a593Smuzhiyun uint16_t LkgPower; 65*4882a593Smuzhiyun uint16_t DynVoltScalar; 66*4882a593Smuzhiyun uint32_t Cac; 67*4882a593Smuzhiyun uint32_t DynPower; 68*4882a593Smuzhiyun uint32_t TotalCurrent; 69*4882a593Smuzhiyun uint32_t TotalPower; 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun typedef struct Power_Calculator_Data PowerCalculatorData_t; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct Gc_Cac_Weight_Data 75*4882a593Smuzhiyun { 76*4882a593Smuzhiyun uint8_t index; 77*4882a593Smuzhiyun uint32_t value; 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun typedef struct Gc_Cac_Weight_Data GcCacWeight_Data; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun typedef struct { 84*4882a593Smuzhiyun uint32_t high; 85*4882a593Smuzhiyun uint32_t low; 86*4882a593Smuzhiyun } data_64_t; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun typedef struct { 89*4882a593Smuzhiyun data_64_t high; 90*4882a593Smuzhiyun data_64_t low; 91*4882a593Smuzhiyun } data_128_t; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #define SMU__NUM_SCLK_DPM_STATE 8 94*4882a593Smuzhiyun #define SMU__NUM_MCLK_DPM_LEVELS 4 95*4882a593Smuzhiyun #define SMU__NUM_LCLK_DPM_LEVELS 8 96*4882a593Smuzhiyun #define SMU__NUM_PCIE_DPM_LEVELS 8 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #define SMU7_CONTEXT_ID_SMC 1 99*4882a593Smuzhiyun #define SMU7_CONTEXT_ID_VBIOS 2 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_VDDC 16 102*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_VDDGFX 16 103*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_VDDCI 8 104*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_MVDD 4 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define SMU_MAX_SMIO_LEVELS 4 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_GRAPHICS SMU__NUM_SCLK_DPM_STATE // SCLK + SQ DPM + ULV 109*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_MEMORY SMU__NUM_MCLK_DPM_LEVELS // MCLK Levels DPM 110*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_GIO SMU__NUM_LCLK_DPM_LEVELS // LCLK Levels 111*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_LINK SMU__NUM_PCIE_DPM_LEVELS // PCIe speed and number of lanes. 112*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_UVD 8 // VCLK/DCLK levels for UVD. 113*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_VCE 8 // ECLK levels for VCE. 114*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_ACP 8 // ACLK levels for ACP. 115*4882a593Smuzhiyun #define SMU73_MAX_LEVELS_SAMU 8 // SAMCLK levels for SAMU. 116*4882a593Smuzhiyun #define SMU73_MAX_ENTRIES_SMIO 32 // Number of entries in SMIO table. 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define DPM_NO_LIMIT 0 119*4882a593Smuzhiyun #define DPM_NO_UP 1 120*4882a593Smuzhiyun #define DPM_GO_DOWN 2 121*4882a593Smuzhiyun #define DPM_GO_UP 3 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define SMU7_FIRST_DPM_GRAPHICS_LEVEL 0 124*4882a593Smuzhiyun #define SMU7_FIRST_DPM_MEMORY_LEVEL 0 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define GPIO_CLAMP_MODE_VRHOT 1 127*4882a593Smuzhiyun #define GPIO_CLAMP_MODE_THERM 2 128*4882a593Smuzhiyun #define GPIO_CLAMP_MODE_DC 4 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #define SCRATCH_B_TARG_PCIE_INDEX_SHIFT 0 131*4882a593Smuzhiyun #define SCRATCH_B_TARG_PCIE_INDEX_MASK (0x7<<SCRATCH_B_TARG_PCIE_INDEX_SHIFT) 132*4882a593Smuzhiyun #define SCRATCH_B_CURR_PCIE_INDEX_SHIFT 3 133*4882a593Smuzhiyun #define SCRATCH_B_CURR_PCIE_INDEX_MASK (0x7<<SCRATCH_B_CURR_PCIE_INDEX_SHIFT) 134*4882a593Smuzhiyun #define SCRATCH_B_TARG_UVD_INDEX_SHIFT 6 135*4882a593Smuzhiyun #define SCRATCH_B_TARG_UVD_INDEX_MASK (0x7<<SCRATCH_B_TARG_UVD_INDEX_SHIFT) 136*4882a593Smuzhiyun #define SCRATCH_B_CURR_UVD_INDEX_SHIFT 9 137*4882a593Smuzhiyun #define SCRATCH_B_CURR_UVD_INDEX_MASK (0x7<<SCRATCH_B_CURR_UVD_INDEX_SHIFT) 138*4882a593Smuzhiyun #define SCRATCH_B_TARG_VCE_INDEX_SHIFT 12 139*4882a593Smuzhiyun #define SCRATCH_B_TARG_VCE_INDEX_MASK (0x7<<SCRATCH_B_TARG_VCE_INDEX_SHIFT) 140*4882a593Smuzhiyun #define SCRATCH_B_CURR_VCE_INDEX_SHIFT 15 141*4882a593Smuzhiyun #define SCRATCH_B_CURR_VCE_INDEX_MASK (0x7<<SCRATCH_B_CURR_VCE_INDEX_SHIFT) 142*4882a593Smuzhiyun #define SCRATCH_B_TARG_ACP_INDEX_SHIFT 18 143*4882a593Smuzhiyun #define SCRATCH_B_TARG_ACP_INDEX_MASK (0x7<<SCRATCH_B_TARG_ACP_INDEX_SHIFT) 144*4882a593Smuzhiyun #define SCRATCH_B_CURR_ACP_INDEX_SHIFT 21 145*4882a593Smuzhiyun #define SCRATCH_B_CURR_ACP_INDEX_MASK (0x7<<SCRATCH_B_CURR_ACP_INDEX_SHIFT) 146*4882a593Smuzhiyun #define SCRATCH_B_TARG_SAMU_INDEX_SHIFT 24 147*4882a593Smuzhiyun #define SCRATCH_B_TARG_SAMU_INDEX_MASK (0x7<<SCRATCH_B_TARG_SAMU_INDEX_SHIFT) 148*4882a593Smuzhiyun #define SCRATCH_B_CURR_SAMU_INDEX_SHIFT 27 149*4882a593Smuzhiyun #define SCRATCH_B_CURR_SAMU_INDEX_MASK (0x7<<SCRATCH_B_CURR_SAMU_INDEX_SHIFT) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun // Virtualization Defines 152*4882a593Smuzhiyun #define CG_XDMA_MASK 0x1 153*4882a593Smuzhiyun #define CG_XDMA_SHIFT 0 154*4882a593Smuzhiyun #define CG_UVD_MASK 0x2 155*4882a593Smuzhiyun #define CG_UVD_SHIFT 1 156*4882a593Smuzhiyun #define CG_VCE_MASK 0x4 157*4882a593Smuzhiyun #define CG_VCE_SHIFT 2 158*4882a593Smuzhiyun #define CG_SAMU_MASK 0x8 159*4882a593Smuzhiyun #define CG_SAMU_SHIFT 3 160*4882a593Smuzhiyun #define CG_GFX_MASK 0x10 161*4882a593Smuzhiyun #define CG_GFX_SHIFT 4 162*4882a593Smuzhiyun #define CG_SDMA_MASK 0x20 163*4882a593Smuzhiyun #define CG_SDMA_SHIFT 5 164*4882a593Smuzhiyun #define CG_HDP_MASK 0x40 165*4882a593Smuzhiyun #define CG_HDP_SHIFT 6 166*4882a593Smuzhiyun #define CG_MC_MASK 0x80 167*4882a593Smuzhiyun #define CG_MC_SHIFT 7 168*4882a593Smuzhiyun #define CG_DRM_MASK 0x100 169*4882a593Smuzhiyun #define CG_DRM_SHIFT 8 170*4882a593Smuzhiyun #define CG_ROM_MASK 0x200 171*4882a593Smuzhiyun #define CG_ROM_SHIFT 9 172*4882a593Smuzhiyun #define CG_BIF_MASK 0x400 173*4882a593Smuzhiyun #define CG_BIF_SHIFT 10 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #define SMU73_DTE_ITERATIONS 5 176*4882a593Smuzhiyun #define SMU73_DTE_SOURCES 3 177*4882a593Smuzhiyun #define SMU73_DTE_SINKS 1 178*4882a593Smuzhiyun #define SMU73_NUM_CPU_TES 0 179*4882a593Smuzhiyun #define SMU73_NUM_GPU_TES 1 180*4882a593Smuzhiyun #define SMU73_NUM_NON_TES 2 181*4882a593Smuzhiyun #define SMU73_DTE_FAN_SCALAR_MIN 0x100 182*4882a593Smuzhiyun #define SMU73_DTE_FAN_SCALAR_MAX 0x166 183*4882a593Smuzhiyun #define SMU73_DTE_FAN_TEMP_MAX 93 184*4882a593Smuzhiyun #define SMU73_DTE_FAN_TEMP_MIN 83 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun #define SMU73_THERMAL_INPUT_LOOP_COUNT 6 187*4882a593Smuzhiyun #define SMU73_THERMAL_CLAMP_MODE_COUNT 8 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun struct SMU7_HystController_Data 191*4882a593Smuzhiyun { 192*4882a593Smuzhiyun uint16_t waterfall_up; 193*4882a593Smuzhiyun uint16_t waterfall_down; 194*4882a593Smuzhiyun uint16_t waterfall_limit; 195*4882a593Smuzhiyun uint16_t release_cnt; 196*4882a593Smuzhiyun uint16_t release_limit; 197*4882a593Smuzhiyun uint16_t spare; 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun typedef struct SMU7_HystController_Data SMU7_HystController_Data; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun struct SMU73_PIDController 203*4882a593Smuzhiyun { 204*4882a593Smuzhiyun uint32_t Ki; 205*4882a593Smuzhiyun int32_t LFWindupUpperLim; 206*4882a593Smuzhiyun int32_t LFWindupLowerLim; 207*4882a593Smuzhiyun uint32_t StatePrecision; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun uint32_t LfPrecision; 210*4882a593Smuzhiyun uint32_t LfOffset; 211*4882a593Smuzhiyun uint32_t MaxState; 212*4882a593Smuzhiyun uint32_t MaxLfFraction; 213*4882a593Smuzhiyun uint32_t StateShift; 214*4882a593Smuzhiyun }; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun typedef struct SMU73_PIDController SMU73_PIDController; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun struct SMU7_LocalDpmScoreboard 219*4882a593Smuzhiyun { 220*4882a593Smuzhiyun uint32_t PercentageBusy; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun int32_t PIDError; 223*4882a593Smuzhiyun int32_t PIDIntegral; 224*4882a593Smuzhiyun int32_t PIDOutput; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun uint32_t SigmaDeltaAccum; 227*4882a593Smuzhiyun uint32_t SigmaDeltaOutput; 228*4882a593Smuzhiyun uint32_t SigmaDeltaLevel; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun uint32_t UtilizationSetpoint; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun uint8_t TdpClampMode; 233*4882a593Smuzhiyun uint8_t TdcClampMode; 234*4882a593Smuzhiyun uint8_t ThermClampMode; 235*4882a593Smuzhiyun uint8_t VoltageBusy; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun int8_t CurrLevel; 238*4882a593Smuzhiyun int8_t TargLevel; 239*4882a593Smuzhiyun uint8_t LevelChangeInProgress; 240*4882a593Smuzhiyun uint8_t UpHyst; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun uint8_t DownHyst; 243*4882a593Smuzhiyun uint8_t VoltageDownHyst; 244*4882a593Smuzhiyun uint8_t DpmEnable; 245*4882a593Smuzhiyun uint8_t DpmRunning; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun uint8_t DpmForce; 248*4882a593Smuzhiyun uint8_t DpmForceLevel; 249*4882a593Smuzhiyun uint8_t DisplayWatermark; 250*4882a593Smuzhiyun uint8_t McArbIndex; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun uint32_t MinimumPerfSclk; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun uint8_t AcpiReq; 255*4882a593Smuzhiyun uint8_t AcpiAck; 256*4882a593Smuzhiyun uint8_t GfxClkSlow; 257*4882a593Smuzhiyun uint8_t GpioClampMode; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun uint8_t spare2; 260*4882a593Smuzhiyun uint8_t EnabledLevelsChange; 261*4882a593Smuzhiyun uint8_t DteClampMode; 262*4882a593Smuzhiyun uint8_t FpsClampMode; 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun uint16_t LevelResidencyCounters [SMU73_MAX_LEVELS_GRAPHICS]; 265*4882a593Smuzhiyun uint16_t LevelSwitchCounters [SMU73_MAX_LEVELS_GRAPHICS]; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun void (*TargetStateCalculator)(uint8_t); 268*4882a593Smuzhiyun void (*SavedTargetStateCalculator)(uint8_t); 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun uint16_t AutoDpmInterval; 271*4882a593Smuzhiyun uint16_t AutoDpmRange; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun uint8_t FpsEnabled; 274*4882a593Smuzhiyun uint8_t MaxPerfLevel; 275*4882a593Smuzhiyun uint8_t AllowLowClkInterruptToHost; 276*4882a593Smuzhiyun uint8_t FpsRunning; 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun uint32_t MaxAllowedFrequency; 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun uint32_t FilteredSclkFrequency; 281*4882a593Smuzhiyun uint32_t LastSclkFrequency; 282*4882a593Smuzhiyun uint32_t FilteredSclkFrequencyCnt; 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun uint8_t LedEnable; 285*4882a593Smuzhiyun uint8_t LedPin0; 286*4882a593Smuzhiyun uint8_t LedPin1; 287*4882a593Smuzhiyun uint8_t LedPin2; 288*4882a593Smuzhiyun uint32_t LedAndMask; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun uint16_t FpsAlpha; 291*4882a593Smuzhiyun uint16_t DeltaTime; 292*4882a593Smuzhiyun uint32_t CurrentFps; 293*4882a593Smuzhiyun uint32_t FilteredFps; 294*4882a593Smuzhiyun uint32_t FrameCount; 295*4882a593Smuzhiyun uint32_t FrameCountLast; 296*4882a593Smuzhiyun uint16_t FpsTargetScalar; 297*4882a593Smuzhiyun uint16_t FpsWaterfallLimitScalar; 298*4882a593Smuzhiyun uint16_t FpsAlphaScalar; 299*4882a593Smuzhiyun uint16_t spare8; 300*4882a593Smuzhiyun SMU7_HystController_Data HystControllerData; 301*4882a593Smuzhiyun }; 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun typedef struct SMU7_LocalDpmScoreboard SMU7_LocalDpmScoreboard; 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun #define SMU7_MAX_VOLTAGE_CLIENTS 12 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun typedef uint8_t (*VoltageChangeHandler_t)(uint16_t, uint8_t); 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun #define VDDC_MASK 0x00007FFF 310*4882a593Smuzhiyun #define VDDC_SHIFT 0 311*4882a593Smuzhiyun #define VDDCI_MASK 0x3FFF8000 312*4882a593Smuzhiyun #define VDDCI_SHIFT 15 313*4882a593Smuzhiyun #define PHASES_MASK 0xC0000000 314*4882a593Smuzhiyun #define PHASES_SHIFT 30 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun typedef uint32_t SMU_VoltageLevel; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun struct SMU7_VoltageScoreboard 319*4882a593Smuzhiyun { 320*4882a593Smuzhiyun SMU_VoltageLevel TargetVoltage; 321*4882a593Smuzhiyun uint16_t MaxVid; 322*4882a593Smuzhiyun uint8_t HighestVidOffset; 323*4882a593Smuzhiyun uint8_t CurrentVidOffset; 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun uint16_t CurrentVddc; 326*4882a593Smuzhiyun uint16_t CurrentVddci; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun uint8_t ControllerBusy; 330*4882a593Smuzhiyun uint8_t CurrentVid; 331*4882a593Smuzhiyun uint8_t CurrentVddciVid; 332*4882a593Smuzhiyun uint8_t padding; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun SMU_VoltageLevel RequestedVoltage[SMU7_MAX_VOLTAGE_CLIENTS]; 335*4882a593Smuzhiyun SMU_VoltageLevel TargetVoltageState; 336*4882a593Smuzhiyun uint8_t EnabledRequest[SMU7_MAX_VOLTAGE_CLIENTS]; 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun uint8_t padding2; 339*4882a593Smuzhiyun uint8_t padding3; 340*4882a593Smuzhiyun uint8_t ControllerEnable; 341*4882a593Smuzhiyun uint8_t ControllerRunning; 342*4882a593Smuzhiyun uint16_t CurrentStdVoltageHiSidd; 343*4882a593Smuzhiyun uint16_t CurrentStdVoltageLoSidd; 344*4882a593Smuzhiyun uint8_t OverrideVoltage; 345*4882a593Smuzhiyun uint8_t padding4; 346*4882a593Smuzhiyun uint8_t padding5; 347*4882a593Smuzhiyun uint8_t CurrentPhases; 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun VoltageChangeHandler_t ChangeVddc; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun VoltageChangeHandler_t ChangeVddci; 352*4882a593Smuzhiyun VoltageChangeHandler_t ChangePhase; 353*4882a593Smuzhiyun VoltageChangeHandler_t ChangeMvdd; 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun VoltageChangeHandler_t functionLinks[6]; 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun uint16_t * VddcFollower1; 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun int16_t Driver_OD_RequestedVidOffset1; 360*4882a593Smuzhiyun int16_t Driver_OD_RequestedVidOffset2; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun }; 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun typedef struct SMU7_VoltageScoreboard SMU7_VoltageScoreboard; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun // ------------------------------------------------------------------------------------------------------------------------- 367*4882a593Smuzhiyun #define SMU7_MAX_PCIE_LINK_SPEEDS 3 /* 0:Gen1 1:Gen2 2:Gen3 */ 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun struct SMU7_PCIeLinkSpeedScoreboard 370*4882a593Smuzhiyun { 371*4882a593Smuzhiyun uint8_t DpmEnable; 372*4882a593Smuzhiyun uint8_t DpmRunning; 373*4882a593Smuzhiyun uint8_t DpmForce; 374*4882a593Smuzhiyun uint8_t DpmForceLevel; 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun uint8_t CurrentLinkSpeed; 377*4882a593Smuzhiyun uint8_t EnabledLevelsChange; 378*4882a593Smuzhiyun uint16_t AutoDpmInterval; 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun uint16_t AutoDpmRange; 381*4882a593Smuzhiyun uint16_t AutoDpmCount; 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun uint8_t DpmMode; 384*4882a593Smuzhiyun uint8_t AcpiReq; 385*4882a593Smuzhiyun uint8_t AcpiAck; 386*4882a593Smuzhiyun uint8_t CurrentLinkLevel; 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun }; 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun typedef struct SMU7_PCIeLinkSpeedScoreboard SMU7_PCIeLinkSpeedScoreboard; 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun // -------------------------------------------------------- CAC table ------------------------------------------------------ 393*4882a593Smuzhiyun #define SMU7_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16 394*4882a593Smuzhiyun #define SMU7_LKGE_LUT_NUM_OF_VOLT_ENTRIES 16 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun #define SMU7_SCALE_I 7 397*4882a593Smuzhiyun #define SMU7_SCALE_R 12 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun struct SMU7_PowerScoreboard 400*4882a593Smuzhiyun { 401*4882a593Smuzhiyun uint32_t GpuPower; 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun uint32_t VddcPower; 404*4882a593Smuzhiyun uint32_t VddcVoltage; 405*4882a593Smuzhiyun uint32_t VddcCurrent; 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun uint32_t MvddPower; 408*4882a593Smuzhiyun uint32_t MvddVoltage; 409*4882a593Smuzhiyun uint32_t MvddCurrent; 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun uint32_t RocPower; 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun uint16_t Telemetry_1_slope; 414*4882a593Smuzhiyun uint16_t Telemetry_2_slope; 415*4882a593Smuzhiyun int32_t Telemetry_1_offset; 416*4882a593Smuzhiyun int32_t Telemetry_2_offset; 417*4882a593Smuzhiyun }; 418*4882a593Smuzhiyun typedef struct SMU7_PowerScoreboard SMU7_PowerScoreboard; 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun // For FeatureEnables: 421*4882a593Smuzhiyun #define SMU7_SCLK_DPM_CONFIG_MASK 0x01 422*4882a593Smuzhiyun #define SMU7_VOLTAGE_CONTROLLER_CONFIG_MASK 0x02 423*4882a593Smuzhiyun #define SMU7_THERMAL_CONTROLLER_CONFIG_MASK 0x04 424*4882a593Smuzhiyun #define SMU7_MCLK_DPM_CONFIG_MASK 0x08 425*4882a593Smuzhiyun #define SMU7_UVD_DPM_CONFIG_MASK 0x10 426*4882a593Smuzhiyun #define SMU7_VCE_DPM_CONFIG_MASK 0x20 427*4882a593Smuzhiyun #define SMU7_ACP_DPM_CONFIG_MASK 0x40 428*4882a593Smuzhiyun #define SMU7_SAMU_DPM_CONFIG_MASK 0x80 429*4882a593Smuzhiyun #define SMU7_PCIEGEN_DPM_CONFIG_MASK 0x100 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun #define SMU7_ACP_MCLK_HANDSHAKE_DISABLE 0x00000001 432*4882a593Smuzhiyun #define SMU7_ACP_SCLK_HANDSHAKE_DISABLE 0x00000002 433*4882a593Smuzhiyun #define SMU7_UVD_MCLK_HANDSHAKE_DISABLE 0x00000100 434*4882a593Smuzhiyun #define SMU7_UVD_SCLK_HANDSHAKE_DISABLE 0x00000200 435*4882a593Smuzhiyun #define SMU7_VCE_MCLK_HANDSHAKE_DISABLE 0x00010000 436*4882a593Smuzhiyun #define SMU7_VCE_SCLK_HANDSHAKE_DISABLE 0x00020000 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun // All 'soft registers' should be uint32_t. 439*4882a593Smuzhiyun struct SMU73_SoftRegisters 440*4882a593Smuzhiyun { 441*4882a593Smuzhiyun uint32_t RefClockFrequency; 442*4882a593Smuzhiyun uint32_t PmTimerPeriod; 443*4882a593Smuzhiyun uint32_t FeatureEnables; 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun uint32_t PreVBlankGap; 446*4882a593Smuzhiyun uint32_t VBlankTimeout; 447*4882a593Smuzhiyun uint32_t TrainTimeGap; 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun uint32_t MvddSwitchTime; 450*4882a593Smuzhiyun uint32_t LongestAcpiTrainTime; 451*4882a593Smuzhiyun uint32_t AcpiDelay; 452*4882a593Smuzhiyun uint32_t G5TrainTime; 453*4882a593Smuzhiyun uint32_t DelayMpllPwron; 454*4882a593Smuzhiyun uint32_t VoltageChangeTimeout; 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun uint32_t HandshakeDisables; 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun uint8_t DisplayPhy1Config; 459*4882a593Smuzhiyun uint8_t DisplayPhy2Config; 460*4882a593Smuzhiyun uint8_t DisplayPhy3Config; 461*4882a593Smuzhiyun uint8_t DisplayPhy4Config; 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun uint8_t DisplayPhy5Config; 464*4882a593Smuzhiyun uint8_t DisplayPhy6Config; 465*4882a593Smuzhiyun uint8_t DisplayPhy7Config; 466*4882a593Smuzhiyun uint8_t DisplayPhy8Config; 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun uint32_t AverageGraphicsActivity; 469*4882a593Smuzhiyun uint32_t AverageMemoryActivity; 470*4882a593Smuzhiyun uint32_t AverageGioActivity; 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun uint8_t SClkDpmEnabledLevels; 473*4882a593Smuzhiyun uint8_t MClkDpmEnabledLevels; 474*4882a593Smuzhiyun uint8_t LClkDpmEnabledLevels; 475*4882a593Smuzhiyun uint8_t PCIeDpmEnabledLevels; 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun uint8_t UVDDpmEnabledLevels; 478*4882a593Smuzhiyun uint8_t SAMUDpmEnabledLevels; 479*4882a593Smuzhiyun uint8_t ACPDpmEnabledLevels; 480*4882a593Smuzhiyun uint8_t VCEDpmEnabledLevels; 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun uint32_t DRAM_LOG_ADDR_H; 483*4882a593Smuzhiyun uint32_t DRAM_LOG_ADDR_L; 484*4882a593Smuzhiyun uint32_t DRAM_LOG_PHY_ADDR_H; 485*4882a593Smuzhiyun uint32_t DRAM_LOG_PHY_ADDR_L; 486*4882a593Smuzhiyun uint32_t DRAM_LOG_BUFF_SIZE; 487*4882a593Smuzhiyun uint32_t UlvEnterCount; 488*4882a593Smuzhiyun uint32_t UlvTime; 489*4882a593Smuzhiyun uint32_t UcodeLoadStatus; 490*4882a593Smuzhiyun uint32_t Reserved[2]; 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun }; 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun typedef struct SMU73_SoftRegisters SMU73_SoftRegisters; 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun struct SMU73_Firmware_Header 497*4882a593Smuzhiyun { 498*4882a593Smuzhiyun uint32_t Digest[5]; 499*4882a593Smuzhiyun uint32_t Version; 500*4882a593Smuzhiyun uint32_t HeaderSize; 501*4882a593Smuzhiyun uint32_t Flags; 502*4882a593Smuzhiyun uint32_t EntryPoint; 503*4882a593Smuzhiyun uint32_t CodeSize; 504*4882a593Smuzhiyun uint32_t ImageSize; 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun uint32_t Rtos; 507*4882a593Smuzhiyun uint32_t SoftRegisters; 508*4882a593Smuzhiyun uint32_t DpmTable; 509*4882a593Smuzhiyun uint32_t FanTable; 510*4882a593Smuzhiyun uint32_t CacConfigTable; 511*4882a593Smuzhiyun uint32_t CacStatusTable; 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun uint32_t mcRegisterTable; 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun uint32_t mcArbDramTimingTable; 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun uint32_t PmFuseTable; 523*4882a593Smuzhiyun uint32_t Globals; 524*4882a593Smuzhiyun uint32_t ClockStretcherTable; 525*4882a593Smuzhiyun uint32_t Reserved[41]; 526*4882a593Smuzhiyun uint32_t Signature; 527*4882a593Smuzhiyun }; 528*4882a593Smuzhiyun 529*4882a593Smuzhiyun typedef struct SMU73_Firmware_Header SMU73_Firmware_Header; 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun #define SMU7_FIRMWARE_HEADER_LOCATION 0x20000 532*4882a593Smuzhiyun 533*4882a593Smuzhiyun enum DisplayConfig { 534*4882a593Smuzhiyun PowerDown = 1, 535*4882a593Smuzhiyun DP54x4, 536*4882a593Smuzhiyun DP54x2, 537*4882a593Smuzhiyun DP54x1, 538*4882a593Smuzhiyun DP27x4, 539*4882a593Smuzhiyun DP27x2, 540*4882a593Smuzhiyun DP27x1, 541*4882a593Smuzhiyun HDMI297, 542*4882a593Smuzhiyun HDMI162, 543*4882a593Smuzhiyun LVDS, 544*4882a593Smuzhiyun DP324x4, 545*4882a593Smuzhiyun DP324x2, 546*4882a593Smuzhiyun DP324x1 547*4882a593Smuzhiyun }; 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun #define MC_BLOCK_COUNT 1 551*4882a593Smuzhiyun #define CPL_BLOCK_COUNT 5 552*4882a593Smuzhiyun #define SE_BLOCK_COUNT 15 553*4882a593Smuzhiyun #define GC_BLOCK_COUNT 24 554*4882a593Smuzhiyun 555*4882a593Smuzhiyun struct SMU7_Local_Cac { 556*4882a593Smuzhiyun uint8_t BlockId; 557*4882a593Smuzhiyun uint8_t SignalId; 558*4882a593Smuzhiyun uint8_t Threshold; 559*4882a593Smuzhiyun uint8_t Padding; 560*4882a593Smuzhiyun }; 561*4882a593Smuzhiyun 562*4882a593Smuzhiyun typedef struct SMU7_Local_Cac SMU7_Local_Cac; 563*4882a593Smuzhiyun 564*4882a593Smuzhiyun struct SMU7_Local_Cac_Table { 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun SMU7_Local_Cac CplLocalCac[CPL_BLOCK_COUNT]; 567*4882a593Smuzhiyun SMU7_Local_Cac McLocalCac[MC_BLOCK_COUNT]; 568*4882a593Smuzhiyun SMU7_Local_Cac SeLocalCac[SE_BLOCK_COUNT]; 569*4882a593Smuzhiyun SMU7_Local_Cac GcLocalCac[GC_BLOCK_COUNT]; 570*4882a593Smuzhiyun }; 571*4882a593Smuzhiyun 572*4882a593Smuzhiyun typedef struct SMU7_Local_Cac_Table SMU7_Local_Cac_Table; 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun #if !defined(SMC_MICROCODE) 575*4882a593Smuzhiyun #pragma pack(pop) 576*4882a593Smuzhiyun #endif 577*4882a593Smuzhiyun 578*4882a593Smuzhiyun // Description of Clock Gating bitmask for Tonga: 579*4882a593Smuzhiyun // System Clock Gating 580*4882a593Smuzhiyun #define CG_SYS_BITMASK_FIRST_BIT 0 // First bit of Sys CG bitmask 581*4882a593Smuzhiyun #define CG_SYS_BITMASK_LAST_BIT 9 // Last bit of Sys CG bitmask 582*4882a593Smuzhiyun #define CG_SYS_BIF_MGLS_SHIFT 0 583*4882a593Smuzhiyun #define CG_SYS_ROM_SHIFT 1 584*4882a593Smuzhiyun #define CG_SYS_MC_MGCG_SHIFT 2 585*4882a593Smuzhiyun #define CG_SYS_MC_MGLS_SHIFT 3 586*4882a593Smuzhiyun #define CG_SYS_SDMA_MGCG_SHIFT 4 587*4882a593Smuzhiyun #define CG_SYS_SDMA_MGLS_SHIFT 5 588*4882a593Smuzhiyun #define CG_SYS_DRM_MGCG_SHIFT 6 589*4882a593Smuzhiyun #define CG_SYS_HDP_MGCG_SHIFT 7 590*4882a593Smuzhiyun #define CG_SYS_HDP_MGLS_SHIFT 8 591*4882a593Smuzhiyun #define CG_SYS_DRM_MGLS_SHIFT 9 592*4882a593Smuzhiyun 593*4882a593Smuzhiyun #define CG_SYS_BIF_MGLS_MASK 0x1 594*4882a593Smuzhiyun #define CG_SYS_ROM_MASK 0x2 595*4882a593Smuzhiyun #define CG_SYS_MC_MGCG_MASK 0x4 596*4882a593Smuzhiyun #define CG_SYS_MC_MGLS_MASK 0x8 597*4882a593Smuzhiyun #define CG_SYS_SDMA_MGCG_MASK 0x10 598*4882a593Smuzhiyun #define CG_SYS_SDMA_MGLS_MASK 0x20 599*4882a593Smuzhiyun #define CG_SYS_DRM_MGCG_MASK 0x40 600*4882a593Smuzhiyun #define CG_SYS_HDP_MGCG_MASK 0x80 601*4882a593Smuzhiyun #define CG_SYS_HDP_MGLS_MASK 0x100 602*4882a593Smuzhiyun #define CG_SYS_DRM_MGLS_MASK 0x200 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun // Graphics Clock Gating 605*4882a593Smuzhiyun #define CG_GFX_BITMASK_FIRST_BIT 16 // First bit of Gfx CG bitmask 606*4882a593Smuzhiyun #define CG_GFX_BITMASK_LAST_BIT 20 // Last bit of Gfx CG bitmask 607*4882a593Smuzhiyun #define CG_GFX_CGCG_SHIFT 16 608*4882a593Smuzhiyun #define CG_GFX_CGLS_SHIFT 17 609*4882a593Smuzhiyun #define CG_CPF_MGCG_SHIFT 18 610*4882a593Smuzhiyun #define CG_RLC_MGCG_SHIFT 19 611*4882a593Smuzhiyun #define CG_GFX_OTHERS_MGCG_SHIFT 20 612*4882a593Smuzhiyun 613*4882a593Smuzhiyun #define CG_GFX_CGCG_MASK 0x00010000 614*4882a593Smuzhiyun #define CG_GFX_CGLS_MASK 0x00020000 615*4882a593Smuzhiyun #define CG_CPF_MGCG_MASK 0x00040000 616*4882a593Smuzhiyun #define CG_RLC_MGCG_MASK 0x00080000 617*4882a593Smuzhiyun #define CG_GFX_OTHERS_MGCG_MASK 0x00100000 618*4882a593Smuzhiyun 619*4882a593Smuzhiyun 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun // Voltage Regulator Configuration 622*4882a593Smuzhiyun // VR Config info is contained in dpmTable.VRConfig 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun #define VRCONF_VDDC_MASK 0x000000FF 625*4882a593Smuzhiyun #define VRCONF_VDDC_SHIFT 0 626*4882a593Smuzhiyun #define VRCONF_VDDGFX_MASK 0x0000FF00 627*4882a593Smuzhiyun #define VRCONF_VDDGFX_SHIFT 8 628*4882a593Smuzhiyun #define VRCONF_VDDCI_MASK 0x00FF0000 629*4882a593Smuzhiyun #define VRCONF_VDDCI_SHIFT 16 630*4882a593Smuzhiyun #define VRCONF_MVDD_MASK 0xFF000000 631*4882a593Smuzhiyun #define VRCONF_MVDD_SHIFT 24 632*4882a593Smuzhiyun 633*4882a593Smuzhiyun #define VR_MERGED_WITH_VDDC 0 634*4882a593Smuzhiyun #define VR_SVI2_PLANE_1 1 635*4882a593Smuzhiyun #define VR_SVI2_PLANE_2 2 636*4882a593Smuzhiyun #define VR_SMIO_PATTERN_1 3 637*4882a593Smuzhiyun #define VR_SMIO_PATTERN_2 4 638*4882a593Smuzhiyun #define VR_STATIC_VOLTAGE 5 639*4882a593Smuzhiyun 640*4882a593Smuzhiyun // Clock Stretcher Configuration 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun #define CLOCK_STRETCHER_MAX_ENTRIES 0x4 643*4882a593Smuzhiyun #define CKS_LOOKUPTable_MAX_ENTRIES 0x4 644*4882a593Smuzhiyun 645*4882a593Smuzhiyun // The 'settings' field is subdivided in the following way: 646*4882a593Smuzhiyun #define CLOCK_STRETCHER_SETTING_DDT_MASK 0x01 647*4882a593Smuzhiyun #define CLOCK_STRETCHER_SETTING_DDT_SHIFT 0x0 648*4882a593Smuzhiyun #define CLOCK_STRETCHER_SETTING_STRETCH_AMOUNT_MASK 0x1E 649*4882a593Smuzhiyun #define CLOCK_STRETCHER_SETTING_STRETCH_AMOUNT_SHIFT 0x1 650*4882a593Smuzhiyun #define CLOCK_STRETCHER_SETTING_ENABLE_MASK 0x80 651*4882a593Smuzhiyun #define CLOCK_STRETCHER_SETTING_ENABLE_SHIFT 0x7 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun struct SMU_ClockStretcherDataTableEntry { 654*4882a593Smuzhiyun uint8_t minVID; 655*4882a593Smuzhiyun uint8_t maxVID; 656*4882a593Smuzhiyun 657*4882a593Smuzhiyun 658*4882a593Smuzhiyun uint16_t setting; 659*4882a593Smuzhiyun }; 660*4882a593Smuzhiyun typedef struct SMU_ClockStretcherDataTableEntry SMU_ClockStretcherDataTableEntry; 661*4882a593Smuzhiyun 662*4882a593Smuzhiyun struct SMU_ClockStretcherDataTable { 663*4882a593Smuzhiyun SMU_ClockStretcherDataTableEntry ClockStretcherDataTableEntry[CLOCK_STRETCHER_MAX_ENTRIES]; 664*4882a593Smuzhiyun }; 665*4882a593Smuzhiyun typedef struct SMU_ClockStretcherDataTable SMU_ClockStretcherDataTable; 666*4882a593Smuzhiyun 667*4882a593Smuzhiyun struct SMU_CKS_LOOKUPTableEntry { 668*4882a593Smuzhiyun uint16_t minFreq; 669*4882a593Smuzhiyun uint16_t maxFreq; 670*4882a593Smuzhiyun 671*4882a593Smuzhiyun uint8_t setting; 672*4882a593Smuzhiyun uint8_t padding[3]; 673*4882a593Smuzhiyun }; 674*4882a593Smuzhiyun typedef struct SMU_CKS_LOOKUPTableEntry SMU_CKS_LOOKUPTableEntry; 675*4882a593Smuzhiyun 676*4882a593Smuzhiyun struct SMU_CKS_LOOKUPTable { 677*4882a593Smuzhiyun SMU_CKS_LOOKUPTableEntry CKS_LOOKUPTableEntry[CKS_LOOKUPTable_MAX_ENTRIES]; 678*4882a593Smuzhiyun }; 679*4882a593Smuzhiyun typedef struct SMU_CKS_LOOKUPTable SMU_CKS_LOOKUPTable; 680*4882a593Smuzhiyun 681*4882a593Smuzhiyun struct AgmAvfsData_t { 682*4882a593Smuzhiyun uint16_t avgPsmCount[28]; 683*4882a593Smuzhiyun uint16_t minPsmCount[28]; 684*4882a593Smuzhiyun }; 685*4882a593Smuzhiyun typedef struct AgmAvfsData_t AgmAvfsData_t; 686*4882a593Smuzhiyun 687*4882a593Smuzhiyun // AVFS DEFINES 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun enum VFT_COLUMNS { 690*4882a593Smuzhiyun SCLK0, 691*4882a593Smuzhiyun SCLK1, 692*4882a593Smuzhiyun SCLK2, 693*4882a593Smuzhiyun SCLK3, 694*4882a593Smuzhiyun SCLK4, 695*4882a593Smuzhiyun SCLK5, 696*4882a593Smuzhiyun SCLK6, 697*4882a593Smuzhiyun SCLK7, 698*4882a593Smuzhiyun 699*4882a593Smuzhiyun NUM_VFT_COLUMNS 700*4882a593Smuzhiyun }; 701*4882a593Smuzhiyun 702*4882a593Smuzhiyun #define TEMP_RANGE_MAXSTEPS 12 703*4882a593Smuzhiyun struct VFT_CELL_t { 704*4882a593Smuzhiyun uint16_t Voltage; 705*4882a593Smuzhiyun }; 706*4882a593Smuzhiyun 707*4882a593Smuzhiyun typedef struct VFT_CELL_t VFT_CELL_t; 708*4882a593Smuzhiyun 709*4882a593Smuzhiyun struct VFT_TABLE_t { 710*4882a593Smuzhiyun VFT_CELL_t Cell[TEMP_RANGE_MAXSTEPS][NUM_VFT_COLUMNS]; 711*4882a593Smuzhiyun uint16_t AvfsGbv [NUM_VFT_COLUMNS]; 712*4882a593Smuzhiyun uint16_t BtcGbv [NUM_VFT_COLUMNS]; 713*4882a593Smuzhiyun uint16_t Temperature [TEMP_RANGE_MAXSTEPS]; 714*4882a593Smuzhiyun 715*4882a593Smuzhiyun uint8_t NumTemperatureSteps; 716*4882a593Smuzhiyun uint8_t padding[3]; 717*4882a593Smuzhiyun }; 718*4882a593Smuzhiyun typedef struct VFT_TABLE_t VFT_TABLE_t; 719*4882a593Smuzhiyun 720*4882a593Smuzhiyun #endif 721