1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2013 Advanced Micro Devices, Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice shall be included in 12*4882a593Smuzhiyun * all copies or substantial portions of the Software. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*4882a593Smuzhiyun * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*4882a593Smuzhiyun * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*4882a593Smuzhiyun * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*4882a593Smuzhiyun * OTHER DEALINGS IN THE SOFTWARE. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun #ifndef PP_SISLANDS_SMC_H 24*4882a593Smuzhiyun #define PP_SISLANDS_SMC_H 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #include "ppsmc.h" 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #pragma pack(push, 1) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct PP_SIslands_Dpm2PerfLevel 33*4882a593Smuzhiyun { 34*4882a593Smuzhiyun uint8_t MaxPS; 35*4882a593Smuzhiyun uint8_t TgtAct; 36*4882a593Smuzhiyun uint8_t MaxPS_StepInc; 37*4882a593Smuzhiyun uint8_t MaxPS_StepDec; 38*4882a593Smuzhiyun uint8_t PSSamplingTime; 39*4882a593Smuzhiyun uint8_t NearTDPDec; 40*4882a593Smuzhiyun uint8_t AboveSafeInc; 41*4882a593Smuzhiyun uint8_t BelowSafeInc; 42*4882a593Smuzhiyun uint8_t PSDeltaLimit; 43*4882a593Smuzhiyun uint8_t PSDeltaWin; 44*4882a593Smuzhiyun uint16_t PwrEfficiencyRatio; 45*4882a593Smuzhiyun uint8_t Reserved[4]; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun typedef struct PP_SIslands_Dpm2PerfLevel PP_SIslands_Dpm2PerfLevel; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun struct PP_SIslands_DPM2Status 51*4882a593Smuzhiyun { 52*4882a593Smuzhiyun uint32_t dpm2Flags; 53*4882a593Smuzhiyun uint8_t CurrPSkip; 54*4882a593Smuzhiyun uint8_t CurrPSkipPowerShift; 55*4882a593Smuzhiyun uint8_t CurrPSkipTDP; 56*4882a593Smuzhiyun uint8_t CurrPSkipOCP; 57*4882a593Smuzhiyun uint8_t MaxSPLLIndex; 58*4882a593Smuzhiyun uint8_t MinSPLLIndex; 59*4882a593Smuzhiyun uint8_t CurrSPLLIndex; 60*4882a593Smuzhiyun uint8_t InfSweepMode; 61*4882a593Smuzhiyun uint8_t InfSweepDir; 62*4882a593Smuzhiyun uint8_t TDPexceeded; 63*4882a593Smuzhiyun uint8_t reserved; 64*4882a593Smuzhiyun uint8_t SwitchDownThreshold; 65*4882a593Smuzhiyun uint32_t SwitchDownCounter; 66*4882a593Smuzhiyun uint32_t SysScalingFactor; 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun typedef struct PP_SIslands_DPM2Status PP_SIslands_DPM2Status; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct PP_SIslands_DPM2Parameters 72*4882a593Smuzhiyun { 73*4882a593Smuzhiyun uint32_t TDPLimit; 74*4882a593Smuzhiyun uint32_t NearTDPLimit; 75*4882a593Smuzhiyun uint32_t SafePowerLimit; 76*4882a593Smuzhiyun uint32_t PowerBoostLimit; 77*4882a593Smuzhiyun uint32_t MinLimitDelta; 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun typedef struct PP_SIslands_DPM2Parameters PP_SIslands_DPM2Parameters; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct PP_SIslands_PAPMStatus 82*4882a593Smuzhiyun { 83*4882a593Smuzhiyun uint32_t EstimatedDGPU_T; 84*4882a593Smuzhiyun uint32_t EstimatedDGPU_P; 85*4882a593Smuzhiyun uint32_t EstimatedAPU_T; 86*4882a593Smuzhiyun uint32_t EstimatedAPU_P; 87*4882a593Smuzhiyun uint8_t dGPU_T_Limit_Exceeded; 88*4882a593Smuzhiyun uint8_t reserved[3]; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun typedef struct PP_SIslands_PAPMStatus PP_SIslands_PAPMStatus; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct PP_SIslands_PAPMParameters 93*4882a593Smuzhiyun { 94*4882a593Smuzhiyun uint32_t NearTDPLimitTherm; 95*4882a593Smuzhiyun uint32_t NearTDPLimitPAPM; 96*4882a593Smuzhiyun uint32_t PlatformPowerLimit; 97*4882a593Smuzhiyun uint32_t dGPU_T_Limit; 98*4882a593Smuzhiyun uint32_t dGPU_T_Warning; 99*4882a593Smuzhiyun uint32_t dGPU_T_Hysteresis; 100*4882a593Smuzhiyun }; 101*4882a593Smuzhiyun typedef struct PP_SIslands_PAPMParameters PP_SIslands_PAPMParameters; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun struct SISLANDS_SMC_SCLK_VALUE 104*4882a593Smuzhiyun { 105*4882a593Smuzhiyun uint32_t vCG_SPLL_FUNC_CNTL; 106*4882a593Smuzhiyun uint32_t vCG_SPLL_FUNC_CNTL_2; 107*4882a593Smuzhiyun uint32_t vCG_SPLL_FUNC_CNTL_3; 108*4882a593Smuzhiyun uint32_t vCG_SPLL_FUNC_CNTL_4; 109*4882a593Smuzhiyun uint32_t vCG_SPLL_SPREAD_SPECTRUM; 110*4882a593Smuzhiyun uint32_t vCG_SPLL_SPREAD_SPECTRUM_2; 111*4882a593Smuzhiyun uint32_t sclk_value; 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun typedef struct SISLANDS_SMC_SCLK_VALUE SISLANDS_SMC_SCLK_VALUE; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun struct SISLANDS_SMC_MCLK_VALUE 117*4882a593Smuzhiyun { 118*4882a593Smuzhiyun uint32_t vMPLL_FUNC_CNTL; 119*4882a593Smuzhiyun uint32_t vMPLL_FUNC_CNTL_1; 120*4882a593Smuzhiyun uint32_t vMPLL_FUNC_CNTL_2; 121*4882a593Smuzhiyun uint32_t vMPLL_AD_FUNC_CNTL; 122*4882a593Smuzhiyun uint32_t vMPLL_DQ_FUNC_CNTL; 123*4882a593Smuzhiyun uint32_t vMCLK_PWRMGT_CNTL; 124*4882a593Smuzhiyun uint32_t vDLL_CNTL; 125*4882a593Smuzhiyun uint32_t vMPLL_SS; 126*4882a593Smuzhiyun uint32_t vMPLL_SS2; 127*4882a593Smuzhiyun uint32_t mclk_value; 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun typedef struct SISLANDS_SMC_MCLK_VALUE SISLANDS_SMC_MCLK_VALUE; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun struct SISLANDS_SMC_VOLTAGE_VALUE 133*4882a593Smuzhiyun { 134*4882a593Smuzhiyun uint16_t value; 135*4882a593Smuzhiyun uint8_t index; 136*4882a593Smuzhiyun uint8_t phase_settings; 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun typedef struct SISLANDS_SMC_VOLTAGE_VALUE SISLANDS_SMC_VOLTAGE_VALUE; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL 142*4882a593Smuzhiyun { 143*4882a593Smuzhiyun uint8_t ACIndex; 144*4882a593Smuzhiyun uint8_t displayWatermark; 145*4882a593Smuzhiyun uint8_t gen2PCIE; 146*4882a593Smuzhiyun uint8_t UVDWatermark; 147*4882a593Smuzhiyun uint8_t VCEWatermark; 148*4882a593Smuzhiyun uint8_t strobeMode; 149*4882a593Smuzhiyun uint8_t mcFlags; 150*4882a593Smuzhiyun uint8_t padding; 151*4882a593Smuzhiyun uint32_t aT; 152*4882a593Smuzhiyun uint32_t bSP; 153*4882a593Smuzhiyun SISLANDS_SMC_SCLK_VALUE sclk; 154*4882a593Smuzhiyun SISLANDS_SMC_MCLK_VALUE mclk; 155*4882a593Smuzhiyun SISLANDS_SMC_VOLTAGE_VALUE vddc; 156*4882a593Smuzhiyun SISLANDS_SMC_VOLTAGE_VALUE mvdd; 157*4882a593Smuzhiyun SISLANDS_SMC_VOLTAGE_VALUE vddci; 158*4882a593Smuzhiyun SISLANDS_SMC_VOLTAGE_VALUE std_vddc; 159*4882a593Smuzhiyun uint8_t hysteresisUp; 160*4882a593Smuzhiyun uint8_t hysteresisDown; 161*4882a593Smuzhiyun uint8_t stateFlags; 162*4882a593Smuzhiyun uint8_t arbRefreshState; 163*4882a593Smuzhiyun uint32_t SQPowerThrottle; 164*4882a593Smuzhiyun uint32_t SQPowerThrottle_2; 165*4882a593Smuzhiyun uint32_t MaxPoweredUpCU; 166*4882a593Smuzhiyun SISLANDS_SMC_VOLTAGE_VALUE high_temp_vddc; 167*4882a593Smuzhiyun SISLANDS_SMC_VOLTAGE_VALUE low_temp_vddc; 168*4882a593Smuzhiyun uint32_t reserved[2]; 169*4882a593Smuzhiyun PP_SIslands_Dpm2PerfLevel dpm2; 170*4882a593Smuzhiyun }; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define SISLANDS_SMC_STROBE_RATIO 0x0F 173*4882a593Smuzhiyun #define SISLANDS_SMC_STROBE_ENABLE 0x10 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #define SISLANDS_SMC_MC_EDC_RD_FLAG 0x01 176*4882a593Smuzhiyun #define SISLANDS_SMC_MC_EDC_WR_FLAG 0x02 177*4882a593Smuzhiyun #define SISLANDS_SMC_MC_RTT_ENABLE 0x04 178*4882a593Smuzhiyun #define SISLANDS_SMC_MC_STUTTER_EN 0x08 179*4882a593Smuzhiyun #define SISLANDS_SMC_MC_PG_EN 0x10 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun typedef struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL SISLANDS_SMC_HW_PERFORMANCE_LEVEL; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun struct SISLANDS_SMC_SWSTATE 184*4882a593Smuzhiyun { 185*4882a593Smuzhiyun uint8_t flags; 186*4882a593Smuzhiyun uint8_t levelCount; 187*4882a593Smuzhiyun uint8_t padding2; 188*4882a593Smuzhiyun uint8_t padding3; 189*4882a593Smuzhiyun SISLANDS_SMC_HW_PERFORMANCE_LEVEL levels[1]; 190*4882a593Smuzhiyun }; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun #define SISLANDS_SMC_VOLTAGEMASK_VDDC 0 195*4882a593Smuzhiyun #define SISLANDS_SMC_VOLTAGEMASK_MVDD 1 196*4882a593Smuzhiyun #define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2 197*4882a593Smuzhiyun #define SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING 3 198*4882a593Smuzhiyun #define SISLANDS_SMC_VOLTAGEMASK_MAX 4 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun struct SISLANDS_SMC_VOLTAGEMASKTABLE 201*4882a593Smuzhiyun { 202*4882a593Smuzhiyun uint32_t lowMask[SISLANDS_SMC_VOLTAGEMASK_MAX]; 203*4882a593Smuzhiyun }; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun typedef struct SISLANDS_SMC_VOLTAGEMASKTABLE SISLANDS_SMC_VOLTAGEMASKTABLE; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun #define SISLANDS_MAX_NO_VREG_STEPS 32 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun struct SISLANDS_SMC_STATETABLE 210*4882a593Smuzhiyun { 211*4882a593Smuzhiyun uint8_t thermalProtectType; 212*4882a593Smuzhiyun uint8_t systemFlags; 213*4882a593Smuzhiyun uint8_t maxVDDCIndexInPPTable; 214*4882a593Smuzhiyun uint8_t extraFlags; 215*4882a593Smuzhiyun uint32_t lowSMIO[SISLANDS_MAX_NO_VREG_STEPS]; 216*4882a593Smuzhiyun SISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable; 217*4882a593Smuzhiyun SISLANDS_SMC_VOLTAGEMASKTABLE phaseMaskTable; 218*4882a593Smuzhiyun PP_SIslands_DPM2Parameters dpm2Params; 219*4882a593Smuzhiyun SISLANDS_SMC_SWSTATE initialState; 220*4882a593Smuzhiyun SISLANDS_SMC_SWSTATE ACPIState; 221*4882a593Smuzhiyun SISLANDS_SMC_SWSTATE ULVState; 222*4882a593Smuzhiyun SISLANDS_SMC_SWSTATE driverState; 223*4882a593Smuzhiyun SISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1]; 224*4882a593Smuzhiyun }; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun typedef struct SISLANDS_SMC_STATETABLE SISLANDS_SMC_STATETABLE; 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_mclk_chg_timeout 0x0 229*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_delay_vreg 0xC 230*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_delay_acpi 0x28 231*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_seq_index 0x5C 232*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_mvdd_chg_time 0x60 233*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_mclk_switch_lim 0x70 234*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_watermark_threshold 0x78 235*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_phase_shedding_delay 0x88 236*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_ulv_volt_change_delay 0x8C 237*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_mc_block_delay 0x98 238*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_ticks_per_us 0xA8 239*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_crtc_index 0xC4 240*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_mclk_change_block_cp_min 0xC8 241*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_mclk_change_block_cp_max 0xCC 242*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width 0xF4 243*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_tdr_is_about_to_happen 0xFC 244*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_vr_hot_gpio 0x100 245*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_svi_rework_plat_type 0x118 246*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd 0x11c 247*4882a593Smuzhiyun #define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc 0x120 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun struct PP_SIslands_FanTable 250*4882a593Smuzhiyun { 251*4882a593Smuzhiyun uint8_t fdo_mode; 252*4882a593Smuzhiyun uint8_t padding; 253*4882a593Smuzhiyun int16_t temp_min; 254*4882a593Smuzhiyun int16_t temp_med; 255*4882a593Smuzhiyun int16_t temp_max; 256*4882a593Smuzhiyun int16_t slope1; 257*4882a593Smuzhiyun int16_t slope2; 258*4882a593Smuzhiyun int16_t fdo_min; 259*4882a593Smuzhiyun int16_t hys_up; 260*4882a593Smuzhiyun int16_t hys_down; 261*4882a593Smuzhiyun int16_t hys_slope; 262*4882a593Smuzhiyun int16_t temp_resp_lim; 263*4882a593Smuzhiyun int16_t temp_curr; 264*4882a593Smuzhiyun int16_t slope_curr; 265*4882a593Smuzhiyun int16_t pwm_curr; 266*4882a593Smuzhiyun uint32_t refresh_period; 267*4882a593Smuzhiyun int16_t fdo_max; 268*4882a593Smuzhiyun uint8_t temp_src; 269*4882a593Smuzhiyun int8_t padding2; 270*4882a593Smuzhiyun }; 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun typedef struct PP_SIslands_FanTable PP_SIslands_FanTable; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun #define SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16 275*4882a593Smuzhiyun #define SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES 32 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun #define SMC_SISLANDS_SCALE_I 7 278*4882a593Smuzhiyun #define SMC_SISLANDS_SCALE_R 12 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun struct PP_SIslands_CacConfig 281*4882a593Smuzhiyun { 282*4882a593Smuzhiyun uint16_t cac_lkge_lut[SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES][SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES]; 283*4882a593Smuzhiyun uint32_t lkge_lut_V0; 284*4882a593Smuzhiyun uint32_t lkge_lut_Vstep; 285*4882a593Smuzhiyun uint32_t WinTime; 286*4882a593Smuzhiyun uint32_t R_LL; 287*4882a593Smuzhiyun uint32_t calculation_repeats; 288*4882a593Smuzhiyun uint32_t l2numWin_TDP; 289*4882a593Smuzhiyun uint32_t dc_cac; 290*4882a593Smuzhiyun uint8_t lts_truncate_n; 291*4882a593Smuzhiyun uint8_t SHIFT_N; 292*4882a593Smuzhiyun uint8_t log2_PG_LKG_SCALE; 293*4882a593Smuzhiyun uint8_t cac_temp; 294*4882a593Smuzhiyun uint32_t lkge_lut_T0; 295*4882a593Smuzhiyun uint32_t lkge_lut_Tstep; 296*4882a593Smuzhiyun }; 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun typedef struct PP_SIslands_CacConfig PP_SIslands_CacConfig; 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun #define SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE 16 301*4882a593Smuzhiyun #define SMC_SISLANDS_MC_REGISTER_ARRAY_SET_COUNT 20 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun struct SMC_SIslands_MCRegisterAddress 304*4882a593Smuzhiyun { 305*4882a593Smuzhiyun uint16_t s0; 306*4882a593Smuzhiyun uint16_t s1; 307*4882a593Smuzhiyun }; 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun typedef struct SMC_SIslands_MCRegisterAddress SMC_SIslands_MCRegisterAddress; 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun struct SMC_SIslands_MCRegisterSet 312*4882a593Smuzhiyun { 313*4882a593Smuzhiyun uint32_t value[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE]; 314*4882a593Smuzhiyun }; 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun typedef struct SMC_SIslands_MCRegisterSet SMC_SIslands_MCRegisterSet; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun struct SMC_SIslands_MCRegisters 319*4882a593Smuzhiyun { 320*4882a593Smuzhiyun uint8_t last; 321*4882a593Smuzhiyun uint8_t reserved[3]; 322*4882a593Smuzhiyun SMC_SIslands_MCRegisterAddress address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE]; 323*4882a593Smuzhiyun SMC_SIslands_MCRegisterSet data[SMC_SISLANDS_MC_REGISTER_ARRAY_SET_COUNT]; 324*4882a593Smuzhiyun }; 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun typedef struct SMC_SIslands_MCRegisters SMC_SIslands_MCRegisters; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun struct SMC_SIslands_MCArbDramTimingRegisterSet 329*4882a593Smuzhiyun { 330*4882a593Smuzhiyun uint32_t mc_arb_dram_timing; 331*4882a593Smuzhiyun uint32_t mc_arb_dram_timing2; 332*4882a593Smuzhiyun uint8_t mc_arb_rfsh_rate; 333*4882a593Smuzhiyun uint8_t mc_arb_burst_time; 334*4882a593Smuzhiyun uint8_t padding[2]; 335*4882a593Smuzhiyun }; 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun typedef struct SMC_SIslands_MCArbDramTimingRegisterSet SMC_SIslands_MCArbDramTimingRegisterSet; 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun struct SMC_SIslands_MCArbDramTimingRegisters 340*4882a593Smuzhiyun { 341*4882a593Smuzhiyun uint8_t arb_current; 342*4882a593Smuzhiyun uint8_t reserved[3]; 343*4882a593Smuzhiyun SMC_SIslands_MCArbDramTimingRegisterSet data[16]; 344*4882a593Smuzhiyun }; 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun typedef struct SMC_SIslands_MCArbDramTimingRegisters SMC_SIslands_MCArbDramTimingRegisters; 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun struct SMC_SISLANDS_SPLL_DIV_TABLE 349*4882a593Smuzhiyun { 350*4882a593Smuzhiyun uint32_t freq[256]; 351*4882a593Smuzhiyun uint32_t ss[256]; 352*4882a593Smuzhiyun }; 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun #define SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_MASK 0x01ffffff 355*4882a593Smuzhiyun #define SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT 0 356*4882a593Smuzhiyun #define SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_MASK 0xfe000000 357*4882a593Smuzhiyun #define SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT 25 358*4882a593Smuzhiyun #define SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_MASK 0x000fffff 359*4882a593Smuzhiyun #define SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT 0 360*4882a593Smuzhiyun #define SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_MASK 0xfff00000 361*4882a593Smuzhiyun #define SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT 20 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun typedef struct SMC_SISLANDS_SPLL_DIV_TABLE SMC_SISLANDS_SPLL_DIV_TABLE; 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun #define SMC_SISLANDS_DTE_MAX_FILTER_STAGES 5 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun #define SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE 16 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun struct Smc_SIslands_DTE_Configuration 370*4882a593Smuzhiyun { 371*4882a593Smuzhiyun uint32_t tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES]; 372*4882a593Smuzhiyun uint32_t R[SMC_SISLANDS_DTE_MAX_FILTER_STAGES]; 373*4882a593Smuzhiyun uint32_t K; 374*4882a593Smuzhiyun uint32_t T0; 375*4882a593Smuzhiyun uint32_t MaxT; 376*4882a593Smuzhiyun uint8_t WindowSize; 377*4882a593Smuzhiyun uint8_t Tdep_count; 378*4882a593Smuzhiyun uint8_t temp_select; 379*4882a593Smuzhiyun uint8_t DTE_mode; 380*4882a593Smuzhiyun uint8_t T_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE]; 381*4882a593Smuzhiyun uint32_t Tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE]; 382*4882a593Smuzhiyun uint32_t Tdep_R[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE]; 383*4882a593Smuzhiyun uint32_t Tthreshold; 384*4882a593Smuzhiyun }; 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun typedef struct Smc_SIslands_DTE_Configuration Smc_SIslands_DTE_Configuration; 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun #define SMC_SISLANDS_DTE_STATUS_FLAG_DTE_ON 1 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_LOCATION 0x10000 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_version 0x0 393*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_flags 0x4 394*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_softRegisters 0xC 395*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_stateTable 0x10 396*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_fanTable 0x14 397*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_CacConfigTable 0x18 398*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_mcRegisterTable 0x24 399*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable 0x30 400*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_spllTable 0x38 401*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_DteConfiguration 0x40 402*4882a593Smuzhiyun #define SISLANDS_SMC_FIRMWARE_HEADER_PAPMParameters 0x48 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun #pragma pack(pop) 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun int si_copy_bytes_to_smc(struct radeon_device *rdev, 407*4882a593Smuzhiyun u32 smc_start_address, 408*4882a593Smuzhiyun const u8 *src, u32 byte_count, u32 limit); 409*4882a593Smuzhiyun void si_start_smc(struct radeon_device *rdev); 410*4882a593Smuzhiyun void si_reset_smc(struct radeon_device *rdev); 411*4882a593Smuzhiyun int si_program_jump_on_start(struct radeon_device *rdev); 412*4882a593Smuzhiyun void si_stop_smc_clock(struct radeon_device *rdev); 413*4882a593Smuzhiyun void si_start_smc_clock(struct radeon_device *rdev); 414*4882a593Smuzhiyun bool si_is_smc_running(struct radeon_device *rdev); 415*4882a593Smuzhiyun PPSMC_Result si_send_msg_to_smc(struct radeon_device *rdev, PPSMC_Msg msg); 416*4882a593Smuzhiyun PPSMC_Result si_wait_for_smc_inactive(struct radeon_device *rdev); 417*4882a593Smuzhiyun int si_load_smc_ucode(struct radeon_device *rdev, u32 limit); 418*4882a593Smuzhiyun int si_read_smc_sram_dword(struct radeon_device *rdev, u32 smc_address, 419*4882a593Smuzhiyun u32 *value, u32 limit); 420*4882a593Smuzhiyun int si_write_smc_sram_dword(struct radeon_device *rdev, u32 smc_address, 421*4882a593Smuzhiyun u32 value, u32 limit); 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun #endif 424*4882a593Smuzhiyun 425