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