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