1770911a3SEric Huang /* 2770911a3SEric Huang * Copyright 2015 Advanced Micro Devices, Inc. 3770911a3SEric Huang * 4770911a3SEric Huang * Permission is hereby granted, free of charge, to any person obtaining a 5770911a3SEric Huang * copy of this software and associated documentation files (the "Software"), 6770911a3SEric Huang * to deal in the Software without restriction, including without limitation 7770911a3SEric Huang * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8770911a3SEric Huang * and/or sell copies of the Software, and to permit persons to whom the 9770911a3SEric Huang * Software is furnished to do so, subject to the following conditions: 10770911a3SEric Huang * 11770911a3SEric Huang * The above copyright notice and this permission notice shall be included in 12770911a3SEric Huang * all copies or substantial portions of the Software. 13770911a3SEric Huang * 14770911a3SEric Huang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15770911a3SEric Huang * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16770911a3SEric Huang * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17770911a3SEric Huang * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18770911a3SEric Huang * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19770911a3SEric Huang * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20770911a3SEric Huang * OTHER DEALINGS IN THE SOFTWARE. 21770911a3SEric Huang * 22770911a3SEric Huang */ 23770911a3SEric Huang #ifndef _SMU73_H_ 24770911a3SEric Huang #define _SMU73_H_ 25770911a3SEric Huang 26770911a3SEric Huang #pragma pack(push, 1) 27770911a3SEric Huang enum SID_OPTION { 28770911a3SEric Huang SID_OPTION_HI, 29770911a3SEric Huang SID_OPTION_LO, 30770911a3SEric Huang SID_OPTION_COUNT 31770911a3SEric Huang }; 32770911a3SEric Huang 33770911a3SEric Huang enum Poly3rdOrderCoeff { 34770911a3SEric Huang LEAKAGE_TEMPERATURE_SCALAR, 35770911a3SEric Huang LEAKAGE_VOLTAGE_SCALAR, 36770911a3SEric Huang DYNAMIC_VOLTAGE_SCALAR, 37770911a3SEric Huang POLY_3RD_ORDER_COUNT 38770911a3SEric Huang }; 39770911a3SEric Huang 40d1a04161SRan Sun struct SMU7_Poly3rdOrder_Data { 41770911a3SEric Huang int32_t a; 42770911a3SEric Huang int32_t b; 43770911a3SEric Huang int32_t c; 44770911a3SEric Huang int32_t d; 45770911a3SEric Huang uint8_t a_shift; 46770911a3SEric Huang uint8_t b_shift; 47770911a3SEric Huang uint8_t c_shift; 48770911a3SEric Huang uint8_t x_shift; 49770911a3SEric Huang }; 50770911a3SEric Huang 51770911a3SEric Huang typedef struct SMU7_Poly3rdOrder_Data SMU7_Poly3rdOrder_Data; 52770911a3SEric Huang 53d1a04161SRan Sun struct Power_Calculator_Data { 54770911a3SEric Huang uint16_t NoLoadVoltage; 55770911a3SEric Huang uint16_t LoadVoltage; 56770911a3SEric Huang uint16_t Resistance; 57770911a3SEric Huang uint16_t Temperature; 58770911a3SEric Huang uint16_t BaseLeakage; 59770911a3SEric Huang uint16_t LkgTempScalar; 60770911a3SEric Huang uint16_t LkgVoltScalar; 61770911a3SEric Huang uint16_t LkgAreaScalar; 62770911a3SEric Huang uint16_t LkgPower; 63770911a3SEric Huang uint16_t DynVoltScalar; 64770911a3SEric Huang uint32_t Cac; 65770911a3SEric Huang uint32_t DynPower; 66770911a3SEric Huang uint32_t TotalCurrent; 67770911a3SEric Huang uint32_t TotalPower; 68770911a3SEric Huang }; 69770911a3SEric Huang 70770911a3SEric Huang typedef struct Power_Calculator_Data PowerCalculatorData_t; 71770911a3SEric Huang 72d1a04161SRan Sun struct Gc_Cac_Weight_Data { 73770911a3SEric Huang uint8_t index; 74770911a3SEric Huang uint32_t value; 75770911a3SEric Huang }; 76770911a3SEric Huang 77770911a3SEric Huang typedef struct Gc_Cac_Weight_Data GcCacWeight_Data; 78770911a3SEric Huang 79770911a3SEric Huang 80770911a3SEric Huang typedef struct { 81770911a3SEric Huang uint32_t high; 82770911a3SEric Huang uint32_t low; 83770911a3SEric Huang } data_64_t; 84770911a3SEric Huang 85770911a3SEric Huang typedef struct { 86770911a3SEric Huang data_64_t high; 87770911a3SEric Huang data_64_t low; 88770911a3SEric Huang } data_128_t; 89770911a3SEric Huang 90770911a3SEric Huang #define SMU__NUM_SCLK_DPM_STATE 8 91770911a3SEric Huang #define SMU__NUM_MCLK_DPM_LEVELS 4 92770911a3SEric Huang #define SMU__NUM_LCLK_DPM_LEVELS 8 93770911a3SEric Huang #define SMU__NUM_PCIE_DPM_LEVELS 8 94770911a3SEric Huang 95770911a3SEric Huang #define SMU7_CONTEXT_ID_SMC 1 96770911a3SEric Huang #define SMU7_CONTEXT_ID_VBIOS 2 97770911a3SEric Huang 98770911a3SEric Huang #define SMU73_MAX_LEVELS_VDDC 16 99770911a3SEric Huang #define SMU73_MAX_LEVELS_VDDGFX 16 100770911a3SEric Huang #define SMU73_MAX_LEVELS_VDDCI 8 101770911a3SEric Huang #define SMU73_MAX_LEVELS_MVDD 4 102770911a3SEric Huang 103770911a3SEric Huang #define SMU_MAX_SMIO_LEVELS 4 104770911a3SEric Huang 105770911a3SEric Huang #define SMU73_MAX_LEVELS_GRAPHICS SMU__NUM_SCLK_DPM_STATE // SCLK + SQ DPM + ULV 106770911a3SEric Huang #define SMU73_MAX_LEVELS_MEMORY SMU__NUM_MCLK_DPM_LEVELS // MCLK Levels DPM 107770911a3SEric Huang #define SMU73_MAX_LEVELS_GIO SMU__NUM_LCLK_DPM_LEVELS // LCLK Levels 108770911a3SEric Huang #define SMU73_MAX_LEVELS_LINK SMU__NUM_PCIE_DPM_LEVELS // PCIe speed and number of lanes. 109770911a3SEric Huang #define SMU73_MAX_LEVELS_UVD 8 // VCLK/DCLK levels for UVD. 110770911a3SEric Huang #define SMU73_MAX_LEVELS_VCE 8 // ECLK levels for VCE. 111770911a3SEric Huang #define SMU73_MAX_LEVELS_ACP 8 // ACLK levels for ACP. 112770911a3SEric Huang #define SMU73_MAX_LEVELS_SAMU 8 // SAMCLK levels for SAMU. 113770911a3SEric Huang #define SMU73_MAX_ENTRIES_SMIO 32 // Number of entries in SMIO table. 114770911a3SEric Huang 115770911a3SEric Huang #define DPM_NO_LIMIT 0 116770911a3SEric Huang #define DPM_NO_UP 1 117770911a3SEric Huang #define DPM_GO_DOWN 2 118770911a3SEric Huang #define DPM_GO_UP 3 119770911a3SEric Huang 120770911a3SEric Huang #define SMU7_FIRST_DPM_GRAPHICS_LEVEL 0 121770911a3SEric Huang #define SMU7_FIRST_DPM_MEMORY_LEVEL 0 122770911a3SEric Huang 123770911a3SEric Huang #define GPIO_CLAMP_MODE_VRHOT 1 124770911a3SEric Huang #define GPIO_CLAMP_MODE_THERM 2 125770911a3SEric Huang #define GPIO_CLAMP_MODE_DC 4 126770911a3SEric Huang 127770911a3SEric Huang #define SCRATCH_B_TARG_PCIE_INDEX_SHIFT 0 128770911a3SEric Huang #define SCRATCH_B_TARG_PCIE_INDEX_MASK (0x7<<SCRATCH_B_TARG_PCIE_INDEX_SHIFT) 129770911a3SEric Huang #define SCRATCH_B_CURR_PCIE_INDEX_SHIFT 3 130770911a3SEric Huang #define SCRATCH_B_CURR_PCIE_INDEX_MASK (0x7<<SCRATCH_B_CURR_PCIE_INDEX_SHIFT) 131770911a3SEric Huang #define SCRATCH_B_TARG_UVD_INDEX_SHIFT 6 132770911a3SEric Huang #define SCRATCH_B_TARG_UVD_INDEX_MASK (0x7<<SCRATCH_B_TARG_UVD_INDEX_SHIFT) 133770911a3SEric Huang #define SCRATCH_B_CURR_UVD_INDEX_SHIFT 9 134770911a3SEric Huang #define SCRATCH_B_CURR_UVD_INDEX_MASK (0x7<<SCRATCH_B_CURR_UVD_INDEX_SHIFT) 135770911a3SEric Huang #define SCRATCH_B_TARG_VCE_INDEX_SHIFT 12 136770911a3SEric Huang #define SCRATCH_B_TARG_VCE_INDEX_MASK (0x7<<SCRATCH_B_TARG_VCE_INDEX_SHIFT) 137770911a3SEric Huang #define SCRATCH_B_CURR_VCE_INDEX_SHIFT 15 138770911a3SEric Huang #define SCRATCH_B_CURR_VCE_INDEX_MASK (0x7<<SCRATCH_B_CURR_VCE_INDEX_SHIFT) 139770911a3SEric Huang #define SCRATCH_B_TARG_ACP_INDEX_SHIFT 18 140770911a3SEric Huang #define SCRATCH_B_TARG_ACP_INDEX_MASK (0x7<<SCRATCH_B_TARG_ACP_INDEX_SHIFT) 141770911a3SEric Huang #define SCRATCH_B_CURR_ACP_INDEX_SHIFT 21 142770911a3SEric Huang #define SCRATCH_B_CURR_ACP_INDEX_MASK (0x7<<SCRATCH_B_CURR_ACP_INDEX_SHIFT) 143770911a3SEric Huang #define SCRATCH_B_TARG_SAMU_INDEX_SHIFT 24 144770911a3SEric Huang #define SCRATCH_B_TARG_SAMU_INDEX_MASK (0x7<<SCRATCH_B_TARG_SAMU_INDEX_SHIFT) 145770911a3SEric Huang #define SCRATCH_B_CURR_SAMU_INDEX_SHIFT 27 146770911a3SEric Huang #define SCRATCH_B_CURR_SAMU_INDEX_MASK (0x7<<SCRATCH_B_CURR_SAMU_INDEX_SHIFT) 147770911a3SEric Huang 148770911a3SEric Huang // Virtualization Defines 149770911a3SEric Huang #define CG_XDMA_MASK 0x1 150770911a3SEric Huang #define CG_XDMA_SHIFT 0 151770911a3SEric Huang #define CG_UVD_MASK 0x2 152770911a3SEric Huang #define CG_UVD_SHIFT 1 153770911a3SEric Huang #define CG_VCE_MASK 0x4 154770911a3SEric Huang #define CG_VCE_SHIFT 2 155770911a3SEric Huang #define CG_SAMU_MASK 0x8 156770911a3SEric Huang #define CG_SAMU_SHIFT 3 157770911a3SEric Huang #define CG_GFX_MASK 0x10 158770911a3SEric Huang #define CG_GFX_SHIFT 4 159770911a3SEric Huang #define CG_SDMA_MASK 0x20 160770911a3SEric Huang #define CG_SDMA_SHIFT 5 161770911a3SEric Huang #define CG_HDP_MASK 0x40 162770911a3SEric Huang #define CG_HDP_SHIFT 6 163770911a3SEric Huang #define CG_MC_MASK 0x80 164770911a3SEric Huang #define CG_MC_SHIFT 7 165770911a3SEric Huang #define CG_DRM_MASK 0x100 166770911a3SEric Huang #define CG_DRM_SHIFT 8 167770911a3SEric Huang #define CG_ROM_MASK 0x200 168770911a3SEric Huang #define CG_ROM_SHIFT 9 169770911a3SEric Huang #define CG_BIF_MASK 0x400 170770911a3SEric Huang #define CG_BIF_SHIFT 10 171770911a3SEric Huang 172770911a3SEric Huang #define SMU73_DTE_ITERATIONS 5 173770911a3SEric Huang #define SMU73_DTE_SOURCES 3 174770911a3SEric Huang #define SMU73_DTE_SINKS 1 175770911a3SEric Huang #define SMU73_NUM_CPU_TES 0 176770911a3SEric Huang #define SMU73_NUM_GPU_TES 1 177770911a3SEric Huang #define SMU73_NUM_NON_TES 2 178770911a3SEric Huang #define SMU73_DTE_FAN_SCALAR_MIN 0x100 179770911a3SEric Huang #define SMU73_DTE_FAN_SCALAR_MAX 0x166 180770911a3SEric Huang #define SMU73_DTE_FAN_TEMP_MAX 93 181770911a3SEric Huang #define SMU73_DTE_FAN_TEMP_MIN 83 182770911a3SEric Huang 183770911a3SEric Huang #define SMU73_THERMAL_INPUT_LOOP_COUNT 6 184770911a3SEric Huang #define SMU73_THERMAL_CLAMP_MODE_COUNT 8 185770911a3SEric Huang 186770911a3SEric Huang 187d1a04161SRan Sun struct SMU7_HystController_Data { 188770911a3SEric Huang uint16_t waterfall_up; 189770911a3SEric Huang uint16_t waterfall_down; 190770911a3SEric Huang uint16_t waterfall_limit; 191770911a3SEric Huang uint16_t release_cnt; 192770911a3SEric Huang uint16_t release_limit; 193770911a3SEric Huang uint16_t spare; 194770911a3SEric Huang }; 195770911a3SEric Huang 196770911a3SEric Huang typedef struct SMU7_HystController_Data SMU7_HystController_Data; 197770911a3SEric Huang 198d1a04161SRan Sun struct SMU73_PIDController { 199770911a3SEric Huang uint32_t Ki; 200770911a3SEric Huang int32_t LFWindupUpperLim; 201770911a3SEric Huang int32_t LFWindupLowerLim; 202770911a3SEric Huang uint32_t StatePrecision; 203770911a3SEric Huang 204770911a3SEric Huang uint32_t LfPrecision; 205770911a3SEric Huang uint32_t LfOffset; 206770911a3SEric Huang uint32_t MaxState; 207770911a3SEric Huang uint32_t MaxLfFraction; 208770911a3SEric Huang uint32_t StateShift; 209770911a3SEric Huang }; 210770911a3SEric Huang 211770911a3SEric Huang typedef struct SMU73_PIDController SMU73_PIDController; 212770911a3SEric Huang 213d1a04161SRan Sun struct SMU7_LocalDpmScoreboard { 214770911a3SEric Huang uint32_t PercentageBusy; 215770911a3SEric Huang 216770911a3SEric Huang int32_t PIDError; 217770911a3SEric Huang int32_t PIDIntegral; 218770911a3SEric Huang int32_t PIDOutput; 219770911a3SEric Huang 220770911a3SEric Huang uint32_t SigmaDeltaAccum; 221770911a3SEric Huang uint32_t SigmaDeltaOutput; 222770911a3SEric Huang uint32_t SigmaDeltaLevel; 223770911a3SEric Huang 224770911a3SEric Huang uint32_t UtilizationSetpoint; 225770911a3SEric Huang 226770911a3SEric Huang uint8_t TdpClampMode; 227770911a3SEric Huang uint8_t TdcClampMode; 228770911a3SEric Huang uint8_t ThermClampMode; 229770911a3SEric Huang uint8_t VoltageBusy; 230770911a3SEric Huang 231770911a3SEric Huang int8_t CurrLevel; 232770911a3SEric Huang int8_t TargLevel; 233770911a3SEric Huang uint8_t LevelChangeInProgress; 234770911a3SEric Huang uint8_t UpHyst; 235770911a3SEric Huang 236770911a3SEric Huang uint8_t DownHyst; 237770911a3SEric Huang uint8_t VoltageDownHyst; 238770911a3SEric Huang uint8_t DpmEnable; 239770911a3SEric Huang uint8_t DpmRunning; 240770911a3SEric Huang 241770911a3SEric Huang uint8_t DpmForce; 242770911a3SEric Huang uint8_t DpmForceLevel; 243770911a3SEric Huang uint8_t DisplayWatermark; 244770911a3SEric Huang uint8_t McArbIndex; 245770911a3SEric Huang 246770911a3SEric Huang uint32_t MinimumPerfSclk; 247770911a3SEric Huang 248770911a3SEric Huang uint8_t AcpiReq; 249770911a3SEric Huang uint8_t AcpiAck; 250770911a3SEric Huang uint8_t GfxClkSlow; 251770911a3SEric Huang uint8_t GpioClampMode; 252770911a3SEric Huang 253770911a3SEric Huang uint8_t spare2; 254770911a3SEric Huang uint8_t EnabledLevelsChange; 255770911a3SEric Huang uint8_t DteClampMode; 256770911a3SEric Huang uint8_t FpsClampMode; 257770911a3SEric Huang 258770911a3SEric Huang uint16_t LevelResidencyCounters[SMU73_MAX_LEVELS_GRAPHICS]; 259770911a3SEric Huang uint16_t LevelSwitchCounters[SMU73_MAX_LEVELS_GRAPHICS]; 260770911a3SEric Huang 261770911a3SEric Huang void (*TargetStateCalculator)(uint8_t); 262770911a3SEric Huang void (*SavedTargetStateCalculator)(uint8_t); 263770911a3SEric Huang 264770911a3SEric Huang uint16_t AutoDpmInterval; 265770911a3SEric Huang uint16_t AutoDpmRange; 266770911a3SEric Huang 267770911a3SEric Huang uint8_t FpsEnabled; 268770911a3SEric Huang uint8_t MaxPerfLevel; 269770911a3SEric Huang uint8_t AllowLowClkInterruptToHost; 270770911a3SEric Huang uint8_t FpsRunning; 271770911a3SEric Huang 272770911a3SEric Huang uint32_t MaxAllowedFrequency; 273770911a3SEric Huang 274770911a3SEric Huang uint32_t FilteredSclkFrequency; 275770911a3SEric Huang uint32_t LastSclkFrequency; 276770911a3SEric Huang uint32_t FilteredSclkFrequencyCnt; 277770911a3SEric Huang 278770911a3SEric Huang uint8_t LedEnable; 279770911a3SEric Huang uint8_t LedPin0; 280770911a3SEric Huang uint8_t LedPin1; 281770911a3SEric Huang uint8_t LedPin2; 282770911a3SEric Huang uint32_t LedAndMask; 283770911a3SEric Huang 284770911a3SEric Huang uint16_t FpsAlpha; 285770911a3SEric Huang uint16_t DeltaTime; 286770911a3SEric Huang uint32_t CurrentFps; 287770911a3SEric Huang uint32_t FilteredFps; 288770911a3SEric Huang uint32_t FrameCount; 289770911a3SEric Huang uint32_t FrameCountLast; 290770911a3SEric Huang uint16_t FpsTargetScalar; 291770911a3SEric Huang uint16_t FpsWaterfallLimitScalar; 292770911a3SEric Huang uint16_t FpsAlphaScalar; 293770911a3SEric Huang uint16_t spare8; 294770911a3SEric Huang SMU7_HystController_Data HystControllerData; 295770911a3SEric Huang }; 296770911a3SEric Huang 297770911a3SEric Huang typedef struct SMU7_LocalDpmScoreboard SMU7_LocalDpmScoreboard; 298770911a3SEric Huang 299770911a3SEric Huang #define SMU7_MAX_VOLTAGE_CLIENTS 12 300770911a3SEric Huang 301770911a3SEric Huang typedef uint8_t (*VoltageChangeHandler_t)(uint16_t, uint8_t); 302770911a3SEric Huang 303770911a3SEric Huang #define VDDC_MASK 0x00007FFF 304770911a3SEric Huang #define VDDC_SHIFT 0 305770911a3SEric Huang #define VDDCI_MASK 0x3FFF8000 306770911a3SEric Huang #define VDDCI_SHIFT 15 307770911a3SEric Huang #define PHASES_MASK 0xC0000000 308770911a3SEric Huang #define PHASES_SHIFT 30 309770911a3SEric Huang 310770911a3SEric Huang typedef uint32_t SMU_VoltageLevel; 311770911a3SEric Huang 312d1a04161SRan Sun struct SMU7_VoltageScoreboard { 313770911a3SEric Huang SMU_VoltageLevel TargetVoltage; 314770911a3SEric Huang uint16_t MaxVid; 315770911a3SEric Huang uint8_t HighestVidOffset; 316770911a3SEric Huang uint8_t CurrentVidOffset; 317770911a3SEric Huang 318770911a3SEric Huang uint16_t CurrentVddc; 319770911a3SEric Huang uint16_t CurrentVddci; 320770911a3SEric Huang 321770911a3SEric Huang 322770911a3SEric Huang uint8_t ControllerBusy; 323770911a3SEric Huang uint8_t CurrentVid; 324770911a3SEric Huang uint8_t CurrentVddciVid; 325770911a3SEric Huang uint8_t padding; 326770911a3SEric Huang 327770911a3SEric Huang SMU_VoltageLevel RequestedVoltage[SMU7_MAX_VOLTAGE_CLIENTS]; 328770911a3SEric Huang SMU_VoltageLevel TargetVoltageState; 329770911a3SEric Huang uint8_t EnabledRequest[SMU7_MAX_VOLTAGE_CLIENTS]; 330770911a3SEric Huang 331770911a3SEric Huang uint8_t padding2; 332770911a3SEric Huang uint8_t padding3; 333770911a3SEric Huang uint8_t ControllerEnable; 334770911a3SEric Huang uint8_t ControllerRunning; 335770911a3SEric Huang uint16_t CurrentStdVoltageHiSidd; 336770911a3SEric Huang uint16_t CurrentStdVoltageLoSidd; 337770911a3SEric Huang uint8_t OverrideVoltage; 338770911a3SEric Huang uint8_t padding4; 339770911a3SEric Huang uint8_t padding5; 340770911a3SEric Huang uint8_t CurrentPhases; 341770911a3SEric Huang 342770911a3SEric Huang VoltageChangeHandler_t ChangeVddc; 343770911a3SEric Huang 344770911a3SEric Huang VoltageChangeHandler_t ChangeVddci; 345770911a3SEric Huang VoltageChangeHandler_t ChangePhase; 346770911a3SEric Huang VoltageChangeHandler_t ChangeMvdd; 347770911a3SEric Huang 348770911a3SEric Huang VoltageChangeHandler_t functionLinks[6]; 349770911a3SEric Huang 350770911a3SEric Huang uint16_t *VddcFollower1; 351770911a3SEric Huang 352770911a3SEric Huang int16_t Driver_OD_RequestedVidOffset1; 353770911a3SEric Huang int16_t Driver_OD_RequestedVidOffset2; 354770911a3SEric Huang 355770911a3SEric Huang }; 356770911a3SEric Huang 357770911a3SEric Huang typedef struct SMU7_VoltageScoreboard SMU7_VoltageScoreboard; 358770911a3SEric Huang 359770911a3SEric Huang // ------------------------------------------------------------------------------------------------------------------------- 360770911a3SEric Huang #define SMU7_MAX_PCIE_LINK_SPEEDS 3 /* 0:Gen1 1:Gen2 2:Gen3 */ 361770911a3SEric Huang 362d1a04161SRan Sun struct SMU7_PCIeLinkSpeedScoreboard { 363770911a3SEric Huang uint8_t DpmEnable; 364770911a3SEric Huang uint8_t DpmRunning; 365770911a3SEric Huang uint8_t DpmForce; 366770911a3SEric Huang uint8_t DpmForceLevel; 367770911a3SEric Huang 368770911a3SEric Huang uint8_t CurrentLinkSpeed; 369770911a3SEric Huang uint8_t EnabledLevelsChange; 370770911a3SEric Huang uint16_t AutoDpmInterval; 371770911a3SEric Huang 372770911a3SEric Huang uint16_t AutoDpmRange; 373770911a3SEric Huang uint16_t AutoDpmCount; 374770911a3SEric Huang 375770911a3SEric Huang uint8_t DpmMode; 376770911a3SEric Huang uint8_t AcpiReq; 377770911a3SEric Huang uint8_t AcpiAck; 378770911a3SEric Huang uint8_t CurrentLinkLevel; 379770911a3SEric Huang 380770911a3SEric Huang }; 381770911a3SEric Huang 382770911a3SEric Huang typedef struct SMU7_PCIeLinkSpeedScoreboard SMU7_PCIeLinkSpeedScoreboard; 383770911a3SEric Huang 384770911a3SEric Huang // -------------------------------------------------------- CAC table ------------------------------------------------------ 385770911a3SEric Huang #define SMU7_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16 386770911a3SEric Huang #define SMU7_LKGE_LUT_NUM_OF_VOLT_ENTRIES 16 387770911a3SEric Huang 388770911a3SEric Huang #define SMU7_SCALE_I 7 389770911a3SEric Huang #define SMU7_SCALE_R 12 390770911a3SEric Huang 391d1a04161SRan Sun struct SMU7_PowerScoreboard { 392770911a3SEric Huang uint32_t GpuPower; 393770911a3SEric Huang 394770911a3SEric Huang uint32_t VddcPower; 395770911a3SEric Huang uint32_t VddcVoltage; 396770911a3SEric Huang uint32_t VddcCurrent; 397770911a3SEric Huang 398770911a3SEric Huang uint32_t MvddPower; 399770911a3SEric Huang uint32_t MvddVoltage; 400770911a3SEric Huang uint32_t MvddCurrent; 401770911a3SEric Huang 402770911a3SEric Huang uint32_t RocPower; 403770911a3SEric Huang 404770911a3SEric Huang uint16_t Telemetry_1_slope; 405770911a3SEric Huang uint16_t Telemetry_2_slope; 406770911a3SEric Huang int32_t Telemetry_1_offset; 407770911a3SEric Huang int32_t Telemetry_2_offset; 408770911a3SEric Huang }; 409770911a3SEric Huang typedef struct SMU7_PowerScoreboard SMU7_PowerScoreboard; 410770911a3SEric Huang 411770911a3SEric Huang // For FeatureEnables: 412770911a3SEric Huang #define SMU7_SCLK_DPM_CONFIG_MASK 0x01 413770911a3SEric Huang #define SMU7_VOLTAGE_CONTROLLER_CONFIG_MASK 0x02 414770911a3SEric Huang #define SMU7_THERMAL_CONTROLLER_CONFIG_MASK 0x04 415770911a3SEric Huang #define SMU7_MCLK_DPM_CONFIG_MASK 0x08 416770911a3SEric Huang #define SMU7_UVD_DPM_CONFIG_MASK 0x10 417770911a3SEric Huang #define SMU7_VCE_DPM_CONFIG_MASK 0x20 418770911a3SEric Huang #define SMU7_ACP_DPM_CONFIG_MASK 0x40 419770911a3SEric Huang #define SMU7_SAMU_DPM_CONFIG_MASK 0x80 420770911a3SEric Huang #define SMU7_PCIEGEN_DPM_CONFIG_MASK 0x100 421770911a3SEric Huang 422770911a3SEric Huang #define SMU7_ACP_MCLK_HANDSHAKE_DISABLE 0x00000001 423770911a3SEric Huang #define SMU7_ACP_SCLK_HANDSHAKE_DISABLE 0x00000002 424770911a3SEric Huang #define SMU7_UVD_MCLK_HANDSHAKE_DISABLE 0x00000100 425770911a3SEric Huang #define SMU7_UVD_SCLK_HANDSHAKE_DISABLE 0x00000200 426770911a3SEric Huang #define SMU7_VCE_MCLK_HANDSHAKE_DISABLE 0x00010000 427770911a3SEric Huang #define SMU7_VCE_SCLK_HANDSHAKE_DISABLE 0x00020000 428770911a3SEric Huang 429770911a3SEric Huang // All 'soft registers' should be uint32_t. 430d1a04161SRan Sun struct SMU73_SoftRegisters { 431770911a3SEric Huang uint32_t RefClockFrequency; 432770911a3SEric Huang uint32_t PmTimerPeriod; 433770911a3SEric Huang uint32_t FeatureEnables; 434770911a3SEric Huang 435770911a3SEric Huang uint32_t PreVBlankGap; 436770911a3SEric Huang uint32_t VBlankTimeout; 437770911a3SEric Huang uint32_t TrainTimeGap; 438770911a3SEric Huang 439770911a3SEric Huang uint32_t MvddSwitchTime; 440770911a3SEric Huang uint32_t LongestAcpiTrainTime; 441770911a3SEric Huang uint32_t AcpiDelay; 442770911a3SEric Huang uint32_t G5TrainTime; 443770911a3SEric Huang uint32_t DelayMpllPwron; 444770911a3SEric Huang uint32_t VoltageChangeTimeout; 445770911a3SEric Huang 446770911a3SEric Huang uint32_t HandshakeDisables; 447770911a3SEric Huang 448770911a3SEric Huang uint8_t DisplayPhy1Config; 449770911a3SEric Huang uint8_t DisplayPhy2Config; 450770911a3SEric Huang uint8_t DisplayPhy3Config; 451770911a3SEric Huang uint8_t DisplayPhy4Config; 452770911a3SEric Huang 453770911a3SEric Huang uint8_t DisplayPhy5Config; 454770911a3SEric Huang uint8_t DisplayPhy6Config; 455770911a3SEric Huang uint8_t DisplayPhy7Config; 456770911a3SEric Huang uint8_t DisplayPhy8Config; 457770911a3SEric Huang 458770911a3SEric Huang uint32_t AverageGraphicsActivity; 459770911a3SEric Huang uint32_t AverageMemoryActivity; 460770911a3SEric Huang uint32_t AverageGioActivity; 461770911a3SEric Huang 462770911a3SEric Huang uint8_t SClkDpmEnabledLevels; 463770911a3SEric Huang uint8_t MClkDpmEnabledLevels; 464770911a3SEric Huang uint8_t LClkDpmEnabledLevels; 465770911a3SEric Huang uint8_t PCIeDpmEnabledLevels; 466770911a3SEric Huang 467770911a3SEric Huang uint8_t UVDDpmEnabledLevels; 468770911a3SEric Huang uint8_t SAMUDpmEnabledLevels; 469770911a3SEric Huang uint8_t ACPDpmEnabledLevels; 470770911a3SEric Huang uint8_t VCEDpmEnabledLevels; 471770911a3SEric Huang 472770911a3SEric Huang uint32_t DRAM_LOG_ADDR_H; 473770911a3SEric Huang uint32_t DRAM_LOG_ADDR_L; 474770911a3SEric Huang uint32_t DRAM_LOG_PHY_ADDR_H; 475770911a3SEric Huang uint32_t DRAM_LOG_PHY_ADDR_L; 476770911a3SEric Huang uint32_t DRAM_LOG_BUFF_SIZE; 477770911a3SEric Huang uint32_t UlvEnterCount; 478770911a3SEric Huang uint32_t UlvTime; 479770911a3SEric Huang uint32_t UcodeLoadStatus; 480770911a3SEric Huang uint32_t Reserved[2]; 481770911a3SEric Huang 482770911a3SEric Huang }; 483770911a3SEric Huang 484770911a3SEric Huang typedef struct SMU73_SoftRegisters SMU73_SoftRegisters; 485770911a3SEric Huang 486d1a04161SRan Sun struct SMU73_Firmware_Header { 487770911a3SEric Huang uint32_t Digest[5]; 488770911a3SEric Huang uint32_t Version; 489770911a3SEric Huang uint32_t HeaderSize; 490770911a3SEric Huang uint32_t Flags; 491770911a3SEric Huang uint32_t EntryPoint; 492770911a3SEric Huang uint32_t CodeSize; 493770911a3SEric Huang uint32_t ImageSize; 494770911a3SEric Huang 495770911a3SEric Huang uint32_t Rtos; 496770911a3SEric Huang uint32_t SoftRegisters; 497770911a3SEric Huang uint32_t DpmTable; 498770911a3SEric Huang uint32_t FanTable; 499770911a3SEric Huang uint32_t CacConfigTable; 500770911a3SEric Huang uint32_t CacStatusTable; 501770911a3SEric Huang 502770911a3SEric Huang 503770911a3SEric Huang uint32_t mcRegisterTable; 504770911a3SEric Huang 505770911a3SEric Huang 506770911a3SEric Huang uint32_t mcArbDramTimingTable; 507770911a3SEric Huang 508770911a3SEric Huang 509770911a3SEric Huang 510770911a3SEric Huang 511770911a3SEric Huang uint32_t PmFuseTable; 512770911a3SEric Huang uint32_t Globals; 513770911a3SEric Huang uint32_t ClockStretcherTable; 514770911a3SEric Huang uint32_t Reserved[41]; 515770911a3SEric Huang uint32_t Signature; 516770911a3SEric Huang }; 517770911a3SEric Huang 518770911a3SEric Huang typedef struct SMU73_Firmware_Header SMU73_Firmware_Header; 519770911a3SEric Huang 520770911a3SEric Huang #define SMU7_FIRMWARE_HEADER_LOCATION 0x20000 521770911a3SEric Huang 522770911a3SEric Huang enum DisplayConfig { 523770911a3SEric Huang PowerDown = 1, 524770911a3SEric Huang DP54x4, 525770911a3SEric Huang DP54x2, 526770911a3SEric Huang DP54x1, 527770911a3SEric Huang DP27x4, 528770911a3SEric Huang DP27x2, 529770911a3SEric Huang DP27x1, 530770911a3SEric Huang HDMI297, 531770911a3SEric Huang HDMI162, 532770911a3SEric Huang LVDS, 533770911a3SEric Huang DP324x4, 534770911a3SEric Huang DP324x2, 535770911a3SEric Huang DP324x1 536770911a3SEric Huang }; 537770911a3SEric Huang 538770911a3SEric Huang 539770911a3SEric Huang #define MC_BLOCK_COUNT 1 540770911a3SEric Huang #define CPL_BLOCK_COUNT 5 541770911a3SEric Huang #define SE_BLOCK_COUNT 15 542770911a3SEric Huang #define GC_BLOCK_COUNT 24 543770911a3SEric Huang 544770911a3SEric Huang struct SMU7_Local_Cac { 545770911a3SEric Huang uint8_t BlockId; 546770911a3SEric Huang uint8_t SignalId; 547770911a3SEric Huang uint8_t Threshold; 548770911a3SEric Huang uint8_t Padding; 549770911a3SEric Huang }; 550770911a3SEric Huang 551770911a3SEric Huang typedef struct SMU7_Local_Cac SMU7_Local_Cac; 552770911a3SEric Huang 553770911a3SEric Huang struct SMU7_Local_Cac_Table { 554770911a3SEric Huang 555770911a3SEric Huang SMU7_Local_Cac CplLocalCac[CPL_BLOCK_COUNT]; 556770911a3SEric Huang SMU7_Local_Cac McLocalCac[MC_BLOCK_COUNT]; 557770911a3SEric Huang SMU7_Local_Cac SeLocalCac[SE_BLOCK_COUNT]; 558770911a3SEric Huang SMU7_Local_Cac GcLocalCac[GC_BLOCK_COUNT]; 559770911a3SEric Huang }; 560770911a3SEric Huang 561770911a3SEric Huang typedef struct SMU7_Local_Cac_Table SMU7_Local_Cac_Table; 562770911a3SEric Huang 563770911a3SEric Huang #if !defined(SMC_MICROCODE) 564770911a3SEric Huang #pragma pack(pop) 565770911a3SEric Huang #endif 566770911a3SEric Huang 567770911a3SEric Huang // Description of Clock Gating bitmask for Tonga: 568770911a3SEric Huang // System Clock Gating 569770911a3SEric Huang #define CG_SYS_BITMASK_FIRST_BIT 0 // First bit of Sys CG bitmask 570770911a3SEric Huang #define CG_SYS_BITMASK_LAST_BIT 9 // Last bit of Sys CG bitmask 571770911a3SEric Huang #define CG_SYS_BIF_MGLS_SHIFT 0 572770911a3SEric Huang #define CG_SYS_ROM_SHIFT 1 573770911a3SEric Huang #define CG_SYS_MC_MGCG_SHIFT 2 574770911a3SEric Huang #define CG_SYS_MC_MGLS_SHIFT 3 575770911a3SEric Huang #define CG_SYS_SDMA_MGCG_SHIFT 4 576770911a3SEric Huang #define CG_SYS_SDMA_MGLS_SHIFT 5 577770911a3SEric Huang #define CG_SYS_DRM_MGCG_SHIFT 6 578770911a3SEric Huang #define CG_SYS_HDP_MGCG_SHIFT 7 579770911a3SEric Huang #define CG_SYS_HDP_MGLS_SHIFT 8 580770911a3SEric Huang #define CG_SYS_DRM_MGLS_SHIFT 9 581770911a3SEric Huang 582770911a3SEric Huang #define CG_SYS_BIF_MGLS_MASK 0x1 583770911a3SEric Huang #define CG_SYS_ROM_MASK 0x2 584770911a3SEric Huang #define CG_SYS_MC_MGCG_MASK 0x4 585770911a3SEric Huang #define CG_SYS_MC_MGLS_MASK 0x8 586770911a3SEric Huang #define CG_SYS_SDMA_MGCG_MASK 0x10 587770911a3SEric Huang #define CG_SYS_SDMA_MGLS_MASK 0x20 588770911a3SEric Huang #define CG_SYS_DRM_MGCG_MASK 0x40 589770911a3SEric Huang #define CG_SYS_HDP_MGCG_MASK 0x80 590770911a3SEric Huang #define CG_SYS_HDP_MGLS_MASK 0x100 591770911a3SEric Huang #define CG_SYS_DRM_MGLS_MASK 0x200 592770911a3SEric Huang 593770911a3SEric Huang // Graphics Clock Gating 594770911a3SEric Huang #define CG_GFX_BITMASK_FIRST_BIT 16 // First bit of Gfx CG bitmask 595770911a3SEric Huang #define CG_GFX_BITMASK_LAST_BIT 20 // Last bit of Gfx CG bitmask 596770911a3SEric Huang #define CG_GFX_CGCG_SHIFT 16 597770911a3SEric Huang #define CG_GFX_CGLS_SHIFT 17 598770911a3SEric Huang #define CG_CPF_MGCG_SHIFT 18 599770911a3SEric Huang #define CG_RLC_MGCG_SHIFT 19 600770911a3SEric Huang #define CG_GFX_OTHERS_MGCG_SHIFT 20 601770911a3SEric Huang 602770911a3SEric Huang #define CG_GFX_CGCG_MASK 0x00010000 603770911a3SEric Huang #define CG_GFX_CGLS_MASK 0x00020000 604770911a3SEric Huang #define CG_CPF_MGCG_MASK 0x00040000 605770911a3SEric Huang #define CG_RLC_MGCG_MASK 0x00080000 606770911a3SEric Huang #define CG_GFX_OTHERS_MGCG_MASK 0x00100000 607770911a3SEric Huang 608770911a3SEric Huang 609770911a3SEric Huang 610770911a3SEric Huang // Voltage Regulator Configuration 611770911a3SEric Huang // VR Config info is contained in dpmTable.VRConfig 612770911a3SEric Huang 613770911a3SEric Huang #define VRCONF_VDDC_MASK 0x000000FF 614770911a3SEric Huang #define VRCONF_VDDC_SHIFT 0 615770911a3SEric Huang #define VRCONF_VDDGFX_MASK 0x0000FF00 616770911a3SEric Huang #define VRCONF_VDDGFX_SHIFT 8 617770911a3SEric Huang #define VRCONF_VDDCI_MASK 0x00FF0000 618770911a3SEric Huang #define VRCONF_VDDCI_SHIFT 16 619770911a3SEric Huang #define VRCONF_MVDD_MASK 0xFF000000 620770911a3SEric Huang #define VRCONF_MVDD_SHIFT 24 621770911a3SEric Huang 622770911a3SEric Huang #define VR_MERGED_WITH_VDDC 0 623770911a3SEric Huang #define VR_SVI2_PLANE_1 1 624770911a3SEric Huang #define VR_SVI2_PLANE_2 2 625770911a3SEric Huang #define VR_SMIO_PATTERN_1 3 626770911a3SEric Huang #define VR_SMIO_PATTERN_2 4 627770911a3SEric Huang #define VR_STATIC_VOLTAGE 5 628770911a3SEric Huang 629770911a3SEric Huang // Clock Stretcher Configuration 630770911a3SEric Huang 631770911a3SEric Huang #define CLOCK_STRETCHER_MAX_ENTRIES 0x4 632770911a3SEric Huang #define CKS_LOOKUPTable_MAX_ENTRIES 0x4 633770911a3SEric Huang 634770911a3SEric Huang // The 'settings' field is subdivided in the following way: 635770911a3SEric Huang #define CLOCK_STRETCHER_SETTING_DDT_MASK 0x01 636770911a3SEric Huang #define CLOCK_STRETCHER_SETTING_DDT_SHIFT 0x0 637770911a3SEric Huang #define CLOCK_STRETCHER_SETTING_STRETCH_AMOUNT_MASK 0x1E 638770911a3SEric Huang #define CLOCK_STRETCHER_SETTING_STRETCH_AMOUNT_SHIFT 0x1 639770911a3SEric Huang #define CLOCK_STRETCHER_SETTING_ENABLE_MASK 0x80 640770911a3SEric Huang #define CLOCK_STRETCHER_SETTING_ENABLE_SHIFT 0x7 641770911a3SEric Huang 642770911a3SEric Huang struct SMU_ClockStretcherDataTableEntry { 643770911a3SEric Huang uint8_t minVID; 644770911a3SEric Huang uint8_t maxVID; 645770911a3SEric Huang 646770911a3SEric Huang 647770911a3SEric Huang uint16_t setting; 648770911a3SEric Huang }; 649770911a3SEric Huang typedef struct SMU_ClockStretcherDataTableEntry SMU_ClockStretcherDataTableEntry; 650770911a3SEric Huang 651770911a3SEric Huang struct SMU_ClockStretcherDataTable { 652770911a3SEric Huang SMU_ClockStretcherDataTableEntry ClockStretcherDataTableEntry[CLOCK_STRETCHER_MAX_ENTRIES]; 653770911a3SEric Huang }; 654770911a3SEric Huang typedef struct SMU_ClockStretcherDataTable SMU_ClockStretcherDataTable; 655770911a3SEric Huang 656770911a3SEric Huang struct SMU_CKS_LOOKUPTableEntry { 657770911a3SEric Huang uint16_t minFreq; 658770911a3SEric Huang uint16_t maxFreq; 659770911a3SEric Huang 660770911a3SEric Huang uint8_t setting; 661770911a3SEric Huang uint8_t padding[3]; 662770911a3SEric Huang }; 663770911a3SEric Huang typedef struct SMU_CKS_LOOKUPTableEntry SMU_CKS_LOOKUPTableEntry; 664770911a3SEric Huang 665770911a3SEric Huang struct SMU_CKS_LOOKUPTable { 666770911a3SEric Huang SMU_CKS_LOOKUPTableEntry CKS_LOOKUPTableEntry[CKS_LOOKUPTable_MAX_ENTRIES]; 667770911a3SEric Huang }; 668770911a3SEric Huang typedef struct SMU_CKS_LOOKUPTable SMU_CKS_LOOKUPTable; 669770911a3SEric Huang 670770911a3SEric Huang struct AgmAvfsData_t { 671770911a3SEric Huang uint16_t avgPsmCount[28]; 672770911a3SEric Huang uint16_t minPsmCount[28]; 673770911a3SEric Huang }; 674770911a3SEric Huang typedef struct AgmAvfsData_t AgmAvfsData_t; 675770911a3SEric Huang 676770911a3SEric Huang // AVFS DEFINES 677770911a3SEric Huang 678770911a3SEric Huang enum VFT_COLUMNS { 679770911a3SEric Huang SCLK0, 680770911a3SEric Huang SCLK1, 681770911a3SEric Huang SCLK2, 682770911a3SEric Huang SCLK3, 683770911a3SEric Huang SCLK4, 684770911a3SEric Huang SCLK5, 685770911a3SEric Huang SCLK6, 686770911a3SEric Huang SCLK7, 687770911a3SEric Huang 688770911a3SEric Huang NUM_VFT_COLUMNS 689770911a3SEric Huang }; 690770911a3SEric Huang 691770911a3SEric Huang #define TEMP_RANGE_MAXSTEPS 12 692770911a3SEric Huang struct VFT_CELL_t { 693770911a3SEric Huang uint16_t Voltage; 694770911a3SEric Huang }; 695770911a3SEric Huang 696770911a3SEric Huang typedef struct VFT_CELL_t VFT_CELL_t; 697770911a3SEric Huang 698770911a3SEric Huang struct VFT_TABLE_t { 699770911a3SEric Huang VFT_CELL_t Cell[TEMP_RANGE_MAXSTEPS][NUM_VFT_COLUMNS]; 700770911a3SEric Huang uint16_t AvfsGbv[NUM_VFT_COLUMNS]; 701770911a3SEric Huang uint16_t BtcGbv[NUM_VFT_COLUMNS]; 702770911a3SEric Huang uint16_t Temperature[TEMP_RANGE_MAXSTEPS]; 703770911a3SEric Huang 704770911a3SEric Huang uint8_t NumTemperatureSteps; 705770911a3SEric Huang uint8_t padding[3]; 706770911a3SEric Huang }; 707770911a3SEric Huang typedef struct VFT_TABLE_t VFT_TABLE_t; 708770911a3SEric Huang 709770911a3SEric Huang #endif 710