Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright 2012 Advanced Micro Devices, Inc.
0003  *
0004  * Permission is hereby granted, free of charge, to any person obtaining a
0005  * copy of this software and associated documentation files (the "Software"),
0006  * to deal in the Software without restriction, including without limitation
0007  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0008  * and/or sell copies of the Software, and to permit persons to whom the
0009  * Software is furnished to do so, subject to the following conditions:
0010  *
0011  * The above copyright notice and this permission notice shall be included in
0012  * all copies or substantial portions of the Software.
0013  *
0014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0015  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0016  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0017  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0018  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0019  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0020  * OTHER DEALINGS IN THE SOFTWARE.
0021  *
0022  */
0023 #ifndef __SI_DPM_H__
0024 #define __SI_DPM_H__
0025 
0026 #include "amdgpu_atombios.h"
0027 #include "sislands_smc.h"
0028 
0029 #define MC_CG_CONFIG                                    0x96f
0030 #define MC_ARB_CG                                       0x9fa
0031 #define     CG_ARB_REQ(x)               ((x) << 0)
0032 #define     CG_ARB_REQ_MASK             (0xff << 0)
0033 
0034 #define MC_ARB_DRAM_TIMING_1                0x9fc
0035 #define MC_ARB_DRAM_TIMING_2                0x9fd
0036 #define MC_ARB_DRAM_TIMING_3                0x9fe
0037 #define MC_ARB_DRAM_TIMING2_1               0x9ff
0038 #define MC_ARB_DRAM_TIMING2_2               0xa00
0039 #define MC_ARB_DRAM_TIMING2_3               0xa01
0040 
0041 #define MAX_NO_OF_MVDD_VALUES 2
0042 #define MAX_NO_VREG_STEPS 32
0043 #define NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
0044 #define SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE 32
0045 #define SMC_NISLANDS_MC_REGISTER_ARRAY_SET_COUNT 20
0046 #define RV770_ASI_DFLT                                1000
0047 #define CYPRESS_HASI_DFLT                               400000
0048 #define PCIE_PERF_REQ_PECI_GEN1         2
0049 #define PCIE_PERF_REQ_PECI_GEN2         3
0050 #define PCIE_PERF_REQ_PECI_GEN3         4
0051 #define RV770_DEFAULT_VCLK_FREQ  53300 /* 10 khz */
0052 #define RV770_DEFAULT_DCLK_FREQ  40000 /* 10 khz */
0053 
0054 #define SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE 16
0055 
0056 #define RV770_SMC_TABLE_ADDRESS 0xB000
0057 #define RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE    3
0058 
0059 #define SMC_STROBE_RATIO    0x0F
0060 #define SMC_STROBE_ENABLE   0x10
0061 
0062 #define SMC_MC_EDC_RD_FLAG  0x01
0063 #define SMC_MC_EDC_WR_FLAG  0x02
0064 #define SMC_MC_RTT_ENABLE   0x04
0065 #define SMC_MC_STUTTER_EN   0x08
0066 
0067 #define RV770_SMC_VOLTAGEMASK_VDDC 0
0068 #define RV770_SMC_VOLTAGEMASK_MVDD 1
0069 #define RV770_SMC_VOLTAGEMASK_VDDCI 2
0070 #define RV770_SMC_VOLTAGEMASK_MAX  4
0071 
0072 #define NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
0073 #define NISLANDS_SMC_STROBE_RATIO    0x0F
0074 #define NISLANDS_SMC_STROBE_ENABLE   0x10
0075 
0076 #define NISLANDS_SMC_MC_EDC_RD_FLAG  0x01
0077 #define NISLANDS_SMC_MC_EDC_WR_FLAG  0x02
0078 #define NISLANDS_SMC_MC_RTT_ENABLE   0x04
0079 #define NISLANDS_SMC_MC_STUTTER_EN   0x08
0080 
0081 #define MAX_NO_VREG_STEPS 32
0082 
0083 #define NISLANDS_SMC_VOLTAGEMASK_VDDC  0
0084 #define NISLANDS_SMC_VOLTAGEMASK_MVDD  1
0085 #define NISLANDS_SMC_VOLTAGEMASK_VDDCI 2
0086 #define NISLANDS_SMC_VOLTAGEMASK_MAX   4
0087 
0088 #define SISLANDS_MCREGISTERTABLE_INITIAL_SLOT               0
0089 #define SISLANDS_MCREGISTERTABLE_ACPI_SLOT                  1
0090 #define SISLANDS_MCREGISTERTABLE_ULV_SLOT                   2
0091 #define SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT     3
0092 
0093 #define SISLANDS_LEAKAGE_INDEX0     0xff01
0094 #define SISLANDS_MAX_LEAKAGE_COUNT  4
0095 
0096 #define SISLANDS_MAX_HARDWARE_POWERLEVELS 5
0097 #define SISLANDS_INITIAL_STATE_ARB_INDEX    0
0098 #define SISLANDS_ACPI_STATE_ARB_INDEX       1
0099 #define SISLANDS_ULV_STATE_ARB_INDEX        2
0100 #define SISLANDS_DRIVER_STATE_ARB_INDEX     3
0101 
0102 #define SISLANDS_DPM2_MAX_PULSE_SKIP        256
0103 
0104 #define SISLANDS_DPM2_NEAR_TDP_DEC          10
0105 #define SISLANDS_DPM2_ABOVE_SAFE_INC        5
0106 #define SISLANDS_DPM2_BELOW_SAFE_INC        20
0107 
0108 #define SISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT            80
0109 
0110 #define SISLANDS_DPM2_MAXPS_PERCENT_H                   99
0111 #define SISLANDS_DPM2_MAXPS_PERCENT_M                   99
0112 
0113 #define SISLANDS_DPM2_SQ_RAMP_MAX_POWER                 0x3FFF
0114 #define SISLANDS_DPM2_SQ_RAMP_MIN_POWER                 0x12
0115 #define SISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA           0x15
0116 #define SISLANDS_DPM2_SQ_RAMP_STI_SIZE                  0x1E
0117 #define SISLANDS_DPM2_SQ_RAMP_LTI_RATIO                 0xF
0118 
0119 #define SISLANDS_DPM2_PWREFFICIENCYRATIO_MARGIN         10
0120 
0121 #define SISLANDS_VRC_DFLT                               0xC000B3
0122 #define SISLANDS_ULVVOLTAGECHANGEDELAY_DFLT             1687
0123 #define SISLANDS_CGULVPARAMETER_DFLT                    0x00040035
0124 #define SISLANDS_CGULVCONTROL_DFLT                      0x1f007550
0125 
0126 #define SI_ASI_DFLT                                10000
0127 #define SI_BSP_DFLT                                0x41EB
0128 #define SI_BSU_DFLT                                0x2
0129 #define SI_AH_DFLT                                 5
0130 #define SI_RLP_DFLT                                25
0131 #define SI_RMP_DFLT                                65
0132 #define SI_LHP_DFLT                                40
0133 #define SI_LMP_DFLT                                15
0134 #define SI_TD_DFLT                                 0
0135 #define SI_UTC_DFLT_00                             0x24
0136 #define SI_UTC_DFLT_01                             0x22
0137 #define SI_UTC_DFLT_02                             0x22
0138 #define SI_UTC_DFLT_03                             0x22
0139 #define SI_UTC_DFLT_04                             0x22
0140 #define SI_UTC_DFLT_05                             0x22
0141 #define SI_UTC_DFLT_06                             0x22
0142 #define SI_UTC_DFLT_07                             0x22
0143 #define SI_UTC_DFLT_08                             0x22
0144 #define SI_UTC_DFLT_09                             0x22
0145 #define SI_UTC_DFLT_10                             0x22
0146 #define SI_UTC_DFLT_11                             0x22
0147 #define SI_UTC_DFLT_12                             0x22
0148 #define SI_UTC_DFLT_13                             0x22
0149 #define SI_UTC_DFLT_14                             0x22
0150 #define SI_DTC_DFLT_00                             0x24
0151 #define SI_DTC_DFLT_01                             0x22
0152 #define SI_DTC_DFLT_02                             0x22
0153 #define SI_DTC_DFLT_03                             0x22
0154 #define SI_DTC_DFLT_04                             0x22
0155 #define SI_DTC_DFLT_05                             0x22
0156 #define SI_DTC_DFLT_06                             0x22
0157 #define SI_DTC_DFLT_07                             0x22
0158 #define SI_DTC_DFLT_08                             0x22
0159 #define SI_DTC_DFLT_09                             0x22
0160 #define SI_DTC_DFLT_10                             0x22
0161 #define SI_DTC_DFLT_11                             0x22
0162 #define SI_DTC_DFLT_12                             0x22
0163 #define SI_DTC_DFLT_13                             0x22
0164 #define SI_DTC_DFLT_14                             0x22
0165 #define SI_VRC_DFLT                                0x0000C003
0166 #define SI_VOLTAGERESPONSETIME_DFLT                1000
0167 #define SI_BACKBIASRESPONSETIME_DFLT               1000
0168 #define SI_VRU_DFLT                                0x3
0169 #define SI_SPLLSTEPTIME_DFLT                       0x1000
0170 #define SI_SPLLSTEPUNIT_DFLT                       0x3
0171 #define SI_TPU_DFLT                                0
0172 #define SI_TPC_DFLT                                0x200
0173 #define SI_SSTU_DFLT                               0
0174 #define SI_SST_DFLT                                0x00C8
0175 #define SI_GICST_DFLT                              0x200
0176 #define SI_FCT_DFLT                                0x0400
0177 #define SI_FCTU_DFLT                               0
0178 #define SI_CTXCGTT3DRPHC_DFLT                      0x20
0179 #define SI_CTXCGTT3DRSDC_DFLT                      0x40
0180 #define SI_VDDC3DOORPHC_DFLT                       0x100
0181 #define SI_VDDC3DOORSDC_DFLT                       0x7
0182 #define SI_VDDC3DOORSU_DFLT                        0
0183 #define SI_MPLLLOCKTIME_DFLT                       100
0184 #define SI_MPLLRESETTIME_DFLT                      150
0185 #define SI_VCOSTEPPCT_DFLT                          20
0186 #define SI_ENDINGVCOSTEPPCT_DFLT                    5
0187 #define SI_REFERENCEDIVIDER_DFLT                    4
0188 
0189 #define SI_PM_NUMBER_OF_TC 15
0190 #define SI_PM_NUMBER_OF_SCLKS 20
0191 #define SI_PM_NUMBER_OF_MCLKS 4
0192 #define SI_PM_NUMBER_OF_VOLTAGE_LEVELS 4
0193 #define SI_PM_NUMBER_OF_ACTIVITY_LEVELS 3
0194 
0195 /* XXX are these ok? */
0196 #define SI_TEMP_RANGE_MIN (90 * 1000)
0197 #define SI_TEMP_RANGE_MAX (120 * 1000)
0198 
0199 #define FDO_PWM_MODE_STATIC  1
0200 #define FDO_PWM_MODE_STATIC_RPM 5
0201 
0202 enum ni_dc_cac_level
0203 {
0204     NISLANDS_DCCAC_LEVEL_0 = 0,
0205     NISLANDS_DCCAC_LEVEL_1,
0206     NISLANDS_DCCAC_LEVEL_2,
0207     NISLANDS_DCCAC_LEVEL_3,
0208     NISLANDS_DCCAC_LEVEL_4,
0209     NISLANDS_DCCAC_LEVEL_5,
0210     NISLANDS_DCCAC_LEVEL_6,
0211     NISLANDS_DCCAC_LEVEL_7,
0212     NISLANDS_DCCAC_MAX_LEVELS
0213 };
0214 
0215 enum si_cac_config_reg_type
0216 {
0217     SISLANDS_CACCONFIG_MMR = 0,
0218     SISLANDS_CACCONFIG_CGIND,
0219     SISLANDS_CACCONFIG_MAX
0220 };
0221 
0222 enum si_power_level {
0223     SI_POWER_LEVEL_LOW = 0,
0224     SI_POWER_LEVEL_MEDIUM = 1,
0225     SI_POWER_LEVEL_HIGH = 2,
0226     SI_POWER_LEVEL_CTXSW = 3,
0227 };
0228 
0229 enum si_td {
0230     SI_TD_AUTO,
0231     SI_TD_UP,
0232     SI_TD_DOWN,
0233 };
0234 
0235 enum si_display_watermark {
0236     SI_DISPLAY_WATERMARK_LOW = 0,
0237     SI_DISPLAY_WATERMARK_HIGH = 1,
0238 };
0239 
0240 enum si_display_gap
0241 {
0242     SI_PM_DISPLAY_GAP_VBLANK_OR_WM = 0,
0243     SI_PM_DISPLAY_GAP_VBLANK       = 1,
0244     SI_PM_DISPLAY_GAP_WATERMARK    = 2,
0245     SI_PM_DISPLAY_GAP_IGNORE       = 3,
0246 };
0247 
0248 extern const struct amdgpu_ip_block_version si_smu_ip_block;
0249 
0250 struct ni_leakage_coeffients
0251 {
0252     u32 at;
0253     u32 bt;
0254     u32 av;
0255     u32 bv;
0256     s32 t_slope;
0257     s32 t_intercept;
0258     u32 t_ref;
0259 };
0260 
0261 struct SMC_Evergreen_MCRegisterAddress
0262 {
0263     uint16_t s0;
0264     uint16_t s1;
0265 };
0266 
0267 typedef struct SMC_Evergreen_MCRegisterAddress SMC_Evergreen_MCRegisterAddress;
0268 
0269 struct evergreen_mc_reg_entry {
0270     u32 mclk_max;
0271     u32 mc_data[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
0272 };
0273 
0274 struct evergreen_mc_reg_table {
0275     u8 last;
0276     u8 num_entries;
0277     u16 valid_flag;
0278     struct evergreen_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
0279     SMC_Evergreen_MCRegisterAddress mc_reg_address[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
0280 };
0281 
0282 struct SMC_Evergreen_MCRegisterSet
0283 {
0284     uint32_t value[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
0285 };
0286 
0287 typedef struct SMC_Evergreen_MCRegisterSet SMC_Evergreen_MCRegisterSet;
0288 
0289 struct SMC_Evergreen_MCRegisters
0290 {
0291     uint8_t                             last;
0292     uint8_t                             reserved[3];
0293     SMC_Evergreen_MCRegisterAddress     address[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
0294     SMC_Evergreen_MCRegisterSet         data[5];
0295 };
0296 
0297 typedef struct SMC_Evergreen_MCRegisters SMC_Evergreen_MCRegisters;
0298 
0299 struct SMC_NIslands_MCRegisterSet
0300 {
0301     uint32_t value[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
0302 };
0303 
0304 typedef struct SMC_NIslands_MCRegisterSet SMC_NIslands_MCRegisterSet;
0305 
0306 struct ni_mc_reg_entry {
0307     u32 mclk_max;
0308     u32 mc_data[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
0309 };
0310 
0311 struct SMC_NIslands_MCRegisterAddress
0312 {
0313     uint16_t s0;
0314     uint16_t s1;
0315 };
0316 
0317 typedef struct SMC_NIslands_MCRegisterAddress SMC_NIslands_MCRegisterAddress;
0318 
0319 struct SMC_NIslands_MCRegisters
0320 {
0321     uint8_t                             last;
0322     uint8_t                             reserved[3];
0323     SMC_NIslands_MCRegisterAddress      address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
0324     SMC_NIslands_MCRegisterSet          data[SMC_NISLANDS_MC_REGISTER_ARRAY_SET_COUNT];
0325 };
0326 
0327 typedef struct SMC_NIslands_MCRegisters SMC_NIslands_MCRegisters;
0328 
0329 struct evergreen_ulv_param {
0330     bool supported;
0331     struct rv7xx_pl *pl;
0332 };
0333 
0334 struct evergreen_arb_registers {
0335     u32 mc_arb_dram_timing;
0336     u32 mc_arb_dram_timing2;
0337     u32 mc_arb_rfsh_rate;
0338     u32 mc_arb_burst_time;
0339 };
0340 
0341 struct at {
0342     u32 rlp;
0343     u32 rmp;
0344     u32 lhp;
0345     u32 lmp;
0346 };
0347 
0348 struct ni_clock_registers {
0349     u32 cg_spll_func_cntl;
0350     u32 cg_spll_func_cntl_2;
0351     u32 cg_spll_func_cntl_3;
0352     u32 cg_spll_func_cntl_4;
0353     u32 cg_spll_spread_spectrum;
0354     u32 cg_spll_spread_spectrum_2;
0355     u32 mclk_pwrmgt_cntl;
0356     u32 dll_cntl;
0357     u32 mpll_ad_func_cntl;
0358     u32 mpll_ad_func_cntl_2;
0359     u32 mpll_dq_func_cntl;
0360     u32 mpll_dq_func_cntl_2;
0361     u32 mpll_ss1;
0362     u32 mpll_ss2;
0363 };
0364 
0365 struct RV770_SMC_SCLK_VALUE
0366 {
0367     uint32_t        vCG_SPLL_FUNC_CNTL;
0368     uint32_t        vCG_SPLL_FUNC_CNTL_2;
0369     uint32_t        vCG_SPLL_FUNC_CNTL_3;
0370     uint32_t        vCG_SPLL_SPREAD_SPECTRUM;
0371     uint32_t        vCG_SPLL_SPREAD_SPECTRUM_2;
0372     uint32_t        sclk_value;
0373 };
0374 
0375 typedef struct RV770_SMC_SCLK_VALUE RV770_SMC_SCLK_VALUE;
0376 
0377 struct RV770_SMC_MCLK_VALUE
0378 {
0379     uint32_t        vMPLL_AD_FUNC_CNTL;
0380     uint32_t        vMPLL_AD_FUNC_CNTL_2;
0381     uint32_t        vMPLL_DQ_FUNC_CNTL;
0382     uint32_t        vMPLL_DQ_FUNC_CNTL_2;
0383     uint32_t        vMCLK_PWRMGT_CNTL;
0384     uint32_t        vDLL_CNTL;
0385     uint32_t        vMPLL_SS;
0386     uint32_t        vMPLL_SS2;
0387     uint32_t        mclk_value;
0388 };
0389 
0390 typedef struct RV770_SMC_MCLK_VALUE RV770_SMC_MCLK_VALUE;
0391 
0392 
0393 struct RV730_SMC_MCLK_VALUE
0394 {
0395     uint32_t        vMCLK_PWRMGT_CNTL;
0396     uint32_t        vDLL_CNTL;
0397     uint32_t        vMPLL_FUNC_CNTL;
0398     uint32_t        vMPLL_FUNC_CNTL2;
0399     uint32_t        vMPLL_FUNC_CNTL3;
0400     uint32_t        vMPLL_SS;
0401     uint32_t        vMPLL_SS2;
0402     uint32_t        mclk_value;
0403 };
0404 
0405 typedef struct RV730_SMC_MCLK_VALUE RV730_SMC_MCLK_VALUE;
0406 
0407 struct RV770_SMC_VOLTAGE_VALUE
0408 {
0409     uint16_t             value;
0410     uint8_t              index;
0411     uint8_t              padding;
0412 };
0413 
0414 typedef struct RV770_SMC_VOLTAGE_VALUE RV770_SMC_VOLTAGE_VALUE;
0415 
0416 union RV7XX_SMC_MCLK_VALUE
0417 {
0418     RV770_SMC_MCLK_VALUE    mclk770;
0419     RV730_SMC_MCLK_VALUE    mclk730;
0420 };
0421 
0422 typedef union RV7XX_SMC_MCLK_VALUE RV7XX_SMC_MCLK_VALUE, *LPRV7XX_SMC_MCLK_VALUE;
0423 
0424 struct RV770_SMC_HW_PERFORMANCE_LEVEL
0425 {
0426     uint8_t                 arbValue;
0427     union{
0428         uint8_t             seqValue;
0429         uint8_t             ACIndex;
0430     };
0431     uint8_t                 displayWatermark;
0432     uint8_t                 gen2PCIE;
0433     uint8_t                 gen2XSP;
0434     uint8_t                 backbias;
0435     uint8_t                 strobeMode;
0436     uint8_t                 mcFlags;
0437     uint32_t                aT;
0438     uint32_t                bSP;
0439     RV770_SMC_SCLK_VALUE    sclk;
0440     RV7XX_SMC_MCLK_VALUE    mclk;
0441     RV770_SMC_VOLTAGE_VALUE vddc;
0442     RV770_SMC_VOLTAGE_VALUE mvdd;
0443     RV770_SMC_VOLTAGE_VALUE vddci;
0444     uint8_t                 reserved1;
0445     uint8_t                 reserved2;
0446     uint8_t                 stateFlags;
0447     uint8_t                 padding;
0448 };
0449 
0450 typedef struct RV770_SMC_HW_PERFORMANCE_LEVEL RV770_SMC_HW_PERFORMANCE_LEVEL;
0451 
0452 struct RV770_SMC_SWSTATE
0453 {
0454     uint8_t           flags;
0455     uint8_t           padding1;
0456     uint8_t           padding2;
0457     uint8_t           padding3;
0458     RV770_SMC_HW_PERFORMANCE_LEVEL levels[RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
0459 };
0460 
0461 typedef struct RV770_SMC_SWSTATE RV770_SMC_SWSTATE;
0462 
0463 struct RV770_SMC_VOLTAGEMASKTABLE
0464 {
0465     uint8_t  highMask[RV770_SMC_VOLTAGEMASK_MAX];
0466     uint32_t lowMask[RV770_SMC_VOLTAGEMASK_MAX];
0467 };
0468 
0469 typedef struct RV770_SMC_VOLTAGEMASKTABLE RV770_SMC_VOLTAGEMASKTABLE;
0470 
0471 struct RV770_SMC_STATETABLE
0472 {
0473     uint8_t             thermalProtectType;
0474     uint8_t             systemFlags;
0475     uint8_t             maxVDDCIndexInPPTable;
0476     uint8_t             extraFlags;
0477     uint8_t             highSMIO[MAX_NO_VREG_STEPS];
0478     uint32_t            lowSMIO[MAX_NO_VREG_STEPS];
0479     RV770_SMC_VOLTAGEMASKTABLE voltageMaskTable;
0480     RV770_SMC_SWSTATE   initialState;
0481     RV770_SMC_SWSTATE   ACPIState;
0482     RV770_SMC_SWSTATE   driverState;
0483     RV770_SMC_SWSTATE   ULVState;
0484 };
0485 
0486 typedef struct RV770_SMC_STATETABLE RV770_SMC_STATETABLE;
0487 
0488 struct vddc_table_entry {
0489     u16 vddc;
0490     u8 vddc_index;
0491     u8 high_smio;
0492     u32 low_smio;
0493 };
0494 
0495 struct rv770_clock_registers {
0496     u32 cg_spll_func_cntl;
0497     u32 cg_spll_func_cntl_2;
0498     u32 cg_spll_func_cntl_3;
0499     u32 cg_spll_spread_spectrum;
0500     u32 cg_spll_spread_spectrum_2;
0501     u32 mpll_ad_func_cntl;
0502     u32 mpll_ad_func_cntl_2;
0503     u32 mpll_dq_func_cntl;
0504     u32 mpll_dq_func_cntl_2;
0505     u32 mclk_pwrmgt_cntl;
0506     u32 dll_cntl;
0507     u32 mpll_ss1;
0508     u32 mpll_ss2;
0509 };
0510 
0511 struct rv730_clock_registers {
0512     u32 cg_spll_func_cntl;
0513     u32 cg_spll_func_cntl_2;
0514     u32 cg_spll_func_cntl_3;
0515     u32 cg_spll_spread_spectrum;
0516     u32 cg_spll_spread_spectrum_2;
0517     u32 mclk_pwrmgt_cntl;
0518     u32 dll_cntl;
0519     u32 mpll_func_cntl;
0520     u32 mpll_func_cntl2;
0521     u32 mpll_func_cntl3;
0522     u32 mpll_ss;
0523     u32 mpll_ss2;
0524 };
0525 
0526 union r7xx_clock_registers {
0527     struct rv770_clock_registers rv770;
0528     struct rv730_clock_registers rv730;
0529 };
0530 
0531 struct rv7xx_power_info {
0532     /* flags */
0533     bool mem_gddr5;
0534     bool pcie_gen2;
0535     bool dynamic_pcie_gen2;
0536     bool acpi_pcie_gen2;
0537     bool boot_in_gen2;
0538     bool voltage_control; /* vddc */
0539     bool mvdd_control;
0540     bool sclk_ss;
0541     bool mclk_ss;
0542     bool dynamic_ss;
0543     bool gfx_clock_gating;
0544     bool mg_clock_gating;
0545     bool mgcgtssm;
0546     bool power_gating;
0547     bool thermal_protection;
0548     bool display_gap;
0549     bool dcodt;
0550     bool ulps;
0551     /* registers */
0552     union r7xx_clock_registers clk_regs;
0553     u32 s0_vid_lower_smio_cntl;
0554     /* voltage */
0555     u32 vddc_mask_low;
0556     u32 mvdd_mask_low;
0557     u32 mvdd_split_frequency;
0558     u32 mvdd_low_smio[MAX_NO_OF_MVDD_VALUES];
0559     u16 max_vddc;
0560     u16 max_vddc_in_table;
0561     u16 min_vddc_in_table;
0562     struct vddc_table_entry vddc_table[MAX_NO_VREG_STEPS];
0563     u8 valid_vddc_entries;
0564     /* dc odt */
0565     u32 mclk_odt_threshold;
0566     u8 odt_value_0[2];
0567     u8 odt_value_1[2];
0568     /* stored values */
0569     u32 boot_sclk;
0570     u16 acpi_vddc;
0571     u32 ref_div;
0572     u32 active_auto_throttle_sources;
0573     u32 mclk_stutter_mode_threshold;
0574     u32 mclk_strobe_mode_threshold;
0575     u32 mclk_edc_enable_threshold;
0576     u32 bsp;
0577     u32 bsu;
0578     u32 pbsp;
0579     u32 pbsu;
0580     u32 dsp;
0581     u32 psp;
0582     u32 asi;
0583     u32 pasi;
0584     u32 vrc;
0585     u32 restricted_levels;
0586     u32 rlp;
0587     u32 rmp;
0588     u32 lhp;
0589     u32 lmp;
0590     /* smc offsets */
0591     u16 state_table_start;
0592     u16 soft_regs_start;
0593     u16 sram_end;
0594     /* scratch structs */
0595     RV770_SMC_STATETABLE smc_statetable;
0596 };
0597 
0598 enum si_pcie_gen {
0599     SI_PCIE_GEN1 = 0,
0600     SI_PCIE_GEN2 = 1,
0601     SI_PCIE_GEN3 = 2,
0602     SI_PCIE_GEN_INVALID = 0xffff
0603 };
0604 
0605 struct rv7xx_pl {
0606     u32 sclk;
0607     u32 mclk;
0608     u16 vddc;
0609     u16 vddci; /* eg+ only */
0610     u32 flags;
0611     enum si_pcie_gen pcie_gen; /* si+ only */
0612 };
0613 
0614 struct rv7xx_ps {
0615     struct rv7xx_pl high;
0616     struct rv7xx_pl medium;
0617     struct rv7xx_pl low;
0618     bool dc_compatible;
0619 };
0620 
0621 struct si_ps {
0622     u16 performance_level_count;
0623     bool dc_compatible;
0624     struct rv7xx_pl performance_levels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
0625 };
0626 
0627 struct ni_mc_reg_table {
0628     u8 last;
0629     u8 num_entries;
0630     u16 valid_flag;
0631     struct ni_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
0632     SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
0633 };
0634 
0635 struct ni_cac_data
0636 {
0637     struct ni_leakage_coeffients leakage_coefficients;
0638     u32 i_leakage;
0639     s32 leakage_minimum_temperature;
0640     u32 pwr_const;
0641     u32 dc_cac_value;
0642     u32 bif_cac_value;
0643     u32 lkge_pwr;
0644     u8 mc_wr_weight;
0645     u8 mc_rd_weight;
0646     u8 allow_ovrflw;
0647     u8 num_win_tdp;
0648     u8 l2num_win_tdp;
0649     u8 lts_truncate_n;
0650 };
0651 
0652 struct evergreen_power_info {
0653     /* must be first! */
0654     struct rv7xx_power_info rv7xx;
0655     /* flags */
0656     bool vddci_control;
0657     bool dynamic_ac_timing;
0658     bool abm;
0659     bool mcls;
0660     bool light_sleep;
0661     bool memory_transition;
0662     bool pcie_performance_request;
0663     bool pcie_performance_request_registered;
0664     bool sclk_deep_sleep;
0665     bool dll_default_on;
0666     bool ls_clock_gating;
0667     bool smu_uvd_hs;
0668     bool uvd_enabled;
0669     /* stored values */
0670     u16 acpi_vddci;
0671     u8 mvdd_high_index;
0672     u8 mvdd_low_index;
0673     u32 mclk_edc_wr_enable_threshold;
0674     struct evergreen_mc_reg_table mc_reg_table;
0675     struct atom_voltage_table vddc_voltage_table;
0676     struct atom_voltage_table vddci_voltage_table;
0677     struct evergreen_arb_registers bootup_arb_registers;
0678     struct evergreen_ulv_param ulv;
0679     struct at ats[2];
0680     /* smc offsets */
0681     u16 mc_reg_table_start;
0682     struct amdgpu_ps current_rps;
0683     struct rv7xx_ps current_ps;
0684     struct amdgpu_ps requested_rps;
0685     struct rv7xx_ps requested_ps;
0686 };
0687 
0688 struct PP_NIslands_Dpm2PerfLevel
0689 {
0690     uint8_t     MaxPS;
0691     uint8_t     TgtAct;
0692     uint8_t     MaxPS_StepInc;
0693     uint8_t     MaxPS_StepDec;
0694     uint8_t     PSST;
0695     uint8_t     NearTDPDec;
0696     uint8_t     AboveSafeInc;
0697     uint8_t     BelowSafeInc;
0698     uint8_t     PSDeltaLimit;
0699     uint8_t     PSDeltaWin;
0700     uint8_t     Reserved[6];
0701 };
0702 
0703 typedef struct PP_NIslands_Dpm2PerfLevel PP_NIslands_Dpm2PerfLevel;
0704 
0705 struct PP_NIslands_DPM2Parameters
0706 {
0707     uint32_t    TDPLimit;
0708     uint32_t    NearTDPLimit;
0709     uint32_t    SafePowerLimit;
0710     uint32_t    PowerBoostLimit;
0711 };
0712 typedef struct PP_NIslands_DPM2Parameters PP_NIslands_DPM2Parameters;
0713 
0714 struct NISLANDS_SMC_SCLK_VALUE
0715 {
0716     uint32_t        vCG_SPLL_FUNC_CNTL;
0717     uint32_t        vCG_SPLL_FUNC_CNTL_2;
0718     uint32_t        vCG_SPLL_FUNC_CNTL_3;
0719     uint32_t        vCG_SPLL_FUNC_CNTL_4;
0720     uint32_t        vCG_SPLL_SPREAD_SPECTRUM;
0721     uint32_t        vCG_SPLL_SPREAD_SPECTRUM_2;
0722     uint32_t        sclk_value;
0723 };
0724 
0725 typedef struct NISLANDS_SMC_SCLK_VALUE NISLANDS_SMC_SCLK_VALUE;
0726 
0727 struct NISLANDS_SMC_MCLK_VALUE
0728 {
0729     uint32_t        vMPLL_FUNC_CNTL;
0730     uint32_t        vMPLL_FUNC_CNTL_1;
0731     uint32_t        vMPLL_FUNC_CNTL_2;
0732     uint32_t        vMPLL_AD_FUNC_CNTL;
0733     uint32_t        vMPLL_AD_FUNC_CNTL_2;
0734     uint32_t        vMPLL_DQ_FUNC_CNTL;
0735     uint32_t        vMPLL_DQ_FUNC_CNTL_2;
0736     uint32_t        vMCLK_PWRMGT_CNTL;
0737     uint32_t        vDLL_CNTL;
0738     uint32_t        vMPLL_SS;
0739     uint32_t        vMPLL_SS2;
0740     uint32_t        mclk_value;
0741 };
0742 
0743 typedef struct NISLANDS_SMC_MCLK_VALUE NISLANDS_SMC_MCLK_VALUE;
0744 
0745 struct NISLANDS_SMC_VOLTAGE_VALUE
0746 {
0747     uint16_t             value;
0748     uint8_t              index;
0749     uint8_t              padding;
0750 };
0751 
0752 typedef struct NISLANDS_SMC_VOLTAGE_VALUE NISLANDS_SMC_VOLTAGE_VALUE;
0753 
0754 struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL
0755 {
0756     uint8_t                     arbValue;
0757     uint8_t                     ACIndex;
0758     uint8_t                     displayWatermark;
0759     uint8_t                     gen2PCIE;
0760     uint8_t                     reserved1;
0761     uint8_t                     reserved2;
0762     uint8_t                     strobeMode;
0763     uint8_t                     mcFlags;
0764     uint32_t                    aT;
0765     uint32_t                    bSP;
0766     NISLANDS_SMC_SCLK_VALUE     sclk;
0767     NISLANDS_SMC_MCLK_VALUE     mclk;
0768     NISLANDS_SMC_VOLTAGE_VALUE  vddc;
0769     NISLANDS_SMC_VOLTAGE_VALUE  mvdd;
0770     NISLANDS_SMC_VOLTAGE_VALUE  vddci;
0771     NISLANDS_SMC_VOLTAGE_VALUE  std_vddc;
0772     uint32_t                    powergate_en;
0773     uint8_t                     hUp;
0774     uint8_t                     hDown;
0775     uint8_t                     stateFlags;
0776     uint8_t                     arbRefreshState;
0777     uint32_t                    SQPowerThrottle;
0778     uint32_t                    SQPowerThrottle_2;
0779     uint32_t                    reserved[2];
0780     PP_NIslands_Dpm2PerfLevel   dpm2;
0781 };
0782 
0783 typedef struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL NISLANDS_SMC_HW_PERFORMANCE_LEVEL;
0784 
0785 struct NISLANDS_SMC_SWSTATE
0786 {
0787     uint8_t                             flags;
0788     uint8_t                             levelCount;
0789     uint8_t                             padding2;
0790     uint8_t                             padding3;
0791     NISLANDS_SMC_HW_PERFORMANCE_LEVEL   levels[];
0792 };
0793 
0794 typedef struct NISLANDS_SMC_SWSTATE NISLANDS_SMC_SWSTATE;
0795 
0796 struct NISLANDS_SMC_VOLTAGEMASKTABLE
0797 {
0798     uint8_t  highMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
0799     uint32_t lowMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
0800 };
0801 
0802 typedef struct NISLANDS_SMC_VOLTAGEMASKTABLE NISLANDS_SMC_VOLTAGEMASKTABLE;
0803 
0804 #define NISLANDS_MAX_NO_VREG_STEPS 32
0805 
0806 struct NISLANDS_SMC_STATETABLE
0807 {
0808     uint8_t                             thermalProtectType;
0809     uint8_t                             systemFlags;
0810     uint8_t                             maxVDDCIndexInPPTable;
0811     uint8_t                             extraFlags;
0812     uint8_t                             highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
0813     uint32_t                            lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
0814     NISLANDS_SMC_VOLTAGEMASKTABLE       voltageMaskTable;
0815     PP_NIslands_DPM2Parameters          dpm2Params;
0816     NISLANDS_SMC_SWSTATE                initialState;
0817     NISLANDS_SMC_SWSTATE                ACPIState;
0818     NISLANDS_SMC_SWSTATE                ULVState;
0819     NISLANDS_SMC_SWSTATE                driverState;
0820     NISLANDS_SMC_HW_PERFORMANCE_LEVEL   dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
0821 };
0822 
0823 typedef struct NISLANDS_SMC_STATETABLE NISLANDS_SMC_STATETABLE;
0824 
0825 struct ni_power_info {
0826     /* must be first! */
0827     struct evergreen_power_info eg;
0828     struct ni_clock_registers clock_registers;
0829     struct ni_mc_reg_table mc_reg_table;
0830     u32 mclk_rtt_mode_threshold;
0831     /* flags */
0832     bool use_power_boost_limit;
0833     bool support_cac_long_term_average;
0834     bool cac_enabled;
0835     bool cac_configuration_required;
0836     bool driver_calculate_cac_leakage;
0837     bool pc_enabled;
0838     bool enable_power_containment;
0839     bool enable_cac;
0840     bool enable_sq_ramping;
0841     /* smc offsets */
0842     u16 arb_table_start;
0843     u16 fan_table_start;
0844     u16 cac_table_start;
0845     u16 spll_table_start;
0846     /* CAC stuff */
0847     struct ni_cac_data cac_data;
0848     u32 dc_cac_table[NISLANDS_DCCAC_MAX_LEVELS];
0849     const struct ni_cac_weights *cac_weights;
0850     u8 lta_window_size;
0851     u8 lts_truncate;
0852     struct si_ps current_ps;
0853     struct si_ps requested_ps;
0854     /* scratch structs */
0855     SMC_NIslands_MCRegisters smc_mc_reg_table;
0856     NISLANDS_SMC_STATETABLE smc_statetable;
0857 };
0858 
0859 struct si_cac_config_reg
0860 {
0861     u32 offset;
0862     u32 mask;
0863     u32 shift;
0864     u32 value;
0865     enum si_cac_config_reg_type type;
0866 };
0867 
0868 struct si_powertune_data
0869 {
0870     u32 cac_window;
0871     u32 l2_lta_window_size_default;
0872     u8 lts_truncate_default;
0873     u8 shift_n_default;
0874     u8 operating_temp;
0875     struct ni_leakage_coeffients leakage_coefficients;
0876     u32 fixed_kt;
0877     u32 lkge_lut_v0_percent;
0878     u8 dc_cac[NISLANDS_DCCAC_MAX_LEVELS];
0879     bool enable_powertune_by_default;
0880 };
0881 
0882 struct si_dyn_powertune_data
0883 {
0884     u32 cac_leakage;
0885     s32 leakage_minimum_temperature;
0886     u32 wintime;
0887     u32 l2_lta_window_size;
0888     u8 lts_truncate;
0889     u8 shift_n;
0890     u8 dc_pwr_value;
0891     bool disable_uvd_powertune;
0892 };
0893 
0894 struct si_dte_data
0895 {
0896     u32 tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
0897     u32 r[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
0898     u32 k;
0899     u32 t0;
0900     u32 max_t;
0901     u8 window_size;
0902     u8 temp_select;
0903     u8 dte_mode;
0904     u8 tdep_count;
0905     u8 t_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
0906     u32 tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
0907     u32 tdep_r[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
0908     u32 t_threshold;
0909     bool enable_dte_by_default;
0910 };
0911 
0912 struct si_clock_registers {
0913     u32 cg_spll_func_cntl;
0914     u32 cg_spll_func_cntl_2;
0915     u32 cg_spll_func_cntl_3;
0916     u32 cg_spll_func_cntl_4;
0917     u32 cg_spll_spread_spectrum;
0918     u32 cg_spll_spread_spectrum_2;
0919     u32 dll_cntl;
0920     u32 mclk_pwrmgt_cntl;
0921     u32 mpll_ad_func_cntl;
0922     u32 mpll_dq_func_cntl;
0923     u32 mpll_func_cntl;
0924     u32 mpll_func_cntl_1;
0925     u32 mpll_func_cntl_2;
0926     u32 mpll_ss1;
0927     u32 mpll_ss2;
0928 };
0929 
0930 struct si_mc_reg_entry {
0931     u32 mclk_max;
0932     u32 mc_data[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
0933 };
0934 
0935 struct si_mc_reg_table {
0936     u8 last;
0937     u8 num_entries;
0938     u16 valid_flag;
0939     struct si_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
0940     SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
0941 };
0942 
0943 struct si_leakage_voltage_entry
0944 {
0945     u16 voltage;
0946     u16 leakage_index;
0947 };
0948 
0949 struct si_leakage_voltage
0950 {
0951     u16 count;
0952     struct si_leakage_voltage_entry entries[SISLANDS_MAX_LEAKAGE_COUNT];
0953 };
0954 
0955 
0956 struct si_ulv_param {
0957     bool supported;
0958     u32 cg_ulv_control;
0959     u32 cg_ulv_parameter;
0960     u32 volt_change_delay;
0961     struct rv7xx_pl pl;
0962     bool one_pcie_lane_in_ulv;
0963 };
0964 
0965 struct si_power_info {
0966     /* must be first! */
0967     struct ni_power_info ni;
0968     struct si_clock_registers clock_registers;
0969     struct si_mc_reg_table mc_reg_table;
0970     struct atom_voltage_table mvdd_voltage_table;
0971     struct atom_voltage_table vddc_phase_shed_table;
0972     struct si_leakage_voltage leakage_voltage;
0973     u16 mvdd_bootup_value;
0974     struct si_ulv_param ulv;
0975     u32 max_cu;
0976     /* pcie gen */
0977     enum si_pcie_gen force_pcie_gen;
0978     enum si_pcie_gen boot_pcie_gen;
0979     enum si_pcie_gen acpi_pcie_gen;
0980     u32 sys_pcie_mask;
0981     /* flags */
0982     bool enable_dte;
0983     bool enable_ppm;
0984     bool vddc_phase_shed_control;
0985     bool pspp_notify_required;
0986     bool sclk_deep_sleep_above_low;
0987     bool voltage_control_svi2;
0988     bool vddci_control_svi2;
0989     /* smc offsets */
0990     u32 sram_end;
0991     u32 state_table_start;
0992     u32 soft_regs_start;
0993     u32 mc_reg_table_start;
0994     u32 arb_table_start;
0995     u32 cac_table_start;
0996     u32 dte_table_start;
0997     u32 spll_table_start;
0998     u32 papm_cfg_table_start;
0999     u32 fan_table_start;
1000     /* CAC stuff */
1001     const struct si_cac_config_reg *cac_weights;
1002     const struct si_cac_config_reg *lcac_config;
1003     const struct si_cac_config_reg *cac_override;
1004     const struct si_powertune_data *powertune_data;
1005     struct si_dyn_powertune_data dyn_powertune_data;
1006     /* DTE stuff */
1007     struct si_dte_data dte_data;
1008     /* scratch structs */
1009     SMC_SIslands_MCRegisters smc_mc_reg_table;
1010     SISLANDS_SMC_STATETABLE smc_statetable;
1011     PP_SIslands_PAPMParameters papm_parm;
1012     /* SVI2 */
1013     u8 svd_gpio_id;
1014     u8 svc_gpio_id;
1015     /* fan control */
1016     bool fan_ctrl_is_in_default_mode;
1017     u32 t_min;
1018     u32 fan_ctrl_default_mode;
1019     bool fan_is_controlled_by_smc;
1020 };
1021 
1022 #endif