xref: /openbmc/linux/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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