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