Path: blob/master/drivers/gpu/drm/amd/pm/legacy-dpm/sislands_smc.h
26535 views
/*1* Copyright 2013 Advanced Micro Devices, Inc.2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice shall be included in11* all copies or substantial portions of the Software.12*13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR14* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,15* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL16* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR17* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,18* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR19* OTHER DEALINGS IN THE SOFTWARE.20*21*/22#ifndef PP_SISLANDS_SMC_H23#define PP_SISLANDS_SMC_H2425#include "ppsmc.h"2627#pragma pack(push, 1)2829#define SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 163031struct PP_SIslands_Dpm2PerfLevel {32uint8_t MaxPS;33uint8_t TgtAct;34uint8_t MaxPS_StepInc;35uint8_t MaxPS_StepDec;36uint8_t PSSamplingTime;37uint8_t NearTDPDec;38uint8_t AboveSafeInc;39uint8_t BelowSafeInc;40uint8_t PSDeltaLimit;41uint8_t PSDeltaWin;42uint16_t PwrEfficiencyRatio;43uint8_t Reserved[4];44};4546typedef struct PP_SIslands_Dpm2PerfLevel PP_SIslands_Dpm2PerfLevel;4748struct PP_SIslands_DPM2Status {49uint32_t dpm2Flags;50uint8_t CurrPSkip;51uint8_t CurrPSkipPowerShift;52uint8_t CurrPSkipTDP;53uint8_t CurrPSkipOCP;54uint8_t MaxSPLLIndex;55uint8_t MinSPLLIndex;56uint8_t CurrSPLLIndex;57uint8_t InfSweepMode;58uint8_t InfSweepDir;59uint8_t TDPexceeded;60uint8_t reserved;61uint8_t SwitchDownThreshold;62uint32_t SwitchDownCounter;63uint32_t SysScalingFactor;64};6566typedef struct PP_SIslands_DPM2Status PP_SIslands_DPM2Status;6768struct PP_SIslands_DPM2Parameters {69uint32_t TDPLimit;70uint32_t NearTDPLimit;71uint32_t SafePowerLimit;72uint32_t PowerBoostLimit;73uint32_t MinLimitDelta;74};75typedef struct PP_SIslands_DPM2Parameters PP_SIslands_DPM2Parameters;7677struct PP_SIslands_PAPMStatus {78uint32_t EstimatedDGPU_T;79uint32_t EstimatedDGPU_P;80uint32_t EstimatedAPU_T;81uint32_t EstimatedAPU_P;82uint8_t dGPU_T_Limit_Exceeded;83uint8_t reserved[3];84};85typedef struct PP_SIslands_PAPMStatus PP_SIslands_PAPMStatus;8687struct PP_SIslands_PAPMParameters {88uint32_t NearTDPLimitTherm;89uint32_t NearTDPLimitPAPM;90uint32_t PlatformPowerLimit;91uint32_t dGPU_T_Limit;92uint32_t dGPU_T_Warning;93uint32_t dGPU_T_Hysteresis;94};95typedef struct PP_SIslands_PAPMParameters PP_SIslands_PAPMParameters;9697struct SISLANDS_SMC_SCLK_VALUE {98uint32_t vCG_SPLL_FUNC_CNTL;99uint32_t vCG_SPLL_FUNC_CNTL_2;100uint32_t vCG_SPLL_FUNC_CNTL_3;101uint32_t vCG_SPLL_FUNC_CNTL_4;102uint32_t vCG_SPLL_SPREAD_SPECTRUM;103uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;104uint32_t sclk_value;105};106107typedef struct SISLANDS_SMC_SCLK_VALUE SISLANDS_SMC_SCLK_VALUE;108109struct SISLANDS_SMC_MCLK_VALUE {110uint32_t vMPLL_FUNC_CNTL;111uint32_t vMPLL_FUNC_CNTL_1;112uint32_t vMPLL_FUNC_CNTL_2;113uint32_t vMPLL_AD_FUNC_CNTL;114uint32_t vMPLL_DQ_FUNC_CNTL;115uint32_t vMCLK_PWRMGT_CNTL;116uint32_t vDLL_CNTL;117uint32_t vMPLL_SS;118uint32_t vMPLL_SS2;119uint32_t mclk_value;120};121122typedef struct SISLANDS_SMC_MCLK_VALUE SISLANDS_SMC_MCLK_VALUE;123124struct SISLANDS_SMC_VOLTAGE_VALUE {125uint16_t value;126uint8_t index;127uint8_t phase_settings;128};129130typedef struct SISLANDS_SMC_VOLTAGE_VALUE SISLANDS_SMC_VOLTAGE_VALUE;131132struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL {133uint8_t ACIndex;134uint8_t displayWatermark;135uint8_t gen2PCIE;136uint8_t UVDWatermark;137uint8_t VCEWatermark;138uint8_t strobeMode;139uint8_t mcFlags;140uint8_t padding;141uint32_t aT;142uint32_t bSP;143SISLANDS_SMC_SCLK_VALUE sclk;144SISLANDS_SMC_MCLK_VALUE mclk;145SISLANDS_SMC_VOLTAGE_VALUE vddc;146SISLANDS_SMC_VOLTAGE_VALUE mvdd;147SISLANDS_SMC_VOLTAGE_VALUE vddci;148SISLANDS_SMC_VOLTAGE_VALUE std_vddc;149uint8_t hysteresisUp;150uint8_t hysteresisDown;151uint8_t stateFlags;152uint8_t arbRefreshState;153uint32_t SQPowerThrottle;154uint32_t SQPowerThrottle_2;155uint32_t MaxPoweredUpCU;156SISLANDS_SMC_VOLTAGE_VALUE high_temp_vddc;157SISLANDS_SMC_VOLTAGE_VALUE low_temp_vddc;158uint32_t reserved[2];159PP_SIslands_Dpm2PerfLevel dpm2;160};161162#define SISLANDS_SMC_STROBE_RATIO 0x0F163#define SISLANDS_SMC_STROBE_ENABLE 0x10164165#define SISLANDS_SMC_MC_EDC_RD_FLAG 0x01166#define SISLANDS_SMC_MC_EDC_WR_FLAG 0x02167#define SISLANDS_SMC_MC_RTT_ENABLE 0x04168#define SISLANDS_SMC_MC_STUTTER_EN 0x08169#define SISLANDS_SMC_MC_PG_EN 0x10170171typedef struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL SISLANDS_SMC_HW_PERFORMANCE_LEVEL;172173struct SISLANDS_SMC_SWSTATE {174uint8_t flags;175uint8_t levelCount;176uint8_t padding2;177uint8_t padding3;178SISLANDS_SMC_HW_PERFORMANCE_LEVEL levels[];179};180181typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE;182183struct SISLANDS_SMC_SWSTATE_SINGLE {184uint8_t flags;185uint8_t levelCount;186uint8_t padding2;187uint8_t padding3;188SISLANDS_SMC_HW_PERFORMANCE_LEVEL level;189};190191#define SISLANDS_SMC_VOLTAGEMASK_VDDC 0192#define SISLANDS_SMC_VOLTAGEMASK_MVDD 1193#define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2194#define SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING 3195#define SISLANDS_SMC_VOLTAGEMASK_MAX 4196197struct SISLANDS_SMC_VOLTAGEMASKTABLE {198uint32_t lowMask[SISLANDS_SMC_VOLTAGEMASK_MAX];199};200201typedef struct SISLANDS_SMC_VOLTAGEMASKTABLE SISLANDS_SMC_VOLTAGEMASKTABLE;202203#define SISLANDS_MAX_NO_VREG_STEPS 32204205struct SISLANDS_SMC_STATETABLE {206uint8_t thermalProtectType;207uint8_t systemFlags;208uint8_t maxVDDCIndexInPPTable;209uint8_t extraFlags;210uint32_t lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];211SISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;212SISLANDS_SMC_VOLTAGEMASKTABLE phaseMaskTable;213PP_SIslands_DPM2Parameters dpm2Params;214struct SISLANDS_SMC_SWSTATE_SINGLE initialState;215struct SISLANDS_SMC_SWSTATE_SINGLE ACPIState;216struct SISLANDS_SMC_SWSTATE_SINGLE ULVState;217SISLANDS_SMC_SWSTATE driverState;218SISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];219};220221typedef struct SISLANDS_SMC_STATETABLE SISLANDS_SMC_STATETABLE;222223#define SI_SMC_SOFT_REGISTER_mclk_chg_timeout 0x0224#define SI_SMC_SOFT_REGISTER_delay_vreg 0xC225#define SI_SMC_SOFT_REGISTER_delay_acpi 0x28226#define SI_SMC_SOFT_REGISTER_seq_index 0x5C227#define SI_SMC_SOFT_REGISTER_mvdd_chg_time 0x60228#define SI_SMC_SOFT_REGISTER_mclk_switch_lim 0x70229#define SI_SMC_SOFT_REGISTER_watermark_threshold 0x78230#define SI_SMC_SOFT_REGISTER_phase_shedding_delay 0x88231#define SI_SMC_SOFT_REGISTER_ulv_volt_change_delay 0x8C232#define SI_SMC_SOFT_REGISTER_mc_block_delay 0x98233#define SI_SMC_SOFT_REGISTER_ticks_per_us 0xA8234#define SI_SMC_SOFT_REGISTER_crtc_index 0xC4235#define SI_SMC_SOFT_REGISTER_mclk_change_block_cp_min 0xC8236#define SI_SMC_SOFT_REGISTER_mclk_change_block_cp_max 0xCC237#define SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width 0xF4238#define SI_SMC_SOFT_REGISTER_tdr_is_about_to_happen 0xFC239#define SI_SMC_SOFT_REGISTER_vr_hot_gpio 0x100240#define SI_SMC_SOFT_REGISTER_svi_rework_plat_type 0x118241#define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd 0x11c242#define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc 0x120243244struct PP_SIslands_FanTable {245uint8_t fdo_mode;246uint8_t padding;247int16_t temp_min;248int16_t temp_med;249int16_t temp_max;250int16_t slope1;251int16_t slope2;252int16_t fdo_min;253int16_t hys_up;254int16_t hys_down;255int16_t hys_slope;256int16_t temp_resp_lim;257int16_t temp_curr;258int16_t slope_curr;259int16_t pwm_curr;260uint32_t refresh_period;261int16_t fdo_max;262uint8_t temp_src;263int8_t padding2;264};265266typedef struct PP_SIslands_FanTable PP_SIslands_FanTable;267268#define SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16269#define SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES 32270271#define SMC_SISLANDS_SCALE_I 7272#define SMC_SISLANDS_SCALE_R 12273274struct PP_SIslands_CacConfig {275uint16_t cac_lkge_lut[SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES][SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES];276uint32_t lkge_lut_V0;277uint32_t lkge_lut_Vstep;278uint32_t WinTime;279uint32_t R_LL;280uint32_t calculation_repeats;281uint32_t l2numWin_TDP;282uint32_t dc_cac;283uint8_t lts_truncate_n;284uint8_t SHIFT_N;285uint8_t log2_PG_LKG_SCALE;286uint8_t cac_temp;287uint32_t lkge_lut_T0;288uint32_t lkge_lut_Tstep;289};290291typedef struct PP_SIslands_CacConfig PP_SIslands_CacConfig;292293#define SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE 16294#define SMC_SISLANDS_MC_REGISTER_ARRAY_SET_COUNT 20295296struct SMC_SIslands_MCRegisterAddress {297uint16_t s0;298uint16_t s1;299};300301typedef struct SMC_SIslands_MCRegisterAddress SMC_SIslands_MCRegisterAddress;302303struct SMC_SIslands_MCRegisterSet {304uint32_t value[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];305};306307typedef struct SMC_SIslands_MCRegisterSet SMC_SIslands_MCRegisterSet;308309struct SMC_SIslands_MCRegisters {310uint8_t last;311uint8_t reserved[3];312SMC_SIslands_MCRegisterAddress address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];313SMC_SIslands_MCRegisterSet data[SMC_SISLANDS_MC_REGISTER_ARRAY_SET_COUNT];314};315316typedef struct SMC_SIslands_MCRegisters SMC_SIslands_MCRegisters;317318struct SMC_SIslands_MCArbDramTimingRegisterSet {319uint32_t mc_arb_dram_timing;320uint32_t mc_arb_dram_timing2;321uint8_t mc_arb_rfsh_rate;322uint8_t mc_arb_burst_time;323uint8_t padding[2];324};325326typedef struct SMC_SIslands_MCArbDramTimingRegisterSet SMC_SIslands_MCArbDramTimingRegisterSet;327328struct SMC_SIslands_MCArbDramTimingRegisters {329uint8_t arb_current;330uint8_t reserved[3];331SMC_SIslands_MCArbDramTimingRegisterSet data[16];332};333334typedef struct SMC_SIslands_MCArbDramTimingRegisters SMC_SIslands_MCArbDramTimingRegisters;335336struct SMC_SISLANDS_SPLL_DIV_TABLE {337uint32_t freq[256];338uint32_t ss[256];339};340341#define SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_MASK 0x01ffffff342#define SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT 0343#define SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_MASK 0xfe000000344#define SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT 25345#define SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_MASK 0x000fffff346#define SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT 0347#define SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_MASK 0xfff00000348#define SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT 20349350typedef struct SMC_SISLANDS_SPLL_DIV_TABLE SMC_SISLANDS_SPLL_DIV_TABLE;351352#define SMC_SISLANDS_DTE_MAX_FILTER_STAGES 5353354#define SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE 16355356struct Smc_SIslands_DTE_Configuration {357uint32_t tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];358uint32_t R[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];359uint32_t K;360uint32_t T0;361uint32_t MaxT;362uint8_t WindowSize;363uint8_t Tdep_count;364uint8_t temp_select;365uint8_t DTE_mode;366uint8_t T_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];367uint32_t Tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];368uint32_t Tdep_R[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];369uint32_t Tthreshold;370};371372typedef struct Smc_SIslands_DTE_Configuration Smc_SIslands_DTE_Configuration;373374#define SMC_SISLANDS_DTE_STATUS_FLAG_DTE_ON 1375376#define SISLANDS_SMC_FIRMWARE_HEADER_LOCATION 0x10000377378#define SISLANDS_SMC_FIRMWARE_HEADER_version 0x0379#define SISLANDS_SMC_FIRMWARE_HEADER_flags 0x4380#define SISLANDS_SMC_FIRMWARE_HEADER_softRegisters 0xC381#define SISLANDS_SMC_FIRMWARE_HEADER_stateTable 0x10382#define SISLANDS_SMC_FIRMWARE_HEADER_fanTable 0x14383#define SISLANDS_SMC_FIRMWARE_HEADER_CacConfigTable 0x18384#define SISLANDS_SMC_FIRMWARE_HEADER_mcRegisterTable 0x24385#define SISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable 0x30386#define SISLANDS_SMC_FIRMWARE_HEADER_spllTable 0x38387#define SISLANDS_SMC_FIRMWARE_HEADER_DteConfiguration 0x40388#define SISLANDS_SMC_FIRMWARE_HEADER_PAPMParameters 0x48389390#pragma pack(pop)391392int amdgpu_si_copy_bytes_to_smc(struct amdgpu_device *adev,393u32 smc_start_address,394const u8 *src, u32 byte_count, u32 limit);395void amdgpu_si_start_smc(struct amdgpu_device *adev);396void amdgpu_si_reset_smc(struct amdgpu_device *adev);397int amdgpu_si_program_jump_on_start(struct amdgpu_device *adev);398void amdgpu_si_smc_clock(struct amdgpu_device *adev, bool enable);399bool amdgpu_si_is_smc_running(struct amdgpu_device *adev);400PPSMC_Result amdgpu_si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg);401PPSMC_Result amdgpu_si_wait_for_smc_inactive(struct amdgpu_device *adev);402int amdgpu_si_load_smc_ucode(struct amdgpu_device *adev, u32 limit);403int amdgpu_si_read_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address,404u32 *value, u32 limit);405int amdgpu_si_write_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address,406u32 value, u32 limit);407408#endif409410411412