1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2015 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 _HWMGR_H_ 24*4882a593Smuzhiyun #define _HWMGR_H_ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #include <linux/seq_file.h> 27*4882a593Smuzhiyun #include "amd_powerplay.h" 28*4882a593Smuzhiyun #include "hardwaremanager.h" 29*4882a593Smuzhiyun #include "hwmgr_ppt.h" 30*4882a593Smuzhiyun #include "ppatomctrl.h" 31*4882a593Smuzhiyun #include "power_state.h" 32*4882a593Smuzhiyun #include "smu_helper.h" 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct pp_hwmgr; 35*4882a593Smuzhiyun struct phm_fan_speed_info; 36*4882a593Smuzhiyun struct pp_atomctrl_voltage_table; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define VOLTAGE_SCALE 4 39*4882a593Smuzhiyun #define VOLTAGE_VID_OFFSET_SCALE1 625 40*4882a593Smuzhiyun #define VOLTAGE_VID_OFFSET_SCALE2 100 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun enum DISPLAY_GAP { 43*4882a593Smuzhiyun DISPLAY_GAP_VBLANK_OR_WM = 0, /* Wait for vblank or MCHG watermark. */ 44*4882a593Smuzhiyun DISPLAY_GAP_VBLANK = 1, /* Wait for vblank. */ 45*4882a593Smuzhiyun DISPLAY_GAP_WATERMARK = 2, /* Wait for MCHG watermark. (Note that HW may deassert WM in VBI depending on DC_STUTTER_CNTL.) */ 46*4882a593Smuzhiyun DISPLAY_GAP_IGNORE = 3 /* Do not wait. */ 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun typedef enum DISPLAY_GAP DISPLAY_GAP; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun enum BACO_STATE { 51*4882a593Smuzhiyun BACO_STATE_OUT = 0, 52*4882a593Smuzhiyun BACO_STATE_IN, 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct vi_dpm_level { 56*4882a593Smuzhiyun bool enabled; 57*4882a593Smuzhiyun uint32_t value; 58*4882a593Smuzhiyun uint32_t param1; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct vi_dpm_table { 62*4882a593Smuzhiyun uint32_t count; 63*4882a593Smuzhiyun struct vi_dpm_level dpm_level[1]; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define PCIE_PERF_REQ_REMOVE_REGISTRY 0 67*4882a593Smuzhiyun #define PCIE_PERF_REQ_FORCE_LOWPOWER 1 68*4882a593Smuzhiyun #define PCIE_PERF_REQ_GEN1 2 69*4882a593Smuzhiyun #define PCIE_PERF_REQ_GEN2 3 70*4882a593Smuzhiyun #define PCIE_PERF_REQ_GEN3 4 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun enum PHM_BackEnd_Magic { 73*4882a593Smuzhiyun PHM_Dummy_Magic = 0xAA5555AA, 74*4882a593Smuzhiyun PHM_RV770_Magic = 0xDCBAABCD, 75*4882a593Smuzhiyun PHM_Kong_Magic = 0x239478DF, 76*4882a593Smuzhiyun PHM_NIslands_Magic = 0x736C494E, 77*4882a593Smuzhiyun PHM_Sumo_Magic = 0x8339FA11, 78*4882a593Smuzhiyun PHM_SIslands_Magic = 0x369431AC, 79*4882a593Smuzhiyun PHM_Trinity_Magic = 0x96751873, 80*4882a593Smuzhiyun PHM_CIslands_Magic = 0x38AC78B0, 81*4882a593Smuzhiyun PHM_Kv_Magic = 0xDCBBABC0, 82*4882a593Smuzhiyun PHM_VIslands_Magic = 0x20130307, 83*4882a593Smuzhiyun PHM_Cz_Magic = 0x67DCBA25, 84*4882a593Smuzhiyun PHM_Rv_Magic = 0x20161121 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct phm_set_power_state_input { 88*4882a593Smuzhiyun const struct pp_hw_power_state *pcurrent_state; 89*4882a593Smuzhiyun const struct pp_hw_power_state *pnew_state; 90*4882a593Smuzhiyun }; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct phm_clock_array { 93*4882a593Smuzhiyun uint32_t count; 94*4882a593Smuzhiyun uint32_t values[1]; 95*4882a593Smuzhiyun }; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun struct phm_clock_voltage_dependency_record { 98*4882a593Smuzhiyun uint32_t clk; 99*4882a593Smuzhiyun uint32_t v; 100*4882a593Smuzhiyun }; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct phm_vceclock_voltage_dependency_record { 103*4882a593Smuzhiyun uint32_t ecclk; 104*4882a593Smuzhiyun uint32_t evclk; 105*4882a593Smuzhiyun uint32_t v; 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct phm_uvdclock_voltage_dependency_record { 109*4882a593Smuzhiyun uint32_t vclk; 110*4882a593Smuzhiyun uint32_t dclk; 111*4882a593Smuzhiyun uint32_t v; 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun struct phm_samuclock_voltage_dependency_record { 115*4882a593Smuzhiyun uint32_t samclk; 116*4882a593Smuzhiyun uint32_t v; 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun struct phm_acpclock_voltage_dependency_record { 120*4882a593Smuzhiyun uint32_t acpclk; 121*4882a593Smuzhiyun uint32_t v; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table { 125*4882a593Smuzhiyun uint32_t count; /* Number of entries. */ 126*4882a593Smuzhiyun struct phm_clock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 127*4882a593Smuzhiyun }; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun struct phm_phase_shedding_limits_record { 130*4882a593Smuzhiyun uint32_t Voltage; 131*4882a593Smuzhiyun uint32_t Sclk; 132*4882a593Smuzhiyun uint32_t Mclk; 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun struct phm_uvd_clock_voltage_dependency_record { 136*4882a593Smuzhiyun uint32_t vclk; 137*4882a593Smuzhiyun uint32_t dclk; 138*4882a593Smuzhiyun uint32_t v; 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun struct phm_uvd_clock_voltage_dependency_table { 142*4882a593Smuzhiyun uint8_t count; 143*4882a593Smuzhiyun struct phm_uvd_clock_voltage_dependency_record entries[1]; 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun struct phm_acp_clock_voltage_dependency_record { 147*4882a593Smuzhiyun uint32_t acpclk; 148*4882a593Smuzhiyun uint32_t v; 149*4882a593Smuzhiyun }; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun struct phm_acp_clock_voltage_dependency_table { 152*4882a593Smuzhiyun uint32_t count; 153*4882a593Smuzhiyun struct phm_acp_clock_voltage_dependency_record entries[1]; 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun struct phm_vce_clock_voltage_dependency_record { 157*4882a593Smuzhiyun uint32_t ecclk; 158*4882a593Smuzhiyun uint32_t evclk; 159*4882a593Smuzhiyun uint32_t v; 160*4882a593Smuzhiyun }; 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun struct phm_phase_shedding_limits_table { 163*4882a593Smuzhiyun uint32_t count; 164*4882a593Smuzhiyun struct phm_phase_shedding_limits_record entries[1]; 165*4882a593Smuzhiyun }; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun struct phm_vceclock_voltage_dependency_table { 168*4882a593Smuzhiyun uint8_t count; /* Number of entries. */ 169*4882a593Smuzhiyun struct phm_vceclock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 170*4882a593Smuzhiyun }; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun struct phm_uvdclock_voltage_dependency_table { 173*4882a593Smuzhiyun uint8_t count; /* Number of entries. */ 174*4882a593Smuzhiyun struct phm_uvdclock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun struct phm_samuclock_voltage_dependency_table { 178*4882a593Smuzhiyun uint8_t count; /* Number of entries. */ 179*4882a593Smuzhiyun struct phm_samuclock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 180*4882a593Smuzhiyun }; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun struct phm_acpclock_voltage_dependency_table { 183*4882a593Smuzhiyun uint32_t count; /* Number of entries. */ 184*4882a593Smuzhiyun struct phm_acpclock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 185*4882a593Smuzhiyun }; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun struct phm_vce_clock_voltage_dependency_table { 188*4882a593Smuzhiyun uint8_t count; 189*4882a593Smuzhiyun struct phm_vce_clock_voltage_dependency_record entries[1]; 190*4882a593Smuzhiyun }; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun enum SMU_ASIC_RESET_MODE 194*4882a593Smuzhiyun { 195*4882a593Smuzhiyun SMU_ASIC_RESET_MODE_0, 196*4882a593Smuzhiyun SMU_ASIC_RESET_MODE_1, 197*4882a593Smuzhiyun SMU_ASIC_RESET_MODE_2, 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun struct pp_smumgr_func { 201*4882a593Smuzhiyun char *name; 202*4882a593Smuzhiyun int (*smu_init)(struct pp_hwmgr *hwmgr); 203*4882a593Smuzhiyun int (*smu_fini)(struct pp_hwmgr *hwmgr); 204*4882a593Smuzhiyun int (*start_smu)(struct pp_hwmgr *hwmgr); 205*4882a593Smuzhiyun int (*check_fw_load_finish)(struct pp_hwmgr *hwmgr, 206*4882a593Smuzhiyun uint32_t firmware); 207*4882a593Smuzhiyun int (*request_smu_load_fw)(struct pp_hwmgr *hwmgr); 208*4882a593Smuzhiyun int (*request_smu_load_specific_fw)(struct pp_hwmgr *hwmgr, 209*4882a593Smuzhiyun uint32_t firmware); 210*4882a593Smuzhiyun uint32_t (*get_argument)(struct pp_hwmgr *hwmgr); 211*4882a593Smuzhiyun int (*send_msg_to_smc)(struct pp_hwmgr *hwmgr, uint16_t msg); 212*4882a593Smuzhiyun int (*send_msg_to_smc_with_parameter)(struct pp_hwmgr *hwmgr, 213*4882a593Smuzhiyun uint16_t msg, uint32_t parameter); 214*4882a593Smuzhiyun int (*download_pptable_settings)(struct pp_hwmgr *hwmgr, 215*4882a593Smuzhiyun void **table); 216*4882a593Smuzhiyun int (*upload_pptable_settings)(struct pp_hwmgr *hwmgr); 217*4882a593Smuzhiyun int (*update_smc_table)(struct pp_hwmgr *hwmgr, uint32_t type); 218*4882a593Smuzhiyun int (*process_firmware_header)(struct pp_hwmgr *hwmgr); 219*4882a593Smuzhiyun int (*update_sclk_threshold)(struct pp_hwmgr *hwmgr); 220*4882a593Smuzhiyun int (*thermal_setup_fan_table)(struct pp_hwmgr *hwmgr); 221*4882a593Smuzhiyun int (*thermal_avfs_enable)(struct pp_hwmgr *hwmgr); 222*4882a593Smuzhiyun int (*init_smc_table)(struct pp_hwmgr *hwmgr); 223*4882a593Smuzhiyun int (*populate_all_graphic_levels)(struct pp_hwmgr *hwmgr); 224*4882a593Smuzhiyun int (*populate_all_memory_levels)(struct pp_hwmgr *hwmgr); 225*4882a593Smuzhiyun int (*initialize_mc_reg_table)(struct pp_hwmgr *hwmgr); 226*4882a593Smuzhiyun uint32_t (*get_offsetof)(uint32_t type, uint32_t member); 227*4882a593Smuzhiyun uint32_t (*get_mac_definition)(uint32_t value); 228*4882a593Smuzhiyun bool (*is_dpm_running)(struct pp_hwmgr *hwmgr); 229*4882a593Smuzhiyun bool (*is_hw_avfs_present)(struct pp_hwmgr *hwmgr); 230*4882a593Smuzhiyun int (*update_dpm_settings)(struct pp_hwmgr *hwmgr, void *profile_setting); 231*4882a593Smuzhiyun int (*smc_table_manager)(struct pp_hwmgr *hwmgr, uint8_t *table, uint16_t table_id, bool rw); /*rw: true for read, false for write */ 232*4882a593Smuzhiyun int (*stop_smc)(struct pp_hwmgr *hwmgr); 233*4882a593Smuzhiyun }; 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun struct pp_hwmgr_func { 236*4882a593Smuzhiyun int (*backend_init)(struct pp_hwmgr *hw_mgr); 237*4882a593Smuzhiyun int (*backend_fini)(struct pp_hwmgr *hw_mgr); 238*4882a593Smuzhiyun int (*asic_setup)(struct pp_hwmgr *hw_mgr); 239*4882a593Smuzhiyun int (*get_power_state_size)(struct pp_hwmgr *hw_mgr); 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun int (*apply_state_adjust_rules)(struct pp_hwmgr *hwmgr, 242*4882a593Smuzhiyun struct pp_power_state *prequest_ps, 243*4882a593Smuzhiyun const struct pp_power_state *pcurrent_ps); 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun int (*apply_clocks_adjust_rules)(struct pp_hwmgr *hwmgr); 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun int (*force_dpm_level)(struct pp_hwmgr *hw_mgr, 248*4882a593Smuzhiyun enum amd_dpm_forced_level level); 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun int (*dynamic_state_management_enable)( 251*4882a593Smuzhiyun struct pp_hwmgr *hw_mgr); 252*4882a593Smuzhiyun int (*dynamic_state_management_disable)( 253*4882a593Smuzhiyun struct pp_hwmgr *hw_mgr); 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun int (*patch_boot_state)(struct pp_hwmgr *hwmgr, 256*4882a593Smuzhiyun struct pp_hw_power_state *hw_ps); 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun int (*get_pp_table_entry)(struct pp_hwmgr *hwmgr, 259*4882a593Smuzhiyun unsigned long, struct pp_power_state *); 260*4882a593Smuzhiyun int (*get_num_of_pp_table_entries)(struct pp_hwmgr *hwmgr); 261*4882a593Smuzhiyun int (*powerdown_uvd)(struct pp_hwmgr *hwmgr); 262*4882a593Smuzhiyun void (*powergate_vce)(struct pp_hwmgr *hwmgr, bool bgate); 263*4882a593Smuzhiyun void (*powergate_uvd)(struct pp_hwmgr *hwmgr, bool bgate); 264*4882a593Smuzhiyun void (*powergate_acp)(struct pp_hwmgr *hwmgr, bool bgate); 265*4882a593Smuzhiyun uint32_t (*get_mclk)(struct pp_hwmgr *hwmgr, bool low); 266*4882a593Smuzhiyun uint32_t (*get_sclk)(struct pp_hwmgr *hwmgr, bool low); 267*4882a593Smuzhiyun int (*power_state_set)(struct pp_hwmgr *hwmgr, 268*4882a593Smuzhiyun const void *state); 269*4882a593Smuzhiyun int (*notify_smc_display_config_after_ps_adjustment)(struct pp_hwmgr *hwmgr); 270*4882a593Smuzhiyun int (*pre_display_config_changed)(struct pp_hwmgr *hwmgr); 271*4882a593Smuzhiyun int (*display_config_changed)(struct pp_hwmgr *hwmgr); 272*4882a593Smuzhiyun int (*disable_clock_power_gating)(struct pp_hwmgr *hwmgr); 273*4882a593Smuzhiyun int (*update_clock_gatings)(struct pp_hwmgr *hwmgr, 274*4882a593Smuzhiyun const uint32_t *msg_id); 275*4882a593Smuzhiyun int (*set_max_fan_rpm_output)(struct pp_hwmgr *hwmgr, uint16_t us_max_fan_pwm); 276*4882a593Smuzhiyun int (*set_max_fan_pwm_output)(struct pp_hwmgr *hwmgr, uint16_t us_max_fan_pwm); 277*4882a593Smuzhiyun int (*stop_thermal_controller)(struct pp_hwmgr *hwmgr); 278*4882a593Smuzhiyun int (*get_fan_speed_info)(struct pp_hwmgr *hwmgr, struct phm_fan_speed_info *fan_speed_info); 279*4882a593Smuzhiyun void (*set_fan_control_mode)(struct pp_hwmgr *hwmgr, uint32_t mode); 280*4882a593Smuzhiyun uint32_t (*get_fan_control_mode)(struct pp_hwmgr *hwmgr); 281*4882a593Smuzhiyun int (*set_fan_speed_percent)(struct pp_hwmgr *hwmgr, uint32_t percent); 282*4882a593Smuzhiyun int (*get_fan_speed_percent)(struct pp_hwmgr *hwmgr, uint32_t *speed); 283*4882a593Smuzhiyun int (*set_fan_speed_rpm)(struct pp_hwmgr *hwmgr, uint32_t percent); 284*4882a593Smuzhiyun int (*get_fan_speed_rpm)(struct pp_hwmgr *hwmgr, uint32_t *speed); 285*4882a593Smuzhiyun int (*reset_fan_speed_to_default)(struct pp_hwmgr *hwmgr); 286*4882a593Smuzhiyun int (*uninitialize_thermal_controller)(struct pp_hwmgr *hwmgr); 287*4882a593Smuzhiyun int (*register_irq_handlers)(struct pp_hwmgr *hwmgr); 288*4882a593Smuzhiyun bool (*check_smc_update_required_for_display_configuration)(struct pp_hwmgr *hwmgr); 289*4882a593Smuzhiyun int (*check_states_equal)(struct pp_hwmgr *hwmgr, 290*4882a593Smuzhiyun const struct pp_hw_power_state *pstate1, 291*4882a593Smuzhiyun const struct pp_hw_power_state *pstate2, 292*4882a593Smuzhiyun bool *equal); 293*4882a593Smuzhiyun int (*set_cpu_power_state)(struct pp_hwmgr *hwmgr); 294*4882a593Smuzhiyun int (*store_cc6_data)(struct pp_hwmgr *hwmgr, uint32_t separation_time, 295*4882a593Smuzhiyun bool cc6_disable, bool pstate_disable, 296*4882a593Smuzhiyun bool pstate_switch_disable); 297*4882a593Smuzhiyun int (*get_dal_power_level)(struct pp_hwmgr *hwmgr, 298*4882a593Smuzhiyun struct amd_pp_simple_clock_info *info); 299*4882a593Smuzhiyun int (*get_performance_level)(struct pp_hwmgr *, const struct pp_hw_power_state *, 300*4882a593Smuzhiyun PHM_PerformanceLevelDesignation, uint32_t, PHM_PerformanceLevel *); 301*4882a593Smuzhiyun int (*get_current_shallow_sleep_clocks)(struct pp_hwmgr *hwmgr, 302*4882a593Smuzhiyun const struct pp_hw_power_state *state, struct pp_clock_info *clock_info); 303*4882a593Smuzhiyun int (*get_clock_by_type)(struct pp_hwmgr *hwmgr, enum amd_pp_clock_type type, struct amd_pp_clocks *clocks); 304*4882a593Smuzhiyun int (*get_clock_by_type_with_latency)(struct pp_hwmgr *hwmgr, 305*4882a593Smuzhiyun enum amd_pp_clock_type type, 306*4882a593Smuzhiyun struct pp_clock_levels_with_latency *clocks); 307*4882a593Smuzhiyun int (*get_clock_by_type_with_voltage)(struct pp_hwmgr *hwmgr, 308*4882a593Smuzhiyun enum amd_pp_clock_type type, 309*4882a593Smuzhiyun struct pp_clock_levels_with_voltage *clocks); 310*4882a593Smuzhiyun int (*set_watermarks_for_clocks_ranges)(struct pp_hwmgr *hwmgr, void *clock_ranges); 311*4882a593Smuzhiyun int (*display_clock_voltage_request)(struct pp_hwmgr *hwmgr, 312*4882a593Smuzhiyun struct pp_display_clock_request *clock); 313*4882a593Smuzhiyun int (*get_max_high_clocks)(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks); 314*4882a593Smuzhiyun int (*power_off_asic)(struct pp_hwmgr *hwmgr); 315*4882a593Smuzhiyun int (*force_clock_level)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, uint32_t mask); 316*4882a593Smuzhiyun int (*print_clock_levels)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, char *buf); 317*4882a593Smuzhiyun int (*powergate_gfx)(struct pp_hwmgr *hwmgr, bool enable); 318*4882a593Smuzhiyun int (*get_sclk_od)(struct pp_hwmgr *hwmgr); 319*4882a593Smuzhiyun int (*set_sclk_od)(struct pp_hwmgr *hwmgr, uint32_t value); 320*4882a593Smuzhiyun int (*get_mclk_od)(struct pp_hwmgr *hwmgr); 321*4882a593Smuzhiyun int (*set_mclk_od)(struct pp_hwmgr *hwmgr, uint32_t value); 322*4882a593Smuzhiyun int (*read_sensor)(struct pp_hwmgr *hwmgr, int idx, void *value, int *size); 323*4882a593Smuzhiyun int (*avfs_control)(struct pp_hwmgr *hwmgr, bool enable); 324*4882a593Smuzhiyun int (*disable_smc_firmware_ctf)(struct pp_hwmgr *hwmgr); 325*4882a593Smuzhiyun int (*set_active_display_count)(struct pp_hwmgr *hwmgr, uint32_t count); 326*4882a593Smuzhiyun int (*set_min_deep_sleep_dcefclk)(struct pp_hwmgr *hwmgr, uint32_t clock); 327*4882a593Smuzhiyun int (*start_thermal_controller)(struct pp_hwmgr *hwmgr, struct PP_TemperatureRange *range); 328*4882a593Smuzhiyun int (*notify_cac_buffer_info)(struct pp_hwmgr *hwmgr, 329*4882a593Smuzhiyun uint32_t virtual_addr_low, 330*4882a593Smuzhiyun uint32_t virtual_addr_hi, 331*4882a593Smuzhiyun uint32_t mc_addr_low, 332*4882a593Smuzhiyun uint32_t mc_addr_hi, 333*4882a593Smuzhiyun uint32_t size); 334*4882a593Smuzhiyun int (*update_nbdpm_pstate)(struct pp_hwmgr *hwmgr, 335*4882a593Smuzhiyun bool enable, 336*4882a593Smuzhiyun bool lock); 337*4882a593Smuzhiyun int (*get_thermal_temperature_range)(struct pp_hwmgr *hwmgr, 338*4882a593Smuzhiyun struct PP_TemperatureRange *range); 339*4882a593Smuzhiyun int (*get_power_profile_mode)(struct pp_hwmgr *hwmgr, char *buf); 340*4882a593Smuzhiyun int (*set_power_profile_mode)(struct pp_hwmgr *hwmgr, long *input, uint32_t size); 341*4882a593Smuzhiyun int (*odn_edit_dpm_table)(struct pp_hwmgr *hwmgr, 342*4882a593Smuzhiyun enum PP_OD_DPM_TABLE_COMMAND type, 343*4882a593Smuzhiyun long *input, uint32_t size); 344*4882a593Smuzhiyun int (*set_fine_grain_clk_vol)(struct pp_hwmgr *hwmgr, 345*4882a593Smuzhiyun enum PP_OD_DPM_TABLE_COMMAND type, 346*4882a593Smuzhiyun long *input, uint32_t size); 347*4882a593Smuzhiyun int (*set_power_limit)(struct pp_hwmgr *hwmgr, uint32_t n); 348*4882a593Smuzhiyun int (*powergate_mmhub)(struct pp_hwmgr *hwmgr); 349*4882a593Smuzhiyun int (*smus_notify_pwe)(struct pp_hwmgr *hwmgr); 350*4882a593Smuzhiyun int (*powergate_sdma)(struct pp_hwmgr *hwmgr, bool bgate); 351*4882a593Smuzhiyun int (*enable_mgpu_fan_boost)(struct pp_hwmgr *hwmgr); 352*4882a593Smuzhiyun int (*set_hard_min_dcefclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock); 353*4882a593Smuzhiyun int (*set_hard_min_fclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock); 354*4882a593Smuzhiyun int (*set_hard_min_gfxclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock); 355*4882a593Smuzhiyun int (*set_soft_max_gfxclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock); 356*4882a593Smuzhiyun int (*get_asic_baco_capability)(struct pp_hwmgr *hwmgr, bool *cap); 357*4882a593Smuzhiyun int (*get_asic_baco_state)(struct pp_hwmgr *hwmgr, enum BACO_STATE *state); 358*4882a593Smuzhiyun int (*set_asic_baco_state)(struct pp_hwmgr *hwmgr, enum BACO_STATE state); 359*4882a593Smuzhiyun int (*get_ppfeature_status)(struct pp_hwmgr *hwmgr, char *buf); 360*4882a593Smuzhiyun int (*set_ppfeature_status)(struct pp_hwmgr *hwmgr, uint64_t ppfeature_masks); 361*4882a593Smuzhiyun int (*set_mp1_state)(struct pp_hwmgr *hwmgr, enum pp_mp1_state mp1_state); 362*4882a593Smuzhiyun int (*asic_reset)(struct pp_hwmgr *hwmgr, enum SMU_ASIC_RESET_MODE mode); 363*4882a593Smuzhiyun int (*smu_i2c_bus_access)(struct pp_hwmgr *hwmgr, bool aquire); 364*4882a593Smuzhiyun int (*set_df_cstate)(struct pp_hwmgr *hwmgr, enum pp_df_cstate state); 365*4882a593Smuzhiyun int (*set_xgmi_pstate)(struct pp_hwmgr *hwmgr, uint32_t pstate); 366*4882a593Smuzhiyun int (*disable_power_features_for_compute_performance)(struct pp_hwmgr *hwmgr, 367*4882a593Smuzhiyun bool disable); 368*4882a593Smuzhiyun ssize_t (*get_gpu_metrics)(struct pp_hwmgr *hwmgr, void **table); 369*4882a593Smuzhiyun }; 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun struct pp_table_func { 372*4882a593Smuzhiyun int (*pptable_init)(struct pp_hwmgr *hw_mgr); 373*4882a593Smuzhiyun int (*pptable_fini)(struct pp_hwmgr *hw_mgr); 374*4882a593Smuzhiyun int (*pptable_get_number_of_vce_state_table_entries)(struct pp_hwmgr *hw_mgr); 375*4882a593Smuzhiyun int (*pptable_get_vce_state_table_entry)( 376*4882a593Smuzhiyun struct pp_hwmgr *hwmgr, 377*4882a593Smuzhiyun unsigned long i, 378*4882a593Smuzhiyun struct amd_vce_state *vce_state, 379*4882a593Smuzhiyun void **clock_info, 380*4882a593Smuzhiyun unsigned long *flag); 381*4882a593Smuzhiyun }; 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun union phm_cac_leakage_record { 384*4882a593Smuzhiyun struct { 385*4882a593Smuzhiyun uint16_t Vddc; /* in CI, we use it for StdVoltageHiSidd */ 386*4882a593Smuzhiyun uint32_t Leakage; /* in CI, we use it for StdVoltageLoSidd */ 387*4882a593Smuzhiyun }; 388*4882a593Smuzhiyun struct { 389*4882a593Smuzhiyun uint16_t Vddc1; 390*4882a593Smuzhiyun uint16_t Vddc2; 391*4882a593Smuzhiyun uint16_t Vddc3; 392*4882a593Smuzhiyun }; 393*4882a593Smuzhiyun }; 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun struct phm_cac_leakage_table { 396*4882a593Smuzhiyun uint32_t count; 397*4882a593Smuzhiyun union phm_cac_leakage_record entries[1]; 398*4882a593Smuzhiyun }; 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun struct phm_samu_clock_voltage_dependency_record { 401*4882a593Smuzhiyun uint32_t samclk; 402*4882a593Smuzhiyun uint32_t v; 403*4882a593Smuzhiyun }; 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun struct phm_samu_clock_voltage_dependency_table { 407*4882a593Smuzhiyun uint8_t count; 408*4882a593Smuzhiyun struct phm_samu_clock_voltage_dependency_record entries[1]; 409*4882a593Smuzhiyun }; 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun struct phm_cac_tdp_table { 412*4882a593Smuzhiyun uint16_t usTDP; 413*4882a593Smuzhiyun uint16_t usConfigurableTDP; 414*4882a593Smuzhiyun uint16_t usTDC; 415*4882a593Smuzhiyun uint16_t usBatteryPowerLimit; 416*4882a593Smuzhiyun uint16_t usSmallPowerLimit; 417*4882a593Smuzhiyun uint16_t usLowCACLeakage; 418*4882a593Smuzhiyun uint16_t usHighCACLeakage; 419*4882a593Smuzhiyun uint16_t usMaximumPowerDeliveryLimit; 420*4882a593Smuzhiyun uint16_t usEDCLimit; 421*4882a593Smuzhiyun uint16_t usOperatingTempMinLimit; 422*4882a593Smuzhiyun uint16_t usOperatingTempMaxLimit; 423*4882a593Smuzhiyun uint16_t usOperatingTempStep; 424*4882a593Smuzhiyun uint16_t usOperatingTempHyst; 425*4882a593Smuzhiyun uint16_t usDefaultTargetOperatingTemp; 426*4882a593Smuzhiyun uint16_t usTargetOperatingTemp; 427*4882a593Smuzhiyun uint16_t usPowerTuneDataSetID; 428*4882a593Smuzhiyun uint16_t usSoftwareShutdownTemp; 429*4882a593Smuzhiyun uint16_t usClockStretchAmount; 430*4882a593Smuzhiyun uint16_t usTemperatureLimitHotspot; 431*4882a593Smuzhiyun uint16_t usTemperatureLimitLiquid1; 432*4882a593Smuzhiyun uint16_t usTemperatureLimitLiquid2; 433*4882a593Smuzhiyun uint16_t usTemperatureLimitVrVddc; 434*4882a593Smuzhiyun uint16_t usTemperatureLimitVrMvdd; 435*4882a593Smuzhiyun uint16_t usTemperatureLimitPlx; 436*4882a593Smuzhiyun uint8_t ucLiquid1_I2C_address; 437*4882a593Smuzhiyun uint8_t ucLiquid2_I2C_address; 438*4882a593Smuzhiyun uint8_t ucLiquid_I2C_Line; 439*4882a593Smuzhiyun uint8_t ucVr_I2C_address; 440*4882a593Smuzhiyun uint8_t ucVr_I2C_Line; 441*4882a593Smuzhiyun uint8_t ucPlx_I2C_address; 442*4882a593Smuzhiyun uint8_t ucPlx_I2C_Line; 443*4882a593Smuzhiyun uint32_t usBoostPowerLimit; 444*4882a593Smuzhiyun uint8_t ucCKS_LDO_REFSEL; 445*4882a593Smuzhiyun }; 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun struct phm_tdp_table { 448*4882a593Smuzhiyun uint16_t usTDP; 449*4882a593Smuzhiyun uint16_t usConfigurableTDP; 450*4882a593Smuzhiyun uint16_t usTDC; 451*4882a593Smuzhiyun uint16_t usBatteryPowerLimit; 452*4882a593Smuzhiyun uint16_t usSmallPowerLimit; 453*4882a593Smuzhiyun uint16_t usLowCACLeakage; 454*4882a593Smuzhiyun uint16_t usHighCACLeakage; 455*4882a593Smuzhiyun uint16_t usMaximumPowerDeliveryLimit; 456*4882a593Smuzhiyun uint16_t usEDCLimit; 457*4882a593Smuzhiyun uint16_t usOperatingTempMinLimit; 458*4882a593Smuzhiyun uint16_t usOperatingTempMaxLimit; 459*4882a593Smuzhiyun uint16_t usOperatingTempStep; 460*4882a593Smuzhiyun uint16_t usOperatingTempHyst; 461*4882a593Smuzhiyun uint16_t usDefaultTargetOperatingTemp; 462*4882a593Smuzhiyun uint16_t usTargetOperatingTemp; 463*4882a593Smuzhiyun uint16_t usPowerTuneDataSetID; 464*4882a593Smuzhiyun uint16_t usSoftwareShutdownTemp; 465*4882a593Smuzhiyun uint16_t usClockStretchAmount; 466*4882a593Smuzhiyun uint16_t usTemperatureLimitTedge; 467*4882a593Smuzhiyun uint16_t usTemperatureLimitHotspot; 468*4882a593Smuzhiyun uint16_t usTemperatureLimitLiquid1; 469*4882a593Smuzhiyun uint16_t usTemperatureLimitLiquid2; 470*4882a593Smuzhiyun uint16_t usTemperatureLimitHBM; 471*4882a593Smuzhiyun uint16_t usTemperatureLimitVrVddc; 472*4882a593Smuzhiyun uint16_t usTemperatureLimitVrMvdd; 473*4882a593Smuzhiyun uint16_t usTemperatureLimitPlx; 474*4882a593Smuzhiyun uint8_t ucLiquid1_I2C_address; 475*4882a593Smuzhiyun uint8_t ucLiquid2_I2C_address; 476*4882a593Smuzhiyun uint8_t ucLiquid_I2C_Line; 477*4882a593Smuzhiyun uint8_t ucVr_I2C_address; 478*4882a593Smuzhiyun uint8_t ucVr_I2C_Line; 479*4882a593Smuzhiyun uint8_t ucPlx_I2C_address; 480*4882a593Smuzhiyun uint8_t ucPlx_I2C_Line; 481*4882a593Smuzhiyun uint8_t ucLiquid_I2C_LineSDA; 482*4882a593Smuzhiyun uint8_t ucVr_I2C_LineSDA; 483*4882a593Smuzhiyun uint8_t ucPlx_I2C_LineSDA; 484*4882a593Smuzhiyun uint32_t usBoostPowerLimit; 485*4882a593Smuzhiyun uint16_t usBoostStartTemperature; 486*4882a593Smuzhiyun uint16_t usBoostStopTemperature; 487*4882a593Smuzhiyun uint32_t ulBoostClock; 488*4882a593Smuzhiyun }; 489*4882a593Smuzhiyun 490*4882a593Smuzhiyun struct phm_ppm_table { 491*4882a593Smuzhiyun uint8_t ppm_design; 492*4882a593Smuzhiyun uint16_t cpu_core_number; 493*4882a593Smuzhiyun uint32_t platform_tdp; 494*4882a593Smuzhiyun uint32_t small_ac_platform_tdp; 495*4882a593Smuzhiyun uint32_t platform_tdc; 496*4882a593Smuzhiyun uint32_t small_ac_platform_tdc; 497*4882a593Smuzhiyun uint32_t apu_tdp; 498*4882a593Smuzhiyun uint32_t dgpu_tdp; 499*4882a593Smuzhiyun uint32_t dgpu_ulv_power; 500*4882a593Smuzhiyun uint32_t tj_max; 501*4882a593Smuzhiyun }; 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun struct phm_vq_budgeting_record { 504*4882a593Smuzhiyun uint32_t ulCUs; 505*4882a593Smuzhiyun uint32_t ulSustainableSOCPowerLimitLow; 506*4882a593Smuzhiyun uint32_t ulSustainableSOCPowerLimitHigh; 507*4882a593Smuzhiyun uint32_t ulMinSclkLow; 508*4882a593Smuzhiyun uint32_t ulMinSclkHigh; 509*4882a593Smuzhiyun uint8_t ucDispConfig; 510*4882a593Smuzhiyun uint32_t ulDClk; 511*4882a593Smuzhiyun uint32_t ulEClk; 512*4882a593Smuzhiyun uint32_t ulSustainableSclk; 513*4882a593Smuzhiyun uint32_t ulSustainableCUs; 514*4882a593Smuzhiyun }; 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun struct phm_vq_budgeting_table { 517*4882a593Smuzhiyun uint8_t numEntries; 518*4882a593Smuzhiyun struct phm_vq_budgeting_record entries[1]; 519*4882a593Smuzhiyun }; 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun struct phm_clock_and_voltage_limits { 522*4882a593Smuzhiyun uint32_t sclk; 523*4882a593Smuzhiyun uint32_t mclk; 524*4882a593Smuzhiyun uint32_t gfxclk; 525*4882a593Smuzhiyun uint16_t vddc; 526*4882a593Smuzhiyun uint16_t vddci; 527*4882a593Smuzhiyun uint16_t vddgfx; 528*4882a593Smuzhiyun uint16_t vddmem; 529*4882a593Smuzhiyun }; 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun /* Structure to hold PPTable information */ 532*4882a593Smuzhiyun 533*4882a593Smuzhiyun struct phm_ppt_v1_information { 534*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_sclk; 535*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_mclk; 536*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_socclk; 537*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_dcefclk; 538*4882a593Smuzhiyun struct phm_clock_array *valid_sclk_values; 539*4882a593Smuzhiyun struct phm_clock_array *valid_mclk_values; 540*4882a593Smuzhiyun struct phm_clock_array *valid_socclk_values; 541*4882a593Smuzhiyun struct phm_clock_array *valid_dcefclk_values; 542*4882a593Smuzhiyun struct phm_clock_and_voltage_limits max_clock_voltage_on_dc; 543*4882a593Smuzhiyun struct phm_clock_and_voltage_limits max_clock_voltage_on_ac; 544*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table *vddc_dep_on_dal_pwrl; 545*4882a593Smuzhiyun struct phm_ppm_table *ppm_parameter_table; 546*4882a593Smuzhiyun struct phm_cac_tdp_table *cac_dtp_table; 547*4882a593Smuzhiyun struct phm_tdp_table *tdp_table; 548*4882a593Smuzhiyun struct phm_ppt_v1_mm_clock_voltage_dependency_table *mm_dep_table; 549*4882a593Smuzhiyun struct phm_ppt_v1_voltage_lookup_table *vddc_lookup_table; 550*4882a593Smuzhiyun struct phm_ppt_v1_voltage_lookup_table *vddgfx_lookup_table; 551*4882a593Smuzhiyun struct phm_ppt_v1_voltage_lookup_table *vddmem_lookup_table; 552*4882a593Smuzhiyun struct phm_ppt_v1_pcie_table *pcie_table; 553*4882a593Smuzhiyun struct phm_ppt_v1_gpio_table *gpio_table; 554*4882a593Smuzhiyun uint16_t us_ulv_voltage_offset; 555*4882a593Smuzhiyun uint16_t us_ulv_smnclk_did; 556*4882a593Smuzhiyun uint16_t us_ulv_mp1clk_did; 557*4882a593Smuzhiyun uint16_t us_ulv_gfxclk_bypass; 558*4882a593Smuzhiyun uint16_t us_gfxclk_slew_rate; 559*4882a593Smuzhiyun uint16_t us_min_gfxclk_freq_limit; 560*4882a593Smuzhiyun }; 561*4882a593Smuzhiyun 562*4882a593Smuzhiyun struct phm_ppt_v2_information { 563*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_sclk; 564*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_mclk; 565*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_socclk; 566*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_dcefclk; 567*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_pixclk; 568*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_dispclk; 569*4882a593Smuzhiyun struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_phyclk; 570*4882a593Smuzhiyun struct phm_ppt_v1_mm_clock_voltage_dependency_table *mm_dep_table; 571*4882a593Smuzhiyun 572*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table *vddc_dep_on_dalpwrl; 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun struct phm_clock_array *valid_sclk_values; 575*4882a593Smuzhiyun struct phm_clock_array *valid_mclk_values; 576*4882a593Smuzhiyun struct phm_clock_array *valid_socclk_values; 577*4882a593Smuzhiyun struct phm_clock_array *valid_dcefclk_values; 578*4882a593Smuzhiyun 579*4882a593Smuzhiyun struct phm_clock_and_voltage_limits max_clock_voltage_on_dc; 580*4882a593Smuzhiyun struct phm_clock_and_voltage_limits max_clock_voltage_on_ac; 581*4882a593Smuzhiyun 582*4882a593Smuzhiyun struct phm_ppm_table *ppm_parameter_table; 583*4882a593Smuzhiyun struct phm_cac_tdp_table *cac_dtp_table; 584*4882a593Smuzhiyun struct phm_tdp_table *tdp_table; 585*4882a593Smuzhiyun 586*4882a593Smuzhiyun struct phm_ppt_v1_voltage_lookup_table *vddc_lookup_table; 587*4882a593Smuzhiyun struct phm_ppt_v1_voltage_lookup_table *vddgfx_lookup_table; 588*4882a593Smuzhiyun struct phm_ppt_v1_voltage_lookup_table *vddmem_lookup_table; 589*4882a593Smuzhiyun struct phm_ppt_v1_voltage_lookup_table *vddci_lookup_table; 590*4882a593Smuzhiyun 591*4882a593Smuzhiyun struct phm_ppt_v1_pcie_table *pcie_table; 592*4882a593Smuzhiyun 593*4882a593Smuzhiyun uint16_t us_ulv_voltage_offset; 594*4882a593Smuzhiyun uint16_t us_ulv_smnclk_did; 595*4882a593Smuzhiyun uint16_t us_ulv_mp1clk_did; 596*4882a593Smuzhiyun uint16_t us_ulv_gfxclk_bypass; 597*4882a593Smuzhiyun uint16_t us_gfxclk_slew_rate; 598*4882a593Smuzhiyun uint16_t us_min_gfxclk_freq_limit; 599*4882a593Smuzhiyun 600*4882a593Smuzhiyun uint8_t uc_gfx_dpm_voltage_mode; 601*4882a593Smuzhiyun uint8_t uc_soc_dpm_voltage_mode; 602*4882a593Smuzhiyun uint8_t uc_uclk_dpm_voltage_mode; 603*4882a593Smuzhiyun uint8_t uc_uvd_dpm_voltage_mode; 604*4882a593Smuzhiyun uint8_t uc_vce_dpm_voltage_mode; 605*4882a593Smuzhiyun uint8_t uc_mp0_dpm_voltage_mode; 606*4882a593Smuzhiyun uint8_t uc_dcef_dpm_voltage_mode; 607*4882a593Smuzhiyun }; 608*4882a593Smuzhiyun 609*4882a593Smuzhiyun struct phm_ppt_v3_information 610*4882a593Smuzhiyun { 611*4882a593Smuzhiyun uint8_t uc_thermal_controller_type; 612*4882a593Smuzhiyun 613*4882a593Smuzhiyun uint16_t us_small_power_limit1; 614*4882a593Smuzhiyun uint16_t us_small_power_limit2; 615*4882a593Smuzhiyun uint16_t us_boost_power_limit; 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun uint16_t us_od_turbo_power_limit; 618*4882a593Smuzhiyun uint16_t us_od_powersave_power_limit; 619*4882a593Smuzhiyun uint16_t us_software_shutdown_temp; 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun uint32_t *power_saving_clock_max; 622*4882a593Smuzhiyun uint32_t *power_saving_clock_min; 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun uint8_t *od_feature_capabilities; 625*4882a593Smuzhiyun uint32_t *od_settings_max; 626*4882a593Smuzhiyun uint32_t *od_settings_min; 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun void *smc_pptable; 629*4882a593Smuzhiyun }; 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun struct phm_dynamic_state_info { 632*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table *vddc_dependency_on_sclk; 633*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table *vddci_dependency_on_mclk; 634*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table *vddc_dependency_on_mclk; 635*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table *mvdd_dependency_on_mclk; 636*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table *vddc_dep_on_dal_pwrl; 637*4882a593Smuzhiyun struct phm_clock_array *valid_sclk_values; 638*4882a593Smuzhiyun struct phm_clock_array *valid_mclk_values; 639*4882a593Smuzhiyun struct phm_clock_and_voltage_limits max_clock_voltage_on_dc; 640*4882a593Smuzhiyun struct phm_clock_and_voltage_limits max_clock_voltage_on_ac; 641*4882a593Smuzhiyun uint32_t mclk_sclk_ratio; 642*4882a593Smuzhiyun uint32_t sclk_mclk_delta; 643*4882a593Smuzhiyun uint32_t vddc_vddci_delta; 644*4882a593Smuzhiyun uint32_t min_vddc_for_pcie_gen2; 645*4882a593Smuzhiyun struct phm_cac_leakage_table *cac_leakage_table; 646*4882a593Smuzhiyun struct phm_phase_shedding_limits_table *vddc_phase_shed_limits_table; 647*4882a593Smuzhiyun 648*4882a593Smuzhiyun struct phm_vce_clock_voltage_dependency_table 649*4882a593Smuzhiyun *vce_clock_voltage_dependency_table; 650*4882a593Smuzhiyun struct phm_uvd_clock_voltage_dependency_table 651*4882a593Smuzhiyun *uvd_clock_voltage_dependency_table; 652*4882a593Smuzhiyun struct phm_acp_clock_voltage_dependency_table 653*4882a593Smuzhiyun *acp_clock_voltage_dependency_table; 654*4882a593Smuzhiyun struct phm_samu_clock_voltage_dependency_table 655*4882a593Smuzhiyun *samu_clock_voltage_dependency_table; 656*4882a593Smuzhiyun 657*4882a593Smuzhiyun struct phm_ppm_table *ppm_parameter_table; 658*4882a593Smuzhiyun struct phm_cac_tdp_table *cac_dtp_table; 659*4882a593Smuzhiyun struct phm_clock_voltage_dependency_table *vdd_gfx_dependency_on_sclk; 660*4882a593Smuzhiyun }; 661*4882a593Smuzhiyun 662*4882a593Smuzhiyun struct pp_fan_info { 663*4882a593Smuzhiyun bool bNoFan; 664*4882a593Smuzhiyun uint8_t ucTachometerPulsesPerRevolution; 665*4882a593Smuzhiyun uint32_t ulMinRPM; 666*4882a593Smuzhiyun uint32_t ulMaxRPM; 667*4882a593Smuzhiyun }; 668*4882a593Smuzhiyun 669*4882a593Smuzhiyun struct pp_advance_fan_control_parameters { 670*4882a593Smuzhiyun uint16_t usTMin; /* The temperature, in 0.01 centigrades, below which we just run at a minimal PWM. */ 671*4882a593Smuzhiyun uint16_t usTMed; /* The middle temperature where we change slopes. */ 672*4882a593Smuzhiyun uint16_t usTHigh; /* The high temperature for setting the second slope. */ 673*4882a593Smuzhiyun uint16_t usPWMMin; /* The minimum PWM value in percent (0.01% increments). */ 674*4882a593Smuzhiyun uint16_t usPWMMed; /* The PWM value (in percent) at TMed. */ 675*4882a593Smuzhiyun uint16_t usPWMHigh; /* The PWM value at THigh. */ 676*4882a593Smuzhiyun uint8_t ucTHyst; /* Temperature hysteresis. Integer. */ 677*4882a593Smuzhiyun uint32_t ulCycleDelay; /* The time between two invocations of the fan control routine in microseconds. */ 678*4882a593Smuzhiyun uint16_t usTMax; /* The max temperature */ 679*4882a593Smuzhiyun uint8_t ucFanControlMode; 680*4882a593Smuzhiyun uint16_t usFanPWMMinLimit; 681*4882a593Smuzhiyun uint16_t usFanPWMMaxLimit; 682*4882a593Smuzhiyun uint16_t usFanPWMStep; 683*4882a593Smuzhiyun uint16_t usDefaultMaxFanPWM; 684*4882a593Smuzhiyun uint16_t usFanOutputSensitivity; 685*4882a593Smuzhiyun uint16_t usDefaultFanOutputSensitivity; 686*4882a593Smuzhiyun uint16_t usMaxFanPWM; /* The max Fan PWM value for Fuzzy Fan Control feature */ 687*4882a593Smuzhiyun uint16_t usFanRPMMinLimit; /* Minimum limit range in percentage, need to calculate based on minRPM/MaxRpm */ 688*4882a593Smuzhiyun uint16_t usFanRPMMaxLimit; /* Maximum limit range in percentage, usually set to 100% by default */ 689*4882a593Smuzhiyun uint16_t usFanRPMStep; /* Step increments/decerements, in percent */ 690*4882a593Smuzhiyun uint16_t usDefaultMaxFanRPM; /* The max Fan RPM value for Fuzzy Fan Control feature, default from PPTable */ 691*4882a593Smuzhiyun uint16_t usMaxFanRPM; /* The max Fan RPM value for Fuzzy Fan Control feature, user defined */ 692*4882a593Smuzhiyun uint16_t usFanCurrentLow; /* Low current */ 693*4882a593Smuzhiyun uint16_t usFanCurrentHigh; /* High current */ 694*4882a593Smuzhiyun uint16_t usFanRPMLow; /* Low RPM */ 695*4882a593Smuzhiyun uint16_t usFanRPMHigh; /* High RPM */ 696*4882a593Smuzhiyun uint32_t ulMinFanSCLKAcousticLimit; /* Minimum Fan Controller SCLK Frequency Acoustic Limit. */ 697*4882a593Smuzhiyun uint8_t ucTargetTemperature; /* Advanced fan controller target temperature. */ 698*4882a593Smuzhiyun uint8_t ucMinimumPWMLimit; /* The minimum PWM that the advanced fan controller can set. This should be set to the highest PWM that will run the fan at its lowest RPM. */ 699*4882a593Smuzhiyun uint16_t usFanGainEdge; /* The following is added for Fiji */ 700*4882a593Smuzhiyun uint16_t usFanGainHotspot; 701*4882a593Smuzhiyun uint16_t usFanGainLiquid; 702*4882a593Smuzhiyun uint16_t usFanGainVrVddc; 703*4882a593Smuzhiyun uint16_t usFanGainVrMvdd; 704*4882a593Smuzhiyun uint16_t usFanGainPlx; 705*4882a593Smuzhiyun uint16_t usFanGainHbm; 706*4882a593Smuzhiyun uint8_t ucEnableZeroRPM; 707*4882a593Smuzhiyun uint8_t ucFanStopTemperature; 708*4882a593Smuzhiyun uint8_t ucFanStartTemperature; 709*4882a593Smuzhiyun uint32_t ulMaxFanSCLKAcousticLimit; /* Maximum Fan Controller SCLK Frequency Acoustic Limit. */ 710*4882a593Smuzhiyun uint32_t ulTargetGfxClk; 711*4882a593Smuzhiyun uint16_t usZeroRPMStartTemperature; 712*4882a593Smuzhiyun uint16_t usZeroRPMStopTemperature; 713*4882a593Smuzhiyun uint16_t usMGpuThrottlingRPMLimit; 714*4882a593Smuzhiyun }; 715*4882a593Smuzhiyun 716*4882a593Smuzhiyun struct pp_thermal_controller_info { 717*4882a593Smuzhiyun uint8_t ucType; 718*4882a593Smuzhiyun uint8_t ucI2cLine; 719*4882a593Smuzhiyun uint8_t ucI2cAddress; 720*4882a593Smuzhiyun uint8_t use_hw_fan_control; 721*4882a593Smuzhiyun struct pp_fan_info fanInfo; 722*4882a593Smuzhiyun struct pp_advance_fan_control_parameters advanceFanControlParameters; 723*4882a593Smuzhiyun }; 724*4882a593Smuzhiyun 725*4882a593Smuzhiyun struct phm_microcode_version_info { 726*4882a593Smuzhiyun uint32_t SMC; 727*4882a593Smuzhiyun uint32_t DMCU; 728*4882a593Smuzhiyun uint32_t MC; 729*4882a593Smuzhiyun uint32_t NB; 730*4882a593Smuzhiyun }; 731*4882a593Smuzhiyun 732*4882a593Smuzhiyun enum PP_TABLE_VERSION { 733*4882a593Smuzhiyun PP_TABLE_V0 = 0, 734*4882a593Smuzhiyun PP_TABLE_V1, 735*4882a593Smuzhiyun PP_TABLE_V2, 736*4882a593Smuzhiyun PP_TABLE_MAX 737*4882a593Smuzhiyun }; 738*4882a593Smuzhiyun 739*4882a593Smuzhiyun /** 740*4882a593Smuzhiyun * The main hardware manager structure. 741*4882a593Smuzhiyun */ 742*4882a593Smuzhiyun #define Workload_Policy_Max 6 743*4882a593Smuzhiyun 744*4882a593Smuzhiyun struct pp_hwmgr { 745*4882a593Smuzhiyun void *adev; 746*4882a593Smuzhiyun uint32_t chip_family; 747*4882a593Smuzhiyun uint32_t chip_id; 748*4882a593Smuzhiyun uint32_t smu_version; 749*4882a593Smuzhiyun bool not_vf; 750*4882a593Smuzhiyun bool pm_en; 751*4882a593Smuzhiyun bool pp_one_vf; 752*4882a593Smuzhiyun struct mutex smu_lock; 753*4882a593Smuzhiyun struct mutex msg_lock; 754*4882a593Smuzhiyun 755*4882a593Smuzhiyun uint32_t pp_table_version; 756*4882a593Smuzhiyun void *device; 757*4882a593Smuzhiyun struct pp_smumgr *smumgr; 758*4882a593Smuzhiyun const void *soft_pp_table; 759*4882a593Smuzhiyun uint32_t soft_pp_table_size; 760*4882a593Smuzhiyun void *hardcode_pp_table; 761*4882a593Smuzhiyun bool need_pp_table_upload; 762*4882a593Smuzhiyun 763*4882a593Smuzhiyun struct amd_vce_state vce_states[AMD_MAX_VCE_LEVELS]; 764*4882a593Smuzhiyun uint32_t num_vce_state_tables; 765*4882a593Smuzhiyun 766*4882a593Smuzhiyun enum amd_dpm_forced_level dpm_level; 767*4882a593Smuzhiyun enum amd_dpm_forced_level saved_dpm_level; 768*4882a593Smuzhiyun enum amd_dpm_forced_level request_dpm_level; 769*4882a593Smuzhiyun uint32_t usec_timeout; 770*4882a593Smuzhiyun void *pptable; 771*4882a593Smuzhiyun struct phm_platform_descriptor platform_descriptor; 772*4882a593Smuzhiyun void *backend; 773*4882a593Smuzhiyun 774*4882a593Smuzhiyun void *smu_backend; 775*4882a593Smuzhiyun const struct pp_smumgr_func *smumgr_funcs; 776*4882a593Smuzhiyun bool is_kicker; 777*4882a593Smuzhiyun 778*4882a593Smuzhiyun enum PP_DAL_POWERLEVEL dal_power_level; 779*4882a593Smuzhiyun struct phm_dynamic_state_info dyn_state; 780*4882a593Smuzhiyun const struct pp_hwmgr_func *hwmgr_func; 781*4882a593Smuzhiyun const struct pp_table_func *pptable_func; 782*4882a593Smuzhiyun 783*4882a593Smuzhiyun struct pp_power_state *ps; 784*4882a593Smuzhiyun uint32_t num_ps; 785*4882a593Smuzhiyun struct pp_thermal_controller_info thermal_controller; 786*4882a593Smuzhiyun bool fan_ctrl_is_in_default_mode; 787*4882a593Smuzhiyun uint32_t fan_ctrl_default_mode; 788*4882a593Smuzhiyun bool fan_ctrl_enabled; 789*4882a593Smuzhiyun uint32_t tmin; 790*4882a593Smuzhiyun struct phm_microcode_version_info microcode_version_info; 791*4882a593Smuzhiyun uint32_t ps_size; 792*4882a593Smuzhiyun struct pp_power_state *current_ps; 793*4882a593Smuzhiyun struct pp_power_state *request_ps; 794*4882a593Smuzhiyun struct pp_power_state *boot_ps; 795*4882a593Smuzhiyun struct pp_power_state *uvd_ps; 796*4882a593Smuzhiyun const struct amd_pp_display_configuration *display_config; 797*4882a593Smuzhiyun uint32_t feature_mask; 798*4882a593Smuzhiyun bool avfs_supported; 799*4882a593Smuzhiyun /* UMD Pstate */ 800*4882a593Smuzhiyun bool en_umd_pstate; 801*4882a593Smuzhiyun uint32_t power_profile_mode; 802*4882a593Smuzhiyun uint32_t default_power_profile_mode; 803*4882a593Smuzhiyun uint32_t pstate_sclk; 804*4882a593Smuzhiyun uint32_t pstate_mclk; 805*4882a593Smuzhiyun bool od_enabled; 806*4882a593Smuzhiyun uint32_t power_limit; 807*4882a593Smuzhiyun uint32_t default_power_limit; 808*4882a593Smuzhiyun uint32_t workload_mask; 809*4882a593Smuzhiyun uint32_t workload_prority[Workload_Policy_Max]; 810*4882a593Smuzhiyun uint32_t workload_setting[Workload_Policy_Max]; 811*4882a593Smuzhiyun bool gfxoff_state_changed_by_workload; 812*4882a593Smuzhiyun }; 813*4882a593Smuzhiyun 814*4882a593Smuzhiyun int hwmgr_early_init(struct pp_hwmgr *hwmgr); 815*4882a593Smuzhiyun int hwmgr_sw_init(struct pp_hwmgr *hwmgr); 816*4882a593Smuzhiyun int hwmgr_sw_fini(struct pp_hwmgr *hwmgr); 817*4882a593Smuzhiyun int hwmgr_hw_init(struct pp_hwmgr *hwmgr); 818*4882a593Smuzhiyun int hwmgr_hw_fini(struct pp_hwmgr *hwmgr); 819*4882a593Smuzhiyun int hwmgr_suspend(struct pp_hwmgr *hwmgr); 820*4882a593Smuzhiyun int hwmgr_resume(struct pp_hwmgr *hwmgr); 821*4882a593Smuzhiyun 822*4882a593Smuzhiyun int hwmgr_handle_task(struct pp_hwmgr *hwmgr, 823*4882a593Smuzhiyun enum amd_pp_task task_id, 824*4882a593Smuzhiyun enum amd_pm_state_type *user_state); 825*4882a593Smuzhiyun 826*4882a593Smuzhiyun 827*4882a593Smuzhiyun #define PHM_ENTIRE_REGISTER_MASK 0xFFFFFFFFU 828*4882a593Smuzhiyun 829*4882a593Smuzhiyun 830*4882a593Smuzhiyun #endif /* _HWMGR_H_ */ 831