1837d542aSEvan Quan /* 2837d542aSEvan Quan * Copyright 2015 Advanced Micro Devices, Inc. 3837d542aSEvan Quan * 4837d542aSEvan Quan * Permission is hereby granted, free of charge, to any person obtaining a 5837d542aSEvan Quan * copy of this software and associated documentation files (the "Software"), 6837d542aSEvan Quan * to deal in the Software without restriction, including without limitation 7837d542aSEvan Quan * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8837d542aSEvan Quan * and/or sell copies of the Software, and to permit persons to whom the 9837d542aSEvan Quan * Software is furnished to do so, subject to the following conditions: 10837d542aSEvan Quan * 11837d542aSEvan Quan * The above copyright notice and this permission notice shall be included in 12837d542aSEvan Quan * all copies or substantial portions of the Software. 13837d542aSEvan Quan * 14837d542aSEvan Quan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15837d542aSEvan Quan * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16837d542aSEvan Quan * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17837d542aSEvan Quan * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18837d542aSEvan Quan * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19837d542aSEvan Quan * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20837d542aSEvan Quan * OTHER DEALINGS IN THE SOFTWARE. 21837d542aSEvan Quan * 22837d542aSEvan Quan */ 23837d542aSEvan Quan #ifndef _HWMGR_H_ 24837d542aSEvan Quan #define _HWMGR_H_ 25837d542aSEvan Quan 26837d542aSEvan Quan #include <linux/seq_file.h> 27837d542aSEvan Quan #include "amd_powerplay.h" 28837d542aSEvan Quan #include "hardwaremanager.h" 29837d542aSEvan Quan #include "hwmgr_ppt.h" 30837d542aSEvan Quan #include "ppatomctrl.h" 31837d542aSEvan Quan #include "power_state.h" 32837d542aSEvan Quan #include "smu_helper.h" 33837d542aSEvan Quan 34837d542aSEvan Quan struct pp_hwmgr; 35837d542aSEvan Quan struct phm_fan_speed_info; 36837d542aSEvan Quan struct pp_atomctrl_voltage_table; 37837d542aSEvan Quan 38837d542aSEvan Quan #define VOLTAGE_SCALE 4 39837d542aSEvan Quan #define VOLTAGE_VID_OFFSET_SCALE1 625 40837d542aSEvan Quan #define VOLTAGE_VID_OFFSET_SCALE2 100 41837d542aSEvan Quan 42837d542aSEvan Quan enum DISPLAY_GAP { 43837d542aSEvan Quan DISPLAY_GAP_VBLANK_OR_WM = 0, /* Wait for vblank or MCHG watermark. */ 44837d542aSEvan Quan DISPLAY_GAP_VBLANK = 1, /* Wait for vblank. */ 45837d542aSEvan Quan DISPLAY_GAP_WATERMARK = 2, /* Wait for MCHG watermark. (Note that HW may deassert WM in VBI depending on DC_STUTTER_CNTL.) */ 46837d542aSEvan Quan DISPLAY_GAP_IGNORE = 3 /* Do not wait. */ 47837d542aSEvan Quan }; 48837d542aSEvan Quan typedef enum DISPLAY_GAP DISPLAY_GAP; 49837d542aSEvan Quan 50837d542aSEvan Quan enum BACO_STATE { 51837d542aSEvan Quan BACO_STATE_OUT = 0, 52837d542aSEvan Quan BACO_STATE_IN, 53837d542aSEvan Quan }; 54837d542aSEvan Quan 55837d542aSEvan Quan struct vi_dpm_level { 56837d542aSEvan Quan bool enabled; 57837d542aSEvan Quan uint32_t value; 58837d542aSEvan Quan uint32_t param1; 59837d542aSEvan Quan }; 60837d542aSEvan Quan 61837d542aSEvan Quan struct vi_dpm_table { 62837d542aSEvan Quan uint32_t count; 63837d542aSEvan Quan struct vi_dpm_level dpm_level[]; 64837d542aSEvan Quan }; 65837d542aSEvan Quan 66837d542aSEvan Quan #define PCIE_PERF_REQ_REMOVE_REGISTRY 0 67837d542aSEvan Quan #define PCIE_PERF_REQ_FORCE_LOWPOWER 1 68837d542aSEvan Quan #define PCIE_PERF_REQ_GEN1 2 69837d542aSEvan Quan #define PCIE_PERF_REQ_GEN2 3 70837d542aSEvan Quan #define PCIE_PERF_REQ_GEN3 4 71837d542aSEvan Quan 72837d542aSEvan Quan enum PHM_BackEnd_Magic { 73837d542aSEvan Quan PHM_Dummy_Magic = 0xAA5555AA, 74837d542aSEvan Quan PHM_RV770_Magic = 0xDCBAABCD, 75837d542aSEvan Quan PHM_Kong_Magic = 0x239478DF, 76837d542aSEvan Quan PHM_NIslands_Magic = 0x736C494E, 77837d542aSEvan Quan PHM_Sumo_Magic = 0x8339FA11, 78837d542aSEvan Quan PHM_SIslands_Magic = 0x369431AC, 79837d542aSEvan Quan PHM_Trinity_Magic = 0x96751873, 80837d542aSEvan Quan PHM_CIslands_Magic = 0x38AC78B0, 81837d542aSEvan Quan PHM_Kv_Magic = 0xDCBBABC0, 82837d542aSEvan Quan PHM_VIslands_Magic = 0x20130307, 83837d542aSEvan Quan PHM_Cz_Magic = 0x67DCBA25, 84837d542aSEvan Quan PHM_Rv_Magic = 0x20161121 85837d542aSEvan Quan }; 86837d542aSEvan Quan 87837d542aSEvan Quan struct phm_set_power_state_input { 88837d542aSEvan Quan const struct pp_hw_power_state *pcurrent_state; 89837d542aSEvan Quan const struct pp_hw_power_state *pnew_state; 90837d542aSEvan Quan }; 91837d542aSEvan Quan 92837d542aSEvan Quan struct phm_clock_array { 93837d542aSEvan Quan uint32_t count; 94837d542aSEvan Quan uint32_t values[]; 95837d542aSEvan Quan }; 96837d542aSEvan Quan 97837d542aSEvan Quan struct phm_clock_voltage_dependency_record { 98837d542aSEvan Quan uint32_t clk; 99837d542aSEvan Quan uint32_t v; 100837d542aSEvan Quan }; 101837d542aSEvan Quan 102837d542aSEvan Quan struct phm_vceclock_voltage_dependency_record { 103837d542aSEvan Quan uint32_t ecclk; 104837d542aSEvan Quan uint32_t evclk; 105837d542aSEvan Quan uint32_t v; 106837d542aSEvan Quan }; 107837d542aSEvan Quan 108837d542aSEvan Quan struct phm_uvdclock_voltage_dependency_record { 109837d542aSEvan Quan uint32_t vclk; 110837d542aSEvan Quan uint32_t dclk; 111837d542aSEvan Quan uint32_t v; 112837d542aSEvan Quan }; 113837d542aSEvan Quan 114837d542aSEvan Quan struct phm_samuclock_voltage_dependency_record { 115837d542aSEvan Quan uint32_t samclk; 116837d542aSEvan Quan uint32_t v; 117837d542aSEvan Quan }; 118837d542aSEvan Quan 119837d542aSEvan Quan struct phm_acpclock_voltage_dependency_record { 120837d542aSEvan Quan uint32_t acpclk; 121837d542aSEvan Quan uint32_t v; 122837d542aSEvan Quan }; 123837d542aSEvan Quan 124837d542aSEvan Quan struct phm_clock_voltage_dependency_table { 125837d542aSEvan Quan uint32_t count; /* Number of entries. */ 126837d542aSEvan Quan struct phm_clock_voltage_dependency_record entries[]; /* Dynamically allocate count entries. */ 127837d542aSEvan Quan }; 128837d542aSEvan Quan 129837d542aSEvan Quan struct phm_phase_shedding_limits_record { 130837d542aSEvan Quan uint32_t Voltage; 131837d542aSEvan Quan uint32_t Sclk; 132837d542aSEvan Quan uint32_t Mclk; 133837d542aSEvan Quan }; 134837d542aSEvan Quan 135837d542aSEvan Quan struct phm_uvd_clock_voltage_dependency_record { 136837d542aSEvan Quan uint32_t vclk; 137837d542aSEvan Quan uint32_t dclk; 138837d542aSEvan Quan uint32_t v; 139837d542aSEvan Quan }; 140837d542aSEvan Quan 141837d542aSEvan Quan struct phm_uvd_clock_voltage_dependency_table { 142837d542aSEvan Quan uint8_t count; 143837d542aSEvan Quan struct phm_uvd_clock_voltage_dependency_record entries[]; 144837d542aSEvan Quan }; 145837d542aSEvan Quan 146837d542aSEvan Quan struct phm_acp_clock_voltage_dependency_record { 147837d542aSEvan Quan uint32_t acpclk; 148837d542aSEvan Quan uint32_t v; 149837d542aSEvan Quan }; 150837d542aSEvan Quan 151837d542aSEvan Quan struct phm_acp_clock_voltage_dependency_table { 152837d542aSEvan Quan uint32_t count; 153837d542aSEvan Quan struct phm_acp_clock_voltage_dependency_record entries[]; 154837d542aSEvan Quan }; 155837d542aSEvan Quan 156837d542aSEvan Quan struct phm_vce_clock_voltage_dependency_record { 157837d542aSEvan Quan uint32_t ecclk; 158837d542aSEvan Quan uint32_t evclk; 159837d542aSEvan Quan uint32_t v; 160837d542aSEvan Quan }; 161837d542aSEvan Quan 162837d542aSEvan Quan struct phm_phase_shedding_limits_table { 163837d542aSEvan Quan uint32_t count; 164837d542aSEvan Quan struct phm_phase_shedding_limits_record entries[]; 165837d542aSEvan Quan }; 166837d542aSEvan Quan 167837d542aSEvan Quan struct phm_vceclock_voltage_dependency_table { 168837d542aSEvan Quan uint8_t count; /* Number of entries. */ 169837d542aSEvan Quan struct phm_vceclock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 170837d542aSEvan Quan }; 171837d542aSEvan Quan 172837d542aSEvan Quan struct phm_uvdclock_voltage_dependency_table { 173837d542aSEvan Quan uint8_t count; /* Number of entries. */ 174837d542aSEvan Quan struct phm_uvdclock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 175837d542aSEvan Quan }; 176837d542aSEvan Quan 177837d542aSEvan Quan struct phm_samuclock_voltage_dependency_table { 178837d542aSEvan Quan uint8_t count; /* Number of entries. */ 179837d542aSEvan Quan struct phm_samuclock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 180837d542aSEvan Quan }; 181837d542aSEvan Quan 182837d542aSEvan Quan struct phm_acpclock_voltage_dependency_table { 183837d542aSEvan Quan uint32_t count; /* Number of entries. */ 184837d542aSEvan Quan struct phm_acpclock_voltage_dependency_record entries[1]; /* Dynamically allocate count entries. */ 185837d542aSEvan Quan }; 186837d542aSEvan Quan 187837d542aSEvan Quan struct phm_vce_clock_voltage_dependency_table { 188837d542aSEvan Quan uint8_t count; 189837d542aSEvan Quan struct phm_vce_clock_voltage_dependency_record entries[]; 190837d542aSEvan Quan }; 191837d542aSEvan Quan 192837d542aSEvan Quan 193*6f569e69SRan Sun enum SMU_ASIC_RESET_MODE { 194837d542aSEvan Quan SMU_ASIC_RESET_MODE_0, 195837d542aSEvan Quan SMU_ASIC_RESET_MODE_1, 196837d542aSEvan Quan SMU_ASIC_RESET_MODE_2, 197837d542aSEvan Quan }; 198837d542aSEvan Quan 199837d542aSEvan Quan struct pp_smumgr_func { 200837d542aSEvan Quan char *name; 201837d542aSEvan Quan int (*smu_init)(struct pp_hwmgr *hwmgr); 202837d542aSEvan Quan int (*smu_fini)(struct pp_hwmgr *hwmgr); 203837d542aSEvan Quan int (*start_smu)(struct pp_hwmgr *hwmgr); 204837d542aSEvan Quan int (*check_fw_load_finish)(struct pp_hwmgr *hwmgr, 205837d542aSEvan Quan uint32_t firmware); 206837d542aSEvan Quan int (*request_smu_load_fw)(struct pp_hwmgr *hwmgr); 207837d542aSEvan Quan int (*request_smu_load_specific_fw)(struct pp_hwmgr *hwmgr, 208837d542aSEvan Quan uint32_t firmware); 209837d542aSEvan Quan uint32_t (*get_argument)(struct pp_hwmgr *hwmgr); 210837d542aSEvan Quan int (*send_msg_to_smc)(struct pp_hwmgr *hwmgr, uint16_t msg); 211837d542aSEvan Quan int (*send_msg_to_smc_with_parameter)(struct pp_hwmgr *hwmgr, 212837d542aSEvan Quan uint16_t msg, uint32_t parameter); 213837d542aSEvan Quan int (*download_pptable_settings)(struct pp_hwmgr *hwmgr, 214837d542aSEvan Quan void **table); 215837d542aSEvan Quan int (*upload_pptable_settings)(struct pp_hwmgr *hwmgr); 216837d542aSEvan Quan int (*update_smc_table)(struct pp_hwmgr *hwmgr, uint32_t type); 217837d542aSEvan Quan int (*process_firmware_header)(struct pp_hwmgr *hwmgr); 218837d542aSEvan Quan int (*update_sclk_threshold)(struct pp_hwmgr *hwmgr); 219837d542aSEvan Quan int (*thermal_setup_fan_table)(struct pp_hwmgr *hwmgr); 220837d542aSEvan Quan int (*thermal_avfs_enable)(struct pp_hwmgr *hwmgr); 221837d542aSEvan Quan int (*init_smc_table)(struct pp_hwmgr *hwmgr); 222837d542aSEvan Quan int (*populate_all_graphic_levels)(struct pp_hwmgr *hwmgr); 223837d542aSEvan Quan int (*populate_all_memory_levels)(struct pp_hwmgr *hwmgr); 224837d542aSEvan Quan int (*initialize_mc_reg_table)(struct pp_hwmgr *hwmgr); 225837d542aSEvan Quan uint32_t (*get_offsetof)(uint32_t type, uint32_t member); 226837d542aSEvan Quan uint32_t (*get_mac_definition)(uint32_t value); 227837d542aSEvan Quan bool (*is_dpm_running)(struct pp_hwmgr *hwmgr); 228837d542aSEvan Quan bool (*is_hw_avfs_present)(struct pp_hwmgr *hwmgr); 229837d542aSEvan Quan int (*update_dpm_settings)(struct pp_hwmgr *hwmgr, void *profile_setting); 230837d542aSEvan Quan int (*smc_table_manager)(struct pp_hwmgr *hwmgr, uint8_t *table, uint16_t table_id, bool rw); /*rw: true for read, false for write */ 231837d542aSEvan Quan int (*stop_smc)(struct pp_hwmgr *hwmgr); 232837d542aSEvan Quan }; 233837d542aSEvan Quan 234837d542aSEvan Quan struct pp_hwmgr_func { 235837d542aSEvan Quan int (*backend_init)(struct pp_hwmgr *hw_mgr); 236837d542aSEvan Quan int (*backend_fini)(struct pp_hwmgr *hw_mgr); 237837d542aSEvan Quan int (*asic_setup)(struct pp_hwmgr *hw_mgr); 238837d542aSEvan Quan int (*get_power_state_size)(struct pp_hwmgr *hw_mgr); 239837d542aSEvan Quan 240837d542aSEvan Quan int (*apply_state_adjust_rules)(struct pp_hwmgr *hwmgr, 241837d542aSEvan Quan struct pp_power_state *prequest_ps, 242837d542aSEvan Quan const struct pp_power_state *pcurrent_ps); 243837d542aSEvan Quan 244837d542aSEvan Quan int (*apply_clocks_adjust_rules)(struct pp_hwmgr *hwmgr); 245837d542aSEvan Quan 246837d542aSEvan Quan int (*force_dpm_level)(struct pp_hwmgr *hw_mgr, 247837d542aSEvan Quan enum amd_dpm_forced_level level); 248837d542aSEvan Quan 249837d542aSEvan Quan int (*dynamic_state_management_enable)( 250837d542aSEvan Quan struct pp_hwmgr *hw_mgr); 251837d542aSEvan Quan int (*dynamic_state_management_disable)( 252837d542aSEvan Quan struct pp_hwmgr *hw_mgr); 253837d542aSEvan Quan 254837d542aSEvan Quan int (*patch_boot_state)(struct pp_hwmgr *hwmgr, 255837d542aSEvan Quan struct pp_hw_power_state *hw_ps); 256837d542aSEvan Quan 257837d542aSEvan Quan int (*get_pp_table_entry)(struct pp_hwmgr *hwmgr, 258837d542aSEvan Quan unsigned long, struct pp_power_state *); 259837d542aSEvan Quan int (*get_num_of_pp_table_entries)(struct pp_hwmgr *hwmgr); 260837d542aSEvan Quan int (*powerdown_uvd)(struct pp_hwmgr *hwmgr); 261837d542aSEvan Quan void (*powergate_vce)(struct pp_hwmgr *hwmgr, bool bgate); 262837d542aSEvan Quan void (*powergate_uvd)(struct pp_hwmgr *hwmgr, bool bgate); 263837d542aSEvan Quan void (*powergate_acp)(struct pp_hwmgr *hwmgr, bool bgate); 264837d542aSEvan Quan uint32_t (*get_mclk)(struct pp_hwmgr *hwmgr, bool low); 265837d542aSEvan Quan uint32_t (*get_sclk)(struct pp_hwmgr *hwmgr, bool low); 266837d542aSEvan Quan int (*power_state_set)(struct pp_hwmgr *hwmgr, 267837d542aSEvan Quan const void *state); 268837d542aSEvan Quan int (*notify_smc_display_config_after_ps_adjustment)(struct pp_hwmgr *hwmgr); 269837d542aSEvan Quan int (*pre_display_config_changed)(struct pp_hwmgr *hwmgr); 270837d542aSEvan Quan int (*display_config_changed)(struct pp_hwmgr *hwmgr); 271837d542aSEvan Quan int (*disable_clock_power_gating)(struct pp_hwmgr *hwmgr); 272837d542aSEvan Quan int (*update_clock_gatings)(struct pp_hwmgr *hwmgr, 273837d542aSEvan Quan const uint32_t *msg_id); 274837d542aSEvan Quan int (*set_max_fan_rpm_output)(struct pp_hwmgr *hwmgr, uint16_t us_max_fan_pwm); 275837d542aSEvan Quan int (*set_max_fan_pwm_output)(struct pp_hwmgr *hwmgr, uint16_t us_max_fan_pwm); 276837d542aSEvan Quan int (*stop_thermal_controller)(struct pp_hwmgr *hwmgr); 277837d542aSEvan Quan int (*get_fan_speed_info)(struct pp_hwmgr *hwmgr, struct phm_fan_speed_info *fan_speed_info); 278837d542aSEvan Quan void (*set_fan_control_mode)(struct pp_hwmgr *hwmgr, uint32_t mode); 279837d542aSEvan Quan uint32_t (*get_fan_control_mode)(struct pp_hwmgr *hwmgr); 280837d542aSEvan Quan int (*set_fan_speed_pwm)(struct pp_hwmgr *hwmgr, uint32_t speed); 281837d542aSEvan Quan int (*get_fan_speed_pwm)(struct pp_hwmgr *hwmgr, uint32_t *speed); 282837d542aSEvan Quan int (*set_fan_speed_rpm)(struct pp_hwmgr *hwmgr, uint32_t speed); 283837d542aSEvan Quan int (*get_fan_speed_rpm)(struct pp_hwmgr *hwmgr, uint32_t *speed); 284837d542aSEvan Quan int (*reset_fan_speed_to_default)(struct pp_hwmgr *hwmgr); 285837d542aSEvan Quan int (*uninitialize_thermal_controller)(struct pp_hwmgr *hwmgr); 286837d542aSEvan Quan int (*register_irq_handlers)(struct pp_hwmgr *hwmgr); 287837d542aSEvan Quan bool (*check_smc_update_required_for_display_configuration)(struct pp_hwmgr *hwmgr); 288837d542aSEvan Quan int (*check_states_equal)(struct pp_hwmgr *hwmgr, 289837d542aSEvan Quan const struct pp_hw_power_state *pstate1, 290837d542aSEvan Quan const struct pp_hw_power_state *pstate2, 291837d542aSEvan Quan bool *equal); 292837d542aSEvan Quan int (*set_cpu_power_state)(struct pp_hwmgr *hwmgr); 293837d542aSEvan Quan int (*store_cc6_data)(struct pp_hwmgr *hwmgr, uint32_t separation_time, 294837d542aSEvan Quan bool cc6_disable, bool pstate_disable, 295837d542aSEvan Quan bool pstate_switch_disable); 296837d542aSEvan Quan int (*get_dal_power_level)(struct pp_hwmgr *hwmgr, 297837d542aSEvan Quan struct amd_pp_simple_clock_info *info); 298837d542aSEvan Quan int (*get_performance_level)(struct pp_hwmgr *, const struct pp_hw_power_state *, 299837d542aSEvan Quan PHM_PerformanceLevelDesignation, uint32_t, PHM_PerformanceLevel *); 300837d542aSEvan Quan int (*get_current_shallow_sleep_clocks)(struct pp_hwmgr *hwmgr, 301837d542aSEvan Quan const struct pp_hw_power_state *state, struct pp_clock_info *clock_info); 302837d542aSEvan Quan int (*get_clock_by_type)(struct pp_hwmgr *hwmgr, enum amd_pp_clock_type type, struct amd_pp_clocks *clocks); 303837d542aSEvan Quan int (*get_clock_by_type_with_latency)(struct pp_hwmgr *hwmgr, 304837d542aSEvan Quan enum amd_pp_clock_type type, 305837d542aSEvan Quan struct pp_clock_levels_with_latency *clocks); 306837d542aSEvan Quan int (*get_clock_by_type_with_voltage)(struct pp_hwmgr *hwmgr, 307837d542aSEvan Quan enum amd_pp_clock_type type, 308837d542aSEvan Quan struct pp_clock_levels_with_voltage *clocks); 309837d542aSEvan Quan int (*set_watermarks_for_clocks_ranges)(struct pp_hwmgr *hwmgr, void *clock_ranges); 310837d542aSEvan Quan int (*display_clock_voltage_request)(struct pp_hwmgr *hwmgr, 311837d542aSEvan Quan struct pp_display_clock_request *clock); 312837d542aSEvan Quan int (*get_max_high_clocks)(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks); 313837d542aSEvan Quan int (*power_off_asic)(struct pp_hwmgr *hwmgr); 314837d542aSEvan Quan int (*force_clock_level)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, uint32_t mask); 3155d8539d2SDarren Powell int (*emit_clock_levels)(struct pp_hwmgr *hwmgr, 3165d8539d2SDarren Powell enum pp_clock_type type, char *buf, int *offset); 317837d542aSEvan Quan int (*print_clock_levels)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, char *buf); 318837d542aSEvan Quan int (*powergate_gfx)(struct pp_hwmgr *hwmgr, bool enable); 319837d542aSEvan Quan int (*get_sclk_od)(struct pp_hwmgr *hwmgr); 320837d542aSEvan Quan int (*set_sclk_od)(struct pp_hwmgr *hwmgr, uint32_t value); 321837d542aSEvan Quan int (*get_mclk_od)(struct pp_hwmgr *hwmgr); 322837d542aSEvan Quan int (*set_mclk_od)(struct pp_hwmgr *hwmgr, uint32_t value); 323837d542aSEvan Quan int (*read_sensor)(struct pp_hwmgr *hwmgr, int idx, void *value, int *size); 324837d542aSEvan Quan int (*avfs_control)(struct pp_hwmgr *hwmgr, bool enable); 325837d542aSEvan Quan int (*disable_smc_firmware_ctf)(struct pp_hwmgr *hwmgr); 326837d542aSEvan Quan int (*set_active_display_count)(struct pp_hwmgr *hwmgr, uint32_t count); 327837d542aSEvan Quan int (*set_min_deep_sleep_dcefclk)(struct pp_hwmgr *hwmgr, uint32_t clock); 328837d542aSEvan Quan int (*start_thermal_controller)(struct pp_hwmgr *hwmgr, struct PP_TemperatureRange *range); 329837d542aSEvan Quan int (*notify_cac_buffer_info)(struct pp_hwmgr *hwmgr, 330837d542aSEvan Quan uint32_t virtual_addr_low, 331837d542aSEvan Quan uint32_t virtual_addr_hi, 332837d542aSEvan Quan uint32_t mc_addr_low, 333837d542aSEvan Quan uint32_t mc_addr_hi, 334837d542aSEvan Quan uint32_t size); 335837d542aSEvan Quan int (*get_thermal_temperature_range)(struct pp_hwmgr *hwmgr, 336837d542aSEvan Quan struct PP_TemperatureRange *range); 337837d542aSEvan Quan int (*get_power_profile_mode)(struct pp_hwmgr *hwmgr, char *buf); 338837d542aSEvan Quan int (*set_power_profile_mode)(struct pp_hwmgr *hwmgr, long *input, uint32_t size); 339837d542aSEvan Quan int (*odn_edit_dpm_table)(struct pp_hwmgr *hwmgr, 340837d542aSEvan Quan enum PP_OD_DPM_TABLE_COMMAND type, 341837d542aSEvan Quan long *input, uint32_t size); 342837d542aSEvan Quan int (*set_fine_grain_clk_vol)(struct pp_hwmgr *hwmgr, 343837d542aSEvan Quan enum PP_OD_DPM_TABLE_COMMAND type, 344837d542aSEvan Quan long *input, uint32_t size); 345837d542aSEvan Quan int (*set_power_limit)(struct pp_hwmgr *hwmgr, uint32_t n); 346837d542aSEvan Quan int (*powergate_mmhub)(struct pp_hwmgr *hwmgr); 347837d542aSEvan Quan int (*smus_notify_pwe)(struct pp_hwmgr *hwmgr); 348837d542aSEvan Quan int (*powergate_sdma)(struct pp_hwmgr *hwmgr, bool bgate); 349837d542aSEvan Quan int (*enable_mgpu_fan_boost)(struct pp_hwmgr *hwmgr); 350837d542aSEvan Quan int (*set_hard_min_dcefclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock); 351837d542aSEvan Quan int (*set_hard_min_fclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock); 352837d542aSEvan Quan int (*set_hard_min_gfxclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock); 353837d542aSEvan Quan int (*set_soft_max_gfxclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock); 354837d542aSEvan Quan int (*get_asic_baco_capability)(struct pp_hwmgr *hwmgr, bool *cap); 355837d542aSEvan Quan int (*get_asic_baco_state)(struct pp_hwmgr *hwmgr, enum BACO_STATE *state); 356837d542aSEvan Quan int (*set_asic_baco_state)(struct pp_hwmgr *hwmgr, enum BACO_STATE state); 357837d542aSEvan Quan int (*get_ppfeature_status)(struct pp_hwmgr *hwmgr, char *buf); 358837d542aSEvan Quan int (*set_ppfeature_status)(struct pp_hwmgr *hwmgr, uint64_t ppfeature_masks); 359837d542aSEvan Quan int (*set_mp1_state)(struct pp_hwmgr *hwmgr, enum pp_mp1_state mp1_state); 360837d542aSEvan Quan int (*asic_reset)(struct pp_hwmgr *hwmgr, enum SMU_ASIC_RESET_MODE mode); 3617f102a90SColin Ian King int (*smu_i2c_bus_access)(struct pp_hwmgr *hwmgr, bool acquire); 362837d542aSEvan Quan int (*set_df_cstate)(struct pp_hwmgr *hwmgr, enum pp_df_cstate state); 363837d542aSEvan Quan int (*set_xgmi_pstate)(struct pp_hwmgr *hwmgr, uint32_t pstate); 364837d542aSEvan Quan int (*disable_power_features_for_compute_performance)(struct pp_hwmgr *hwmgr, 365837d542aSEvan Quan bool disable); 366837d542aSEvan Quan ssize_t (*get_gpu_metrics)(struct pp_hwmgr *hwmgr, void **table); 367837d542aSEvan Quan int (*gfx_state_change)(struct pp_hwmgr *hwmgr, uint32_t state); 368837d542aSEvan Quan }; 369837d542aSEvan Quan 370837d542aSEvan Quan struct pp_table_func { 371837d542aSEvan Quan int (*pptable_init)(struct pp_hwmgr *hw_mgr); 372837d542aSEvan Quan int (*pptable_fini)(struct pp_hwmgr *hw_mgr); 373837d542aSEvan Quan int (*pptable_get_number_of_vce_state_table_entries)(struct pp_hwmgr *hw_mgr); 374837d542aSEvan Quan int (*pptable_get_vce_state_table_entry)( 375837d542aSEvan Quan struct pp_hwmgr *hwmgr, 376837d542aSEvan Quan unsigned long i, 377837d542aSEvan Quan struct amd_vce_state *vce_state, 378837d542aSEvan Quan void **clock_info, 379837d542aSEvan Quan unsigned long *flag); 380837d542aSEvan Quan }; 381837d542aSEvan Quan 382837d542aSEvan Quan union phm_cac_leakage_record { 383837d542aSEvan Quan struct { 384837d542aSEvan Quan uint16_t Vddc; /* in CI, we use it for StdVoltageHiSidd */ 385837d542aSEvan Quan uint32_t Leakage; /* in CI, we use it for StdVoltageLoSidd */ 386837d542aSEvan Quan }; 387837d542aSEvan Quan struct { 388837d542aSEvan Quan uint16_t Vddc1; 389837d542aSEvan Quan uint16_t Vddc2; 390837d542aSEvan Quan uint16_t Vddc3; 391837d542aSEvan Quan }; 392837d542aSEvan Quan }; 393837d542aSEvan Quan 394837d542aSEvan Quan struct phm_cac_leakage_table { 395837d542aSEvan Quan uint32_t count; 396837d542aSEvan Quan union phm_cac_leakage_record entries[]; 397837d542aSEvan Quan }; 398837d542aSEvan Quan 399837d542aSEvan Quan struct phm_samu_clock_voltage_dependency_record { 400837d542aSEvan Quan uint32_t samclk; 401837d542aSEvan Quan uint32_t v; 402837d542aSEvan Quan }; 403837d542aSEvan Quan 404837d542aSEvan Quan 405837d542aSEvan Quan struct phm_samu_clock_voltage_dependency_table { 406837d542aSEvan Quan uint8_t count; 407837d542aSEvan Quan struct phm_samu_clock_voltage_dependency_record entries[]; 408837d542aSEvan Quan }; 409837d542aSEvan Quan 410837d542aSEvan Quan struct phm_cac_tdp_table { 411837d542aSEvan Quan uint16_t usTDP; 412837d542aSEvan Quan uint16_t usConfigurableTDP; 413837d542aSEvan Quan uint16_t usTDC; 414837d542aSEvan Quan uint16_t usBatteryPowerLimit; 415837d542aSEvan Quan uint16_t usSmallPowerLimit; 416837d542aSEvan Quan uint16_t usLowCACLeakage; 417837d542aSEvan Quan uint16_t usHighCACLeakage; 418837d542aSEvan Quan uint16_t usMaximumPowerDeliveryLimit; 419837d542aSEvan Quan uint16_t usEDCLimit; 420837d542aSEvan Quan uint16_t usOperatingTempMinLimit; 421837d542aSEvan Quan uint16_t usOperatingTempMaxLimit; 422837d542aSEvan Quan uint16_t usOperatingTempStep; 423837d542aSEvan Quan uint16_t usOperatingTempHyst; 424837d542aSEvan Quan uint16_t usDefaultTargetOperatingTemp; 425837d542aSEvan Quan uint16_t usTargetOperatingTemp; 426837d542aSEvan Quan uint16_t usPowerTuneDataSetID; 427837d542aSEvan Quan uint16_t usSoftwareShutdownTemp; 428837d542aSEvan Quan uint16_t usClockStretchAmount; 429837d542aSEvan Quan uint16_t usTemperatureLimitHotspot; 430837d542aSEvan Quan uint16_t usTemperatureLimitLiquid1; 431837d542aSEvan Quan uint16_t usTemperatureLimitLiquid2; 432837d542aSEvan Quan uint16_t usTemperatureLimitVrVddc; 433837d542aSEvan Quan uint16_t usTemperatureLimitVrMvdd; 434837d542aSEvan Quan uint16_t usTemperatureLimitPlx; 435837d542aSEvan Quan uint8_t ucLiquid1_I2C_address; 436837d542aSEvan Quan uint8_t ucLiquid2_I2C_address; 437837d542aSEvan Quan uint8_t ucLiquid_I2C_Line; 438837d542aSEvan Quan uint8_t ucVr_I2C_address; 439837d542aSEvan Quan uint8_t ucVr_I2C_Line; 440837d542aSEvan Quan uint8_t ucPlx_I2C_address; 441837d542aSEvan Quan uint8_t ucPlx_I2C_Line; 442837d542aSEvan Quan uint32_t usBoostPowerLimit; 443837d542aSEvan Quan uint8_t ucCKS_LDO_REFSEL; 444837d542aSEvan Quan uint8_t ucHotSpotOnly; 445837d542aSEvan Quan }; 446837d542aSEvan Quan 447837d542aSEvan Quan struct phm_tdp_table { 448837d542aSEvan Quan uint16_t usTDP; 449837d542aSEvan Quan uint16_t usConfigurableTDP; 450837d542aSEvan Quan uint16_t usTDC; 451837d542aSEvan Quan uint16_t usBatteryPowerLimit; 452837d542aSEvan Quan uint16_t usSmallPowerLimit; 453837d542aSEvan Quan uint16_t usLowCACLeakage; 454837d542aSEvan Quan uint16_t usHighCACLeakage; 455837d542aSEvan Quan uint16_t usMaximumPowerDeliveryLimit; 456837d542aSEvan Quan uint16_t usEDCLimit; 457837d542aSEvan Quan uint16_t usOperatingTempMinLimit; 458837d542aSEvan Quan uint16_t usOperatingTempMaxLimit; 459837d542aSEvan Quan uint16_t usOperatingTempStep; 460837d542aSEvan Quan uint16_t usOperatingTempHyst; 461837d542aSEvan Quan uint16_t usDefaultTargetOperatingTemp; 462837d542aSEvan Quan uint16_t usTargetOperatingTemp; 463837d542aSEvan Quan uint16_t usPowerTuneDataSetID; 464837d542aSEvan Quan uint16_t usSoftwareShutdownTemp; 465837d542aSEvan Quan uint16_t usClockStretchAmount; 466837d542aSEvan Quan uint16_t usTemperatureLimitTedge; 467837d542aSEvan Quan uint16_t usTemperatureLimitHotspot; 468837d542aSEvan Quan uint16_t usTemperatureLimitLiquid1; 469837d542aSEvan Quan uint16_t usTemperatureLimitLiquid2; 470837d542aSEvan Quan uint16_t usTemperatureLimitHBM; 471837d542aSEvan Quan uint16_t usTemperatureLimitVrVddc; 472837d542aSEvan Quan uint16_t usTemperatureLimitVrMvdd; 473837d542aSEvan Quan uint16_t usTemperatureLimitPlx; 474837d542aSEvan Quan uint8_t ucLiquid1_I2C_address; 475837d542aSEvan Quan uint8_t ucLiquid2_I2C_address; 476837d542aSEvan Quan uint8_t ucLiquid_I2C_Line; 477837d542aSEvan Quan uint8_t ucVr_I2C_address; 478837d542aSEvan Quan uint8_t ucVr_I2C_Line; 479837d542aSEvan Quan uint8_t ucPlx_I2C_address; 480837d542aSEvan Quan uint8_t ucPlx_I2C_Line; 481837d542aSEvan Quan uint8_t ucLiquid_I2C_LineSDA; 482837d542aSEvan Quan uint8_t ucVr_I2C_LineSDA; 483837d542aSEvan Quan uint8_t ucPlx_I2C_LineSDA; 484837d542aSEvan Quan uint32_t usBoostPowerLimit; 485837d542aSEvan Quan uint16_t usBoostStartTemperature; 486837d542aSEvan Quan uint16_t usBoostStopTemperature; 487837d542aSEvan Quan uint32_t ulBoostClock; 488837d542aSEvan Quan }; 489837d542aSEvan Quan 490837d542aSEvan Quan struct phm_ppm_table { 491837d542aSEvan Quan uint8_t ppm_design; 492837d542aSEvan Quan uint16_t cpu_core_number; 493837d542aSEvan Quan uint32_t platform_tdp; 494837d542aSEvan Quan uint32_t small_ac_platform_tdp; 495837d542aSEvan Quan uint32_t platform_tdc; 496837d542aSEvan Quan uint32_t small_ac_platform_tdc; 497837d542aSEvan Quan uint32_t apu_tdp; 498837d542aSEvan Quan uint32_t dgpu_tdp; 499837d542aSEvan Quan uint32_t dgpu_ulv_power; 500837d542aSEvan Quan uint32_t tj_max; 501837d542aSEvan Quan }; 502837d542aSEvan Quan 503837d542aSEvan Quan struct phm_vq_budgeting_record { 504837d542aSEvan Quan uint32_t ulCUs; 505837d542aSEvan Quan uint32_t ulSustainableSOCPowerLimitLow; 506837d542aSEvan Quan uint32_t ulSustainableSOCPowerLimitHigh; 507837d542aSEvan Quan uint32_t ulMinSclkLow; 508837d542aSEvan Quan uint32_t ulMinSclkHigh; 509837d542aSEvan Quan uint8_t ucDispConfig; 510837d542aSEvan Quan uint32_t ulDClk; 511837d542aSEvan Quan uint32_t ulEClk; 512837d542aSEvan Quan uint32_t ulSustainableSclk; 513837d542aSEvan Quan uint32_t ulSustainableCUs; 514837d542aSEvan Quan }; 515837d542aSEvan Quan 516837d542aSEvan Quan struct phm_vq_budgeting_table { 517837d542aSEvan Quan uint8_t numEntries; 518*6f569e69SRan Sun struct phm_vq_budgeting_record entries[0]; 519837d542aSEvan Quan }; 520837d542aSEvan Quan 521837d542aSEvan Quan struct phm_clock_and_voltage_limits { 522837d542aSEvan Quan uint32_t sclk; 523837d542aSEvan Quan uint32_t mclk; 524837d542aSEvan Quan uint32_t gfxclk; 525837d542aSEvan Quan uint16_t vddc; 526837d542aSEvan Quan uint16_t vddci; 527837d542aSEvan Quan uint16_t vddgfx; 528837d542aSEvan Quan uint16_t vddmem; 529837d542aSEvan Quan }; 530837d542aSEvan Quan 531837d542aSEvan Quan /* Structure to hold PPTable information */ 532837d542aSEvan Quan 533837d542aSEvan Quan struct phm_ppt_v1_information { 534837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_sclk; 535837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_mclk; 536837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_socclk; 537837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_dcefclk; 538837d542aSEvan Quan struct phm_clock_array *valid_sclk_values; 539837d542aSEvan Quan struct phm_clock_array *valid_mclk_values; 540837d542aSEvan Quan struct phm_clock_array *valid_socclk_values; 541837d542aSEvan Quan struct phm_clock_array *valid_dcefclk_values; 542837d542aSEvan Quan struct phm_clock_and_voltage_limits max_clock_voltage_on_dc; 543837d542aSEvan Quan struct phm_clock_and_voltage_limits max_clock_voltage_on_ac; 544837d542aSEvan Quan struct phm_clock_voltage_dependency_table *vddc_dep_on_dal_pwrl; 545837d542aSEvan Quan struct phm_ppm_table *ppm_parameter_table; 546837d542aSEvan Quan struct phm_cac_tdp_table *cac_dtp_table; 547837d542aSEvan Quan struct phm_tdp_table *tdp_table; 548837d542aSEvan Quan struct phm_ppt_v1_mm_clock_voltage_dependency_table *mm_dep_table; 549837d542aSEvan Quan struct phm_ppt_v1_voltage_lookup_table *vddc_lookup_table; 550837d542aSEvan Quan struct phm_ppt_v1_voltage_lookup_table *vddgfx_lookup_table; 551837d542aSEvan Quan struct phm_ppt_v1_voltage_lookup_table *vddmem_lookup_table; 552837d542aSEvan Quan struct phm_ppt_v1_pcie_table *pcie_table; 553837d542aSEvan Quan struct phm_ppt_v1_gpio_table *gpio_table; 554837d542aSEvan Quan uint16_t us_ulv_voltage_offset; 555837d542aSEvan Quan uint16_t us_ulv_smnclk_did; 556837d542aSEvan Quan uint16_t us_ulv_mp1clk_did; 557837d542aSEvan Quan uint16_t us_ulv_gfxclk_bypass; 558837d542aSEvan Quan uint16_t us_gfxclk_slew_rate; 559837d542aSEvan Quan uint16_t us_min_gfxclk_freq_limit; 560837d542aSEvan Quan }; 561837d542aSEvan Quan 562837d542aSEvan Quan struct phm_ppt_v2_information { 563837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_sclk; 564837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_mclk; 565837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_socclk; 566837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_dcefclk; 567837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_pixclk; 568837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_dispclk; 569837d542aSEvan Quan struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_phyclk; 570837d542aSEvan Quan struct phm_ppt_v1_mm_clock_voltage_dependency_table *mm_dep_table; 571837d542aSEvan Quan 572837d542aSEvan Quan struct phm_clock_voltage_dependency_table *vddc_dep_on_dalpwrl; 573837d542aSEvan Quan 574837d542aSEvan Quan struct phm_clock_array *valid_sclk_values; 575837d542aSEvan Quan struct phm_clock_array *valid_mclk_values; 576837d542aSEvan Quan struct phm_clock_array *valid_socclk_values; 577837d542aSEvan Quan struct phm_clock_array *valid_dcefclk_values; 578837d542aSEvan Quan 579837d542aSEvan Quan struct phm_clock_and_voltage_limits max_clock_voltage_on_dc; 580837d542aSEvan Quan struct phm_clock_and_voltage_limits max_clock_voltage_on_ac; 581837d542aSEvan Quan 582837d542aSEvan Quan struct phm_ppm_table *ppm_parameter_table; 583837d542aSEvan Quan struct phm_cac_tdp_table *cac_dtp_table; 584837d542aSEvan Quan struct phm_tdp_table *tdp_table; 585837d542aSEvan Quan 586837d542aSEvan Quan struct phm_ppt_v1_voltage_lookup_table *vddc_lookup_table; 587837d542aSEvan Quan struct phm_ppt_v1_voltage_lookup_table *vddgfx_lookup_table; 588837d542aSEvan Quan struct phm_ppt_v1_voltage_lookup_table *vddmem_lookup_table; 589837d542aSEvan Quan struct phm_ppt_v1_voltage_lookup_table *vddci_lookup_table; 590837d542aSEvan Quan 591837d542aSEvan Quan struct phm_ppt_v1_pcie_table *pcie_table; 592837d542aSEvan Quan 593837d542aSEvan Quan uint16_t us_ulv_voltage_offset; 594837d542aSEvan Quan uint16_t us_ulv_smnclk_did; 595837d542aSEvan Quan uint16_t us_ulv_mp1clk_did; 596837d542aSEvan Quan uint16_t us_ulv_gfxclk_bypass; 597837d542aSEvan Quan uint16_t us_gfxclk_slew_rate; 598837d542aSEvan Quan uint16_t us_min_gfxclk_freq_limit; 599837d542aSEvan Quan 600837d542aSEvan Quan uint8_t uc_gfx_dpm_voltage_mode; 601837d542aSEvan Quan uint8_t uc_soc_dpm_voltage_mode; 602837d542aSEvan Quan uint8_t uc_uclk_dpm_voltage_mode; 603837d542aSEvan Quan uint8_t uc_uvd_dpm_voltage_mode; 604837d542aSEvan Quan uint8_t uc_vce_dpm_voltage_mode; 605837d542aSEvan Quan uint8_t uc_mp0_dpm_voltage_mode; 606837d542aSEvan Quan uint8_t uc_dcef_dpm_voltage_mode; 607837d542aSEvan Quan }; 608837d542aSEvan Quan 609*6f569e69SRan Sun struct phm_ppt_v3_information { 610837d542aSEvan Quan uint8_t uc_thermal_controller_type; 611837d542aSEvan Quan 612837d542aSEvan Quan uint16_t us_small_power_limit1; 613837d542aSEvan Quan uint16_t us_small_power_limit2; 614837d542aSEvan Quan uint16_t us_boost_power_limit; 615837d542aSEvan Quan 616837d542aSEvan Quan uint16_t us_od_turbo_power_limit; 617837d542aSEvan Quan uint16_t us_od_powersave_power_limit; 618837d542aSEvan Quan uint16_t us_software_shutdown_temp; 619837d542aSEvan Quan 620837d542aSEvan Quan uint32_t *power_saving_clock_max; 621837d542aSEvan Quan uint32_t *power_saving_clock_min; 622837d542aSEvan Quan 623837d542aSEvan Quan uint8_t *od_feature_capabilities; 624837d542aSEvan Quan uint32_t *od_settings_max; 625837d542aSEvan Quan uint32_t *od_settings_min; 626837d542aSEvan Quan 627837d542aSEvan Quan void *smc_pptable; 628837d542aSEvan Quan }; 629837d542aSEvan Quan 630837d542aSEvan Quan struct phm_dynamic_state_info { 631837d542aSEvan Quan struct phm_clock_voltage_dependency_table *vddc_dependency_on_sclk; 632837d542aSEvan Quan struct phm_clock_voltage_dependency_table *vddci_dependency_on_mclk; 633837d542aSEvan Quan struct phm_clock_voltage_dependency_table *vddc_dependency_on_mclk; 634837d542aSEvan Quan struct phm_clock_voltage_dependency_table *mvdd_dependency_on_mclk; 635837d542aSEvan Quan struct phm_clock_voltage_dependency_table *vddc_dep_on_dal_pwrl; 636837d542aSEvan Quan struct phm_clock_array *valid_sclk_values; 637837d542aSEvan Quan struct phm_clock_array *valid_mclk_values; 638837d542aSEvan Quan struct phm_clock_and_voltage_limits max_clock_voltage_on_dc; 639837d542aSEvan Quan struct phm_clock_and_voltage_limits max_clock_voltage_on_ac; 640837d542aSEvan Quan uint32_t mclk_sclk_ratio; 641837d542aSEvan Quan uint32_t sclk_mclk_delta; 642837d542aSEvan Quan uint32_t vddc_vddci_delta; 643837d542aSEvan Quan uint32_t min_vddc_for_pcie_gen2; 644837d542aSEvan Quan struct phm_cac_leakage_table *cac_leakage_table; 645837d542aSEvan Quan struct phm_phase_shedding_limits_table *vddc_phase_shed_limits_table; 646837d542aSEvan Quan 647837d542aSEvan Quan struct phm_vce_clock_voltage_dependency_table 648837d542aSEvan Quan *vce_clock_voltage_dependency_table; 649837d542aSEvan Quan struct phm_uvd_clock_voltage_dependency_table 650837d542aSEvan Quan *uvd_clock_voltage_dependency_table; 651837d542aSEvan Quan struct phm_acp_clock_voltage_dependency_table 652837d542aSEvan Quan *acp_clock_voltage_dependency_table; 653837d542aSEvan Quan struct phm_samu_clock_voltage_dependency_table 654837d542aSEvan Quan *samu_clock_voltage_dependency_table; 655837d542aSEvan Quan 656837d542aSEvan Quan struct phm_ppm_table *ppm_parameter_table; 657837d542aSEvan Quan struct phm_cac_tdp_table *cac_dtp_table; 658837d542aSEvan Quan struct phm_clock_voltage_dependency_table *vdd_gfx_dependency_on_sclk; 659837d542aSEvan Quan }; 660837d542aSEvan Quan 661837d542aSEvan Quan struct pp_fan_info { 662837d542aSEvan Quan bool bNoFan; 663837d542aSEvan Quan uint8_t ucTachometerPulsesPerRevolution; 664837d542aSEvan Quan uint32_t ulMinRPM; 665837d542aSEvan Quan uint32_t ulMaxRPM; 666837d542aSEvan Quan }; 667837d542aSEvan Quan 668837d542aSEvan Quan struct pp_advance_fan_control_parameters { 669837d542aSEvan Quan uint16_t usTMin; /* The temperature, in 0.01 centigrades, below which we just run at a minimal PWM. */ 670837d542aSEvan Quan uint16_t usTMed; /* The middle temperature where we change slopes. */ 671837d542aSEvan Quan uint16_t usTHigh; /* The high temperature for setting the second slope. */ 672837d542aSEvan Quan uint16_t usPWMMin; /* The minimum PWM value in percent (0.01% increments). */ 673837d542aSEvan Quan uint16_t usPWMMed; /* The PWM value (in percent) at TMed. */ 674837d542aSEvan Quan uint16_t usPWMHigh; /* The PWM value at THigh. */ 675837d542aSEvan Quan uint8_t ucTHyst; /* Temperature hysteresis. Integer. */ 676837d542aSEvan Quan uint32_t ulCycleDelay; /* The time between two invocations of the fan control routine in microseconds. */ 677837d542aSEvan Quan uint16_t usTMax; /* The max temperature */ 678837d542aSEvan Quan uint8_t ucFanControlMode; 679837d542aSEvan Quan uint16_t usFanPWMMinLimit; 680837d542aSEvan Quan uint16_t usFanPWMMaxLimit; 681837d542aSEvan Quan uint16_t usFanPWMStep; 682837d542aSEvan Quan uint16_t usDefaultMaxFanPWM; 683837d542aSEvan Quan uint16_t usFanOutputSensitivity; 684837d542aSEvan Quan uint16_t usDefaultFanOutputSensitivity; 685837d542aSEvan Quan uint16_t usMaxFanPWM; /* The max Fan PWM value for Fuzzy Fan Control feature */ 686837d542aSEvan Quan uint16_t usFanRPMMinLimit; /* Minimum limit range in percentage, need to calculate based on minRPM/MaxRpm */ 687837d542aSEvan Quan uint16_t usFanRPMMaxLimit; /* Maximum limit range in percentage, usually set to 100% by default */ 688837d542aSEvan Quan uint16_t usFanRPMStep; /* Step increments/decerements, in percent */ 689837d542aSEvan Quan uint16_t usDefaultMaxFanRPM; /* The max Fan RPM value for Fuzzy Fan Control feature, default from PPTable */ 690837d542aSEvan Quan uint16_t usMaxFanRPM; /* The max Fan RPM value for Fuzzy Fan Control feature, user defined */ 691837d542aSEvan Quan uint16_t usFanCurrentLow; /* Low current */ 692837d542aSEvan Quan uint16_t usFanCurrentHigh; /* High current */ 693837d542aSEvan Quan uint16_t usFanRPMLow; /* Low RPM */ 694837d542aSEvan Quan uint16_t usFanRPMHigh; /* High RPM */ 695837d542aSEvan Quan uint32_t ulMinFanSCLKAcousticLimit; /* Minimum Fan Controller SCLK Frequency Acoustic Limit. */ 696837d542aSEvan Quan uint8_t ucTargetTemperature; /* Advanced fan controller target temperature. */ 697837d542aSEvan Quan 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. */ 698837d542aSEvan Quan uint16_t usFanGainEdge; /* The following is added for Fiji */ 699837d542aSEvan Quan uint16_t usFanGainHotspot; 700837d542aSEvan Quan uint16_t usFanGainLiquid; 701837d542aSEvan Quan uint16_t usFanGainVrVddc; 702837d542aSEvan Quan uint16_t usFanGainVrMvdd; 703837d542aSEvan Quan uint16_t usFanGainPlx; 704837d542aSEvan Quan uint16_t usFanGainHbm; 705837d542aSEvan Quan uint8_t ucEnableZeroRPM; 706837d542aSEvan Quan uint8_t ucFanStopTemperature; 707837d542aSEvan Quan uint8_t ucFanStartTemperature; 708837d542aSEvan Quan uint32_t ulMaxFanSCLKAcousticLimit; /* Maximum Fan Controller SCLK Frequency Acoustic Limit. */ 709837d542aSEvan Quan uint32_t ulTargetGfxClk; 710837d542aSEvan Quan uint16_t usZeroRPMStartTemperature; 711837d542aSEvan Quan uint16_t usZeroRPMStopTemperature; 712837d542aSEvan Quan uint16_t usMGpuThrottlingRPMLimit; 713837d542aSEvan Quan }; 714837d542aSEvan Quan 715837d542aSEvan Quan struct pp_thermal_controller_info { 716837d542aSEvan Quan uint8_t ucType; 717837d542aSEvan Quan uint8_t ucI2cLine; 718837d542aSEvan Quan uint8_t ucI2cAddress; 719837d542aSEvan Quan uint8_t use_hw_fan_control; 720837d542aSEvan Quan struct pp_fan_info fanInfo; 721837d542aSEvan Quan struct pp_advance_fan_control_parameters advanceFanControlParameters; 722837d542aSEvan Quan }; 723837d542aSEvan Quan 724837d542aSEvan Quan struct phm_microcode_version_info { 725837d542aSEvan Quan uint32_t SMC; 726837d542aSEvan Quan uint32_t DMCU; 727837d542aSEvan Quan uint32_t MC; 728837d542aSEvan Quan uint32_t NB; 729837d542aSEvan Quan }; 730837d542aSEvan Quan 731837d542aSEvan Quan enum PP_TABLE_VERSION { 732837d542aSEvan Quan PP_TABLE_V0 = 0, 733837d542aSEvan Quan PP_TABLE_V1, 734837d542aSEvan Quan PP_TABLE_V2, 735837d542aSEvan Quan PP_TABLE_MAX 736837d542aSEvan Quan }; 737837d542aSEvan Quan 738837d542aSEvan Quan /** 739837d542aSEvan Quan * The main hardware manager structure. 740837d542aSEvan Quan */ 741837d542aSEvan Quan #define Workload_Policy_Max 6 742837d542aSEvan Quan 743837d542aSEvan Quan struct pp_hwmgr { 744837d542aSEvan Quan void *adev; 745837d542aSEvan Quan uint32_t chip_family; 746837d542aSEvan Quan uint32_t chip_id; 747837d542aSEvan Quan uint32_t smu_version; 748837d542aSEvan Quan bool not_vf; 749837d542aSEvan Quan bool pm_en; 750837d542aSEvan Quan bool pp_one_vf; 751837d542aSEvan Quan struct mutex msg_lock; 752837d542aSEvan Quan 753837d542aSEvan Quan uint32_t pp_table_version; 754837d542aSEvan Quan void *device; 755837d542aSEvan Quan struct pp_smumgr *smumgr; 756837d542aSEvan Quan const void *soft_pp_table; 757837d542aSEvan Quan uint32_t soft_pp_table_size; 758837d542aSEvan Quan void *hardcode_pp_table; 759837d542aSEvan Quan bool need_pp_table_upload; 760837d542aSEvan Quan 761837d542aSEvan Quan struct amd_vce_state vce_states[AMD_MAX_VCE_LEVELS]; 762837d542aSEvan Quan uint32_t num_vce_state_tables; 763837d542aSEvan Quan 764837d542aSEvan Quan enum amd_dpm_forced_level dpm_level; 765837d542aSEvan Quan enum amd_dpm_forced_level saved_dpm_level; 766837d542aSEvan Quan enum amd_dpm_forced_level request_dpm_level; 767837d542aSEvan Quan uint32_t usec_timeout; 768837d542aSEvan Quan void *pptable; 769837d542aSEvan Quan struct phm_platform_descriptor platform_descriptor; 770837d542aSEvan Quan void *backend; 771837d542aSEvan Quan 772837d542aSEvan Quan void *smu_backend; 773837d542aSEvan Quan const struct pp_smumgr_func *smumgr_funcs; 774837d542aSEvan Quan bool is_kicker; 775837d542aSEvan Quan 776837d542aSEvan Quan enum PP_DAL_POWERLEVEL dal_power_level; 777837d542aSEvan Quan struct phm_dynamic_state_info dyn_state; 778837d542aSEvan Quan const struct pp_hwmgr_func *hwmgr_func; 779837d542aSEvan Quan const struct pp_table_func *pptable_func; 780837d542aSEvan Quan 781837d542aSEvan Quan struct pp_power_state *ps; 782837d542aSEvan Quan uint32_t num_ps; 783837d542aSEvan Quan struct pp_thermal_controller_info thermal_controller; 784837d542aSEvan Quan bool fan_ctrl_is_in_default_mode; 785837d542aSEvan Quan uint32_t fan_ctrl_default_mode; 786837d542aSEvan Quan bool fan_ctrl_enabled; 787837d542aSEvan Quan uint32_t tmin; 788837d542aSEvan Quan struct phm_microcode_version_info microcode_version_info; 789837d542aSEvan Quan uint32_t ps_size; 790837d542aSEvan Quan struct pp_power_state *current_ps; 791837d542aSEvan Quan struct pp_power_state *request_ps; 792837d542aSEvan Quan struct pp_power_state *boot_ps; 793837d542aSEvan Quan struct pp_power_state *uvd_ps; 794837d542aSEvan Quan const struct amd_pp_display_configuration *display_config; 795837d542aSEvan Quan uint32_t feature_mask; 796837d542aSEvan Quan bool avfs_supported; 797837d542aSEvan Quan /* UMD Pstate */ 798837d542aSEvan Quan bool en_umd_pstate; 799837d542aSEvan Quan uint32_t power_profile_mode; 800837d542aSEvan Quan uint32_t default_power_profile_mode; 801837d542aSEvan Quan uint32_t pstate_sclk; 802837d542aSEvan Quan uint32_t pstate_mclk; 803837d542aSEvan Quan bool od_enabled; 804837d542aSEvan Quan uint32_t power_limit; 805837d542aSEvan Quan uint32_t default_power_limit; 806837d542aSEvan Quan uint32_t workload_mask; 807837d542aSEvan Quan uint32_t workload_prority[Workload_Policy_Max]; 808837d542aSEvan Quan uint32_t workload_setting[Workload_Policy_Max]; 809837d542aSEvan Quan bool gfxoff_state_changed_by_workload; 810b1a9557aSEvan Quan uint32_t pstate_sclk_peak; 811b1a9557aSEvan Quan uint32_t pstate_mclk_peak; 812b75efe88SEvan Quan 813b75efe88SEvan Quan struct delayed_work swctf_delayed_work; 814837d542aSEvan Quan }; 815837d542aSEvan Quan 816837d542aSEvan Quan int hwmgr_early_init(struct pp_hwmgr *hwmgr); 817837d542aSEvan Quan int hwmgr_sw_init(struct pp_hwmgr *hwmgr); 818837d542aSEvan Quan int hwmgr_sw_fini(struct pp_hwmgr *hwmgr); 819837d542aSEvan Quan int hwmgr_hw_init(struct pp_hwmgr *hwmgr); 820837d542aSEvan Quan int hwmgr_hw_fini(struct pp_hwmgr *hwmgr); 821837d542aSEvan Quan int hwmgr_suspend(struct pp_hwmgr *hwmgr); 822837d542aSEvan Quan int hwmgr_resume(struct pp_hwmgr *hwmgr); 823837d542aSEvan Quan 824837d542aSEvan Quan int hwmgr_handle_task(struct pp_hwmgr *hwmgr, 825837d542aSEvan Quan enum amd_pp_task task_id, 826837d542aSEvan Quan enum amd_pm_state_type *user_state); 827837d542aSEvan Quan 828837d542aSEvan Quan 829837d542aSEvan Quan #define PHM_ENTIRE_REGISTER_MASK 0xFFFFFFFFU 830837d542aSEvan Quan 831837d542aSEvan Quan int smu7_init_function_pointers(struct pp_hwmgr *hwmgr); 832837d542aSEvan Quan int smu8_init_function_pointers(struct pp_hwmgr *hwmgr); 833837d542aSEvan Quan int vega12_hwmgr_init(struct pp_hwmgr *hwmgr); 834837d542aSEvan Quan int vega20_hwmgr_init(struct pp_hwmgr *hwmgr); 835837d542aSEvan Quan 836837d542aSEvan Quan #endif /* _HWMGR_H_ */ 837