xref: /openbsd-src/sys/dev/pci/drm/amd/include/kgd_pp_interface.h (revision f005ef32267c16bdb134f0e9fa4477dbe07c263a)
1fb4d8502Sjsg /*
2fb4d8502Sjsg  * Copyright 2017 Advanced Micro Devices, Inc.
3fb4d8502Sjsg  *
4fb4d8502Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5fb4d8502Sjsg  * copy of this software and associated documentation files (the "Software"),
6fb4d8502Sjsg  * to deal in the Software without restriction, including without limitation
7fb4d8502Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fb4d8502Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
9fb4d8502Sjsg  * Software is furnished to do so, subject to the following conditions:
10fb4d8502Sjsg  *
11fb4d8502Sjsg  * The above copyright notice and this permission notice shall be included in
12fb4d8502Sjsg  * all copies or substantial portions of the Software.
13fb4d8502Sjsg  *
14fb4d8502Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fb4d8502Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fb4d8502Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fb4d8502Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fb4d8502Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fb4d8502Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fb4d8502Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
21fb4d8502Sjsg  *
22fb4d8502Sjsg  */
23fb4d8502Sjsg 
24fb4d8502Sjsg #ifndef __KGD_PP_INTERFACE_H__
25fb4d8502Sjsg #define __KGD_PP_INTERFACE_H__
26fb4d8502Sjsg 
27fb4d8502Sjsg extern const struct amdgpu_ip_block_version pp_smu_ip_block;
281bb76ff1Sjsg extern const struct amdgpu_ip_block_version smu_v11_0_ip_block;
291bb76ff1Sjsg extern const struct amdgpu_ip_block_version smu_v12_0_ip_block;
301bb76ff1Sjsg extern const struct amdgpu_ip_block_version smu_v13_0_ip_block;
311bb76ff1Sjsg 
321bb76ff1Sjsg enum smu_event_type {
331bb76ff1Sjsg 	SMU_EVENT_RESET_COMPLETE = 0,
341bb76ff1Sjsg };
35fb4d8502Sjsg 
36fb4d8502Sjsg struct amd_vce_state {
37fb4d8502Sjsg 	/* vce clocks */
38fb4d8502Sjsg 	u32 evclk;
39fb4d8502Sjsg 	u32 ecclk;
40fb4d8502Sjsg 	/* gpu clocks */
41fb4d8502Sjsg 	u32 sclk;
42fb4d8502Sjsg 	u32 mclk;
43fb4d8502Sjsg 	u8 clk_idx;
44fb4d8502Sjsg 	u8 pstate;
45fb4d8502Sjsg };
46fb4d8502Sjsg 
47fb4d8502Sjsg 
48fb4d8502Sjsg enum amd_dpm_forced_level {
49fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_AUTO = 0x1,
50fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_MANUAL = 0x2,
51fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_LOW = 0x4,
52fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_HIGH = 0x8,
53fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD = 0x10,
54fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK = 0x20,
55fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK = 0x40,
56fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_PROFILE_PEAK = 0x80,
57fb4d8502Sjsg 	AMD_DPM_FORCED_LEVEL_PROFILE_EXIT = 0x100,
585ca02815Sjsg 	AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM = 0x200,
59fb4d8502Sjsg };
60fb4d8502Sjsg 
61fb4d8502Sjsg enum amd_pm_state_type {
62fb4d8502Sjsg 	/* not used for dpm */
63fb4d8502Sjsg 	POWER_STATE_TYPE_DEFAULT,
64fb4d8502Sjsg 	POWER_STATE_TYPE_POWERSAVE,
65fb4d8502Sjsg 	/* user selectable states */
66fb4d8502Sjsg 	POWER_STATE_TYPE_BATTERY,
67fb4d8502Sjsg 	POWER_STATE_TYPE_BALANCED,
68fb4d8502Sjsg 	POWER_STATE_TYPE_PERFORMANCE,
69fb4d8502Sjsg 	/* internal states */
70fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_UVD,
71fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_UVD_SD,
72fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_UVD_HD,
73fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_UVD_HD2,
74fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_UVD_MVC,
75fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_BOOT,
76fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_THERMAL,
77fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_ACPI,
78fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_ULV,
79fb4d8502Sjsg 	POWER_STATE_TYPE_INTERNAL_3DPERF,
80fb4d8502Sjsg };
81fb4d8502Sjsg 
82fb4d8502Sjsg #define AMD_MAX_VCE_LEVELS 6
83fb4d8502Sjsg 
84fb4d8502Sjsg enum amd_vce_level {
85fb4d8502Sjsg 	AMD_VCE_LEVEL_AC_ALL = 0,     /* AC, All cases */
86fb4d8502Sjsg 	AMD_VCE_LEVEL_DC_EE = 1,      /* DC, entropy encoding */
87fb4d8502Sjsg 	AMD_VCE_LEVEL_DC_LL_LOW = 2,  /* DC, low latency queue, res <= 720 */
88fb4d8502Sjsg 	AMD_VCE_LEVEL_DC_LL_HIGH = 3, /* DC, low latency queue, 1080 >= res > 720 */
89fb4d8502Sjsg 	AMD_VCE_LEVEL_DC_GP_LOW = 4,  /* DC, general purpose queue, res <= 720 */
90fb4d8502Sjsg 	AMD_VCE_LEVEL_DC_GP_HIGH = 5, /* DC, general purpose queue, 1080 >= res > 720 */
91fb4d8502Sjsg };
92fb4d8502Sjsg 
93fb4d8502Sjsg enum amd_fan_ctrl_mode {
94fb4d8502Sjsg 	AMD_FAN_CTRL_NONE = 0,
95fb4d8502Sjsg 	AMD_FAN_CTRL_MANUAL = 1,
96fb4d8502Sjsg 	AMD_FAN_CTRL_AUTO = 2,
97fb4d8502Sjsg };
98fb4d8502Sjsg 
99fb4d8502Sjsg enum pp_clock_type {
100fb4d8502Sjsg 	PP_SCLK,
101fb4d8502Sjsg 	PP_MCLK,
102fb4d8502Sjsg 	PP_PCIE,
103c349dbc7Sjsg 	PP_SOCCLK,
104c349dbc7Sjsg 	PP_FCLK,
105c349dbc7Sjsg 	PP_DCEFCLK,
1065ca02815Sjsg 	PP_VCLK,
107*f005ef32Sjsg 	PP_VCLK1,
1085ca02815Sjsg 	PP_DCLK,
109*f005ef32Sjsg 	PP_DCLK1,
110fb4d8502Sjsg 	OD_SCLK,
111fb4d8502Sjsg 	OD_MCLK,
112c349dbc7Sjsg 	OD_VDDC_CURVE,
113fb4d8502Sjsg 	OD_RANGE,
1145ca02815Sjsg 	OD_VDDGFX_OFFSET,
1155ca02815Sjsg 	OD_CCLK,
116fb4d8502Sjsg };
117fb4d8502Sjsg 
118fb4d8502Sjsg enum amd_pp_sensors {
119fb4d8502Sjsg 	AMDGPU_PP_SENSOR_GFX_SCLK = 0,
1205ca02815Sjsg 	AMDGPU_PP_SENSOR_CPU_CLK,
121fb4d8502Sjsg 	AMDGPU_PP_SENSOR_VDDNB,
122fb4d8502Sjsg 	AMDGPU_PP_SENSOR_VDDGFX,
123fb4d8502Sjsg 	AMDGPU_PP_SENSOR_UVD_VCLK,
124fb4d8502Sjsg 	AMDGPU_PP_SENSOR_UVD_DCLK,
125fb4d8502Sjsg 	AMDGPU_PP_SENSOR_VCE_ECCLK,
126fb4d8502Sjsg 	AMDGPU_PP_SENSOR_GPU_LOAD,
127c349dbc7Sjsg 	AMDGPU_PP_SENSOR_MEM_LOAD,
128fb4d8502Sjsg 	AMDGPU_PP_SENSOR_GFX_MCLK,
129fb4d8502Sjsg 	AMDGPU_PP_SENSOR_GPU_TEMP,
130c349dbc7Sjsg 	AMDGPU_PP_SENSOR_EDGE_TEMP = AMDGPU_PP_SENSOR_GPU_TEMP,
131c349dbc7Sjsg 	AMDGPU_PP_SENSOR_HOTSPOT_TEMP,
132c349dbc7Sjsg 	AMDGPU_PP_SENSOR_MEM_TEMP,
133fb4d8502Sjsg 	AMDGPU_PP_SENSOR_VCE_POWER,
134fb4d8502Sjsg 	AMDGPU_PP_SENSOR_UVD_POWER,
135*f005ef32Sjsg 	AMDGPU_PP_SENSOR_GPU_AVG_POWER,
136*f005ef32Sjsg 	AMDGPU_PP_SENSOR_GPU_INPUT_POWER,
1375ca02815Sjsg 	AMDGPU_PP_SENSOR_SS_APU_SHARE,
1385ca02815Sjsg 	AMDGPU_PP_SENSOR_SS_DGPU_SHARE,
139fb4d8502Sjsg 	AMDGPU_PP_SENSOR_STABLE_PSTATE_SCLK,
140fb4d8502Sjsg 	AMDGPU_PP_SENSOR_STABLE_PSTATE_MCLK,
141c349dbc7Sjsg 	AMDGPU_PP_SENSOR_ENABLED_SMC_FEATURES_MASK,
142c349dbc7Sjsg 	AMDGPU_PP_SENSOR_MIN_FAN_RPM,
143c349dbc7Sjsg 	AMDGPU_PP_SENSOR_MAX_FAN_RPM,
144c349dbc7Sjsg 	AMDGPU_PP_SENSOR_VCN_POWER_STATE,
1458feffbfbSjsg 	AMDGPU_PP_SENSOR_PEAK_PSTATE_SCLK,
1468feffbfbSjsg 	AMDGPU_PP_SENSOR_PEAK_PSTATE_MCLK,
147fb4d8502Sjsg };
148fb4d8502Sjsg 
149fb4d8502Sjsg enum amd_pp_task {
150fb4d8502Sjsg 	AMD_PP_TASK_DISPLAY_CONFIG_CHANGE,
151fb4d8502Sjsg 	AMD_PP_TASK_ENABLE_USER_STATE,
152fb4d8502Sjsg 	AMD_PP_TASK_READJUST_POWER_STATE,
153fb4d8502Sjsg 	AMD_PP_TASK_COMPLETE_INIT,
154fb4d8502Sjsg 	AMD_PP_TASK_MAX
155fb4d8502Sjsg };
156fb4d8502Sjsg 
157fb4d8502Sjsg enum PP_SMC_POWER_PROFILE {
158c349dbc7Sjsg 	PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT = 0x0,
159c349dbc7Sjsg 	PP_SMC_POWER_PROFILE_FULLSCREEN3D = 0x1,
160c349dbc7Sjsg 	PP_SMC_POWER_PROFILE_POWERSAVING  = 0x2,
161c349dbc7Sjsg 	PP_SMC_POWER_PROFILE_VIDEO        = 0x3,
162c349dbc7Sjsg 	PP_SMC_POWER_PROFILE_VR           = 0x4,
163c349dbc7Sjsg 	PP_SMC_POWER_PROFILE_COMPUTE      = 0x5,
164c349dbc7Sjsg 	PP_SMC_POWER_PROFILE_CUSTOM       = 0x6,
1651bb76ff1Sjsg 	PP_SMC_POWER_PROFILE_WINDOW3D     = 0x7,
166*f005ef32Sjsg 	PP_SMC_POWER_PROFILE_CAPPED	  = 0x8,
167*f005ef32Sjsg 	PP_SMC_POWER_PROFILE_UNCAPPED	  = 0x9,
168c349dbc7Sjsg 	PP_SMC_POWER_PROFILE_COUNT,
169fb4d8502Sjsg };
170fb4d8502Sjsg 
1711bb76ff1Sjsg extern const char * const amdgpu_pp_profile_name[PP_SMC_POWER_PROFILE_COUNT];
1721bb76ff1Sjsg 
1731bb76ff1Sjsg 
1741bb76ff1Sjsg 
175fb4d8502Sjsg enum {
176fb4d8502Sjsg 	PP_GROUP_UNKNOWN = 0,
177fb4d8502Sjsg 	PP_GROUP_GFX = 1,
178fb4d8502Sjsg 	PP_GROUP_SYS,
179fb4d8502Sjsg 	PP_GROUP_MAX
180fb4d8502Sjsg };
181fb4d8502Sjsg 
182fb4d8502Sjsg enum PP_OD_DPM_TABLE_COMMAND {
183fb4d8502Sjsg 	PP_OD_EDIT_SCLK_VDDC_TABLE,
184fb4d8502Sjsg 	PP_OD_EDIT_MCLK_VDDC_TABLE,
1855ca02815Sjsg 	PP_OD_EDIT_CCLK_VDDC_TABLE,
186c349dbc7Sjsg 	PP_OD_EDIT_VDDC_CURVE,
187fb4d8502Sjsg 	PP_OD_RESTORE_DEFAULT_TABLE,
1885ca02815Sjsg 	PP_OD_COMMIT_DPM_TABLE,
1895ca02815Sjsg 	PP_OD_EDIT_VDDGFX_OFFSET
190fb4d8502Sjsg };
191fb4d8502Sjsg 
192fb4d8502Sjsg struct pp_states_info {
193fb4d8502Sjsg 	uint32_t nums;
194fb4d8502Sjsg 	uint32_t states[16];
195fb4d8502Sjsg };
196fb4d8502Sjsg 
197c349dbc7Sjsg enum PP_HWMON_TEMP {
198c349dbc7Sjsg 	PP_TEMP_EDGE = 0,
199c349dbc7Sjsg 	PP_TEMP_JUNCTION,
200c349dbc7Sjsg 	PP_TEMP_MEM,
201c349dbc7Sjsg 	PP_TEMP_MAX
202c349dbc7Sjsg };
203c349dbc7Sjsg 
204c349dbc7Sjsg enum pp_mp1_state {
205c349dbc7Sjsg 	PP_MP1_STATE_NONE,
206c349dbc7Sjsg 	PP_MP1_STATE_SHUTDOWN,
207c349dbc7Sjsg 	PP_MP1_STATE_UNLOAD,
208c349dbc7Sjsg 	PP_MP1_STATE_RESET,
209c349dbc7Sjsg };
210c349dbc7Sjsg 
211c349dbc7Sjsg enum pp_df_cstate {
212c349dbc7Sjsg 	DF_CSTATE_DISALLOW = 0,
213c349dbc7Sjsg 	DF_CSTATE_ALLOW,
214c349dbc7Sjsg };
215c349dbc7Sjsg 
2165ca02815Sjsg /**
2175ca02815Sjsg  * DOC: amdgpu_pp_power
2185ca02815Sjsg  *
2195ca02815Sjsg  * APU power is managed to system-level requirements through the PPT
2205ca02815Sjsg  * (package power tracking) feature. PPT is intended to limit power to the
2215ca02815Sjsg  * requirements of the power source and could be dynamically updated to
2225ca02815Sjsg  * maximize APU performance within the system power budget.
2235ca02815Sjsg  *
2245ca02815Sjsg  * Two types of power measurement can be requested, where supported, with
2255ca02815Sjsg  * :c:type:`enum pp_power_type <pp_power_type>`.
2265ca02815Sjsg  */
2275ca02815Sjsg 
2285ca02815Sjsg /**
2295ca02815Sjsg  * enum pp_power_limit_level - Used to query the power limits
2305ca02815Sjsg  *
2315ca02815Sjsg  * @PP_PWR_LIMIT_MIN: Minimum Power Limit
2325ca02815Sjsg  * @PP_PWR_LIMIT_CURRENT: Current Power Limit
2335ca02815Sjsg  * @PP_PWR_LIMIT_DEFAULT: Default Power Limit
2345ca02815Sjsg  * @PP_PWR_LIMIT_MAX: Maximum Power Limit
2355ca02815Sjsg  */
2365ca02815Sjsg enum pp_power_limit_level
2375ca02815Sjsg {
2385ca02815Sjsg 	PP_PWR_LIMIT_MIN = -1,
2395ca02815Sjsg 	PP_PWR_LIMIT_CURRENT,
2405ca02815Sjsg 	PP_PWR_LIMIT_DEFAULT,
2415ca02815Sjsg 	PP_PWR_LIMIT_MAX,
2425ca02815Sjsg };
2435ca02815Sjsg 
2445ca02815Sjsg /**
2455ca02815Sjsg  * enum pp_power_type - Used to specify the type of the requested power
2465ca02815Sjsg  *
2475ca02815Sjsg  * @PP_PWR_TYPE_SUSTAINED: manages the configurable, thermally significant
2485ca02815Sjsg  * moving average of APU power (default ~5000 ms).
2495ca02815Sjsg  * @PP_PWR_TYPE_FAST: manages the ~10 ms moving average of APU power,
2505ca02815Sjsg  * where supported.
2515ca02815Sjsg  */
2525ca02815Sjsg enum pp_power_type
2535ca02815Sjsg {
2545ca02815Sjsg 	PP_PWR_TYPE_SUSTAINED,
2555ca02815Sjsg 	PP_PWR_TYPE_FAST,
2565ca02815Sjsg };
2575ca02815Sjsg 
258fb4d8502Sjsg #define PP_GROUP_MASK        0xF0000000
259fb4d8502Sjsg #define PP_GROUP_SHIFT       28
260fb4d8502Sjsg 
261fb4d8502Sjsg #define PP_BLOCK_MASK        0x0FFFFF00
262fb4d8502Sjsg #define PP_BLOCK_SHIFT       8
263fb4d8502Sjsg 
264fb4d8502Sjsg #define PP_BLOCK_GFX_CG         0x01
265fb4d8502Sjsg #define PP_BLOCK_GFX_MG         0x02
266fb4d8502Sjsg #define PP_BLOCK_GFX_3D         0x04
267fb4d8502Sjsg #define PP_BLOCK_GFX_RLC        0x08
268fb4d8502Sjsg #define PP_BLOCK_GFX_CP         0x10
269fb4d8502Sjsg #define PP_BLOCK_SYS_BIF        0x01
270fb4d8502Sjsg #define PP_BLOCK_SYS_MC         0x02
271fb4d8502Sjsg #define PP_BLOCK_SYS_ROM        0x04
272fb4d8502Sjsg #define PP_BLOCK_SYS_DRM        0x08
273fb4d8502Sjsg #define PP_BLOCK_SYS_HDP        0x10
274fb4d8502Sjsg #define PP_BLOCK_SYS_SDMA       0x20
275fb4d8502Sjsg 
276fb4d8502Sjsg #define PP_STATE_MASK           0x0000000F
277fb4d8502Sjsg #define PP_STATE_SHIFT          0
278fb4d8502Sjsg #define PP_STATE_SUPPORT_MASK   0x000000F0
279fb4d8502Sjsg #define PP_STATE_SUPPORT_SHIFT  0
280fb4d8502Sjsg 
281fb4d8502Sjsg #define PP_STATE_CG             0x01
282fb4d8502Sjsg #define PP_STATE_LS             0x02
283fb4d8502Sjsg #define PP_STATE_DS             0x04
284fb4d8502Sjsg #define PP_STATE_SD             0x08
285fb4d8502Sjsg #define PP_STATE_SUPPORT_CG     0x10
286fb4d8502Sjsg #define PP_STATE_SUPPORT_LS     0x20
287fb4d8502Sjsg #define PP_STATE_SUPPORT_DS     0x40
288fb4d8502Sjsg #define PP_STATE_SUPPORT_SD     0x80
289fb4d8502Sjsg 
290fb4d8502Sjsg #define PP_CG_MSG_ID(group, block, support, state) \
291fb4d8502Sjsg 		((group) << PP_GROUP_SHIFT | (block) << PP_BLOCK_SHIFT | \
292fb4d8502Sjsg 		(support) << PP_STATE_SUPPORT_SHIFT | (state) << PP_STATE_SHIFT)
293fb4d8502Sjsg 
294c349dbc7Sjsg #define XGMI_MODE_PSTATE_D3 0
295c349dbc7Sjsg #define XGMI_MODE_PSTATE_D0 1
296c349dbc7Sjsg 
2975ca02815Sjsg #define NUM_HBM_INSTANCES 4
2985ca02815Sjsg 
299fb4d8502Sjsg struct seq_file;
300fb4d8502Sjsg enum amd_pp_clock_type;
301fb4d8502Sjsg struct amd_pp_simple_clock_info;
302fb4d8502Sjsg struct amd_pp_display_configuration;
303fb4d8502Sjsg struct amd_pp_clock_info;
304fb4d8502Sjsg struct pp_display_clock_request;
305fb4d8502Sjsg struct pp_clock_levels_with_voltage;
306fb4d8502Sjsg struct pp_clock_levels_with_latency;
307fb4d8502Sjsg struct amd_pp_clocks;
3085ca02815Sjsg struct pp_smu_wm_range_sets;
3095ca02815Sjsg struct pp_smu_nv_clock_table;
3105ca02815Sjsg struct dpm_clocks;
311fb4d8502Sjsg 
312fb4d8502Sjsg struct amd_pm_funcs {
313fb4d8502Sjsg /* export for dpm on ci and si */
314fb4d8502Sjsg 	int (*pre_set_power_state)(void *handle);
315fb4d8502Sjsg 	int (*set_power_state)(void *handle);
316fb4d8502Sjsg 	void (*post_set_power_state)(void *handle);
317fb4d8502Sjsg 	void (*display_configuration_changed)(void *handle);
318fb4d8502Sjsg 	void (*print_power_state)(void *handle, void *ps);
319fb4d8502Sjsg 	bool (*vblank_too_short)(void *handle);
320fb4d8502Sjsg 	void (*enable_bapm)(void *handle, bool enable);
321fb4d8502Sjsg 	int (*check_state_equal)(void *handle,
322fb4d8502Sjsg 				void  *cps,
323fb4d8502Sjsg 				void  *rps,
324fb4d8502Sjsg 				bool  *equal);
325fb4d8502Sjsg /* export for sysfs */
3261bb76ff1Sjsg 	int (*set_fan_control_mode)(void *handle, u32 mode);
3271bb76ff1Sjsg 	int (*get_fan_control_mode)(void *handle, u32 *fan_mode);
3285ca02815Sjsg 	int (*set_fan_speed_pwm)(void *handle, u32 speed);
3295ca02815Sjsg 	int (*get_fan_speed_pwm)(void *handle, u32 *speed);
330fb4d8502Sjsg 	int (*force_clock_level)(void *handle, enum pp_clock_type type, uint32_t mask);
331fb4d8502Sjsg 	int (*print_clock_levels)(void *handle, enum pp_clock_type type, char *buf);
3321bb76ff1Sjsg 	int (*emit_clock_levels)(void *handle, enum pp_clock_type type, char *buf, int *offset);
333fb4d8502Sjsg 	int (*force_performance_level)(void *handle, enum amd_dpm_forced_level level);
334fb4d8502Sjsg 	int (*get_sclk_od)(void *handle);
335fb4d8502Sjsg 	int (*set_sclk_od)(void *handle, uint32_t value);
336fb4d8502Sjsg 	int (*get_mclk_od)(void *handle);
337fb4d8502Sjsg 	int (*set_mclk_od)(void *handle, uint32_t value);
338fb4d8502Sjsg 	int (*read_sensor)(void *handle, int idx, void *value, int *size);
339*f005ef32Sjsg 	int (*get_apu_thermal_limit)(void *handle, uint32_t *limit);
340*f005ef32Sjsg 	int (*set_apu_thermal_limit)(void *handle, uint32_t limit);
341fb4d8502Sjsg 	enum amd_dpm_forced_level (*get_performance_level)(void *handle);
342fb4d8502Sjsg 	enum amd_pm_state_type (*get_current_power_state)(void *handle);
343fb4d8502Sjsg 	int (*get_fan_speed_rpm)(void *handle, uint32_t *rpm);
344c349dbc7Sjsg 	int (*set_fan_speed_rpm)(void *handle, uint32_t rpm);
345fb4d8502Sjsg 	int (*get_pp_num_states)(void *handle, struct pp_states_info *data);
346fb4d8502Sjsg 	int (*get_pp_table)(void *handle, char **table);
347fb4d8502Sjsg 	int (*set_pp_table)(void *handle, const char *buf, size_t size);
348fb4d8502Sjsg 	void (*debugfs_print_current_performance_level)(void *handle, struct seq_file *m);
349fb4d8502Sjsg 	int (*switch_power_profile)(void *handle, enum PP_SMC_POWER_PROFILE type, bool en);
350fb4d8502Sjsg /* export to amdgpu */
351fb4d8502Sjsg 	struct amd_vce_state *(*get_vce_clock_state)(void *handle, u32 idx);
352fb4d8502Sjsg 	int (*dispatch_tasks)(void *handle, enum amd_pp_task task_id,
353fb4d8502Sjsg 			enum amd_pm_state_type *user_state);
354fb4d8502Sjsg 	int (*load_firmware)(void *handle);
355fb4d8502Sjsg 	int (*wait_for_fw_loading_complete)(void *handle);
356fb4d8502Sjsg 	int (*set_powergating_by_smu)(void *handle,
357fb4d8502Sjsg 				uint32_t block_type, bool gate);
358fb4d8502Sjsg 	int (*set_clockgating_by_smu)(void *handle, uint32_t msg_id);
359fb4d8502Sjsg 	int (*set_power_limit)(void *handle, uint32_t n);
3605ca02815Sjsg 	int (*get_power_limit)(void *handle, uint32_t *limit,
3615ca02815Sjsg 			enum pp_power_limit_level pp_limit_level,
3625ca02815Sjsg 			enum pp_power_type power_type);
363fb4d8502Sjsg 	int (*get_power_profile_mode)(void *handle, char *buf);
364fb4d8502Sjsg 	int (*set_power_profile_mode)(void *handle, long *input, uint32_t size);
365ad8b1aafSjsg 	int (*set_fine_grain_clk_vol)(void *handle, uint32_t type, long *input, uint32_t size);
3661bb76ff1Sjsg 	int (*odn_edit_dpm_table)(void *handle, enum PP_OD_DPM_TABLE_COMMAND type,
3671bb76ff1Sjsg 				  long *input, uint32_t size);
368c349dbc7Sjsg 	int (*set_mp1_state)(void *handle, enum pp_mp1_state mp1_state);
369c349dbc7Sjsg 	int (*smu_i2c_bus_access)(void *handle, bool acquire);
3705ca02815Sjsg 	int (*gfx_state_change_set)(void *handle, uint32_t state);
371fb4d8502Sjsg /* export to DC */
372fb4d8502Sjsg 	u32 (*get_sclk)(void *handle, bool low);
373fb4d8502Sjsg 	u32 (*get_mclk)(void *handle, bool low);
374fb4d8502Sjsg 	int (*display_configuration_change)(void *handle,
375fb4d8502Sjsg 		const struct amd_pp_display_configuration *input);
376fb4d8502Sjsg 	int (*get_display_power_level)(void *handle,
377fb4d8502Sjsg 		struct amd_pp_simple_clock_info *output);
378fb4d8502Sjsg 	int (*get_current_clocks)(void *handle,
379fb4d8502Sjsg 		struct amd_pp_clock_info *clocks);
380fb4d8502Sjsg 	int (*get_clock_by_type)(void *handle,
381fb4d8502Sjsg 		enum amd_pp_clock_type type,
382fb4d8502Sjsg 		struct amd_pp_clocks *clocks);
383fb4d8502Sjsg 	int (*get_clock_by_type_with_latency)(void *handle,
384fb4d8502Sjsg 		enum amd_pp_clock_type type,
385fb4d8502Sjsg 		struct pp_clock_levels_with_latency *clocks);
386fb4d8502Sjsg 	int (*get_clock_by_type_with_voltage)(void *handle,
387fb4d8502Sjsg 		enum amd_pp_clock_type type,
388fb4d8502Sjsg 		struct pp_clock_levels_with_voltage *clocks);
389fb4d8502Sjsg 	int (*set_watermarks_for_clocks_ranges)(void *handle,
390fb4d8502Sjsg 						void *clock_ranges);
391fb4d8502Sjsg 	int (*display_clock_voltage_request)(void *handle,
392fb4d8502Sjsg 				struct pp_display_clock_request *clock);
393fb4d8502Sjsg 	int (*get_display_mode_validation_clocks)(void *handle,
394fb4d8502Sjsg 		struct amd_pp_simple_clock_info *clocks);
395fb4d8502Sjsg 	int (*notify_smu_enable_pwe)(void *handle);
396c349dbc7Sjsg 	int (*enable_mgpu_fan_boost)(void *handle);
397c349dbc7Sjsg 	int (*set_active_display_count)(void *handle, uint32_t count);
398c349dbc7Sjsg 	int (*set_hard_min_dcefclk_by_freq)(void *handle, uint32_t clock);
399c349dbc7Sjsg 	int (*set_hard_min_fclk_by_freq)(void *handle, uint32_t clock);
400c349dbc7Sjsg 	int (*set_min_deep_sleep_dcefclk)(void *handle, uint32_t clock);
401c349dbc7Sjsg 	int (*get_asic_baco_capability)(void *handle, bool *cap);
402c349dbc7Sjsg 	int (*get_asic_baco_state)(void *handle, int *state);
403c349dbc7Sjsg 	int (*set_asic_baco_state)(void *handle, int state);
404c349dbc7Sjsg 	int (*get_ppfeature_status)(void *handle, char *buf);
405c349dbc7Sjsg 	int (*set_ppfeature_status)(void *handle, uint64_t ppfeature_masks);
406c349dbc7Sjsg 	int (*asic_reset_mode_2)(void *handle);
407*f005ef32Sjsg 	int (*asic_reset_enable_gfx_features)(void *handle);
408c349dbc7Sjsg 	int (*set_df_cstate)(void *handle, enum pp_df_cstate state);
409c349dbc7Sjsg 	int (*set_xgmi_pstate)(void *handle, uint32_t pstate);
410ad8b1aafSjsg 	ssize_t (*get_gpu_metrics)(void *handle, void **table);
4115ca02815Sjsg 	int (*set_watermarks_for_clock_ranges)(void *handle,
4125ca02815Sjsg 					       struct pp_smu_wm_range_sets *ranges);
4135ca02815Sjsg 	int (*display_disable_memory_clock_switch)(void *handle,
4145ca02815Sjsg 						   bool disable_memory_clock_switch);
4155ca02815Sjsg 	int (*get_max_sustainable_clocks_by_dc)(void *handle,
4165ca02815Sjsg 						struct pp_smu_nv_clock_table *max_clocks);
4175ca02815Sjsg 	int (*get_uclk_dpm_states)(void *handle,
4185ca02815Sjsg 				   unsigned int *clock_values_in_khz,
4195ca02815Sjsg 				   unsigned int *num_states);
4205ca02815Sjsg 	int (*get_dpm_clock_table)(void *handle,
4215ca02815Sjsg 				   struct dpm_clocks *clock_table);
4225ca02815Sjsg 	int (*get_smu_prv_buf_details)(void *handle, void **addr, size_t *size);
4231bb76ff1Sjsg 	void (*pm_compute_clocks)(void *handle);
424ad8b1aafSjsg };
425ad8b1aafSjsg 
426ad8b1aafSjsg struct metrics_table_header {
427ad8b1aafSjsg 	uint16_t			structure_size;
428ad8b1aafSjsg 	uint8_t				format_revision;
429ad8b1aafSjsg 	uint8_t				content_revision;
430ad8b1aafSjsg };
431ad8b1aafSjsg 
4325ca02815Sjsg /*
4335ca02815Sjsg  * gpu_metrics_v1_0 is not recommended as it's not naturally aligned.
4345ca02815Sjsg  * Use gpu_metrics_v1_1 or later instead.
4355ca02815Sjsg  */
436ad8b1aafSjsg struct gpu_metrics_v1_0 {
437ad8b1aafSjsg 	struct metrics_table_header	common_header;
438ad8b1aafSjsg 
439ad8b1aafSjsg 	/* Driver attached timestamp (in ns) */
440ad8b1aafSjsg 	uint64_t			system_clock_counter;
441ad8b1aafSjsg 
442ad8b1aafSjsg 	/* Temperature */
443ad8b1aafSjsg 	uint16_t			temperature_edge;
444ad8b1aafSjsg 	uint16_t			temperature_hotspot;
445ad8b1aafSjsg 	uint16_t			temperature_mem;
446ad8b1aafSjsg 	uint16_t			temperature_vrgfx;
447ad8b1aafSjsg 	uint16_t			temperature_vrsoc;
448ad8b1aafSjsg 	uint16_t			temperature_vrmem;
449ad8b1aafSjsg 
450ad8b1aafSjsg 	/* Utilization */
451ad8b1aafSjsg 	uint16_t			average_gfx_activity;
452ad8b1aafSjsg 	uint16_t			average_umc_activity; // memory controller
453ad8b1aafSjsg 	uint16_t			average_mm_activity; // UVD or VCN
454ad8b1aafSjsg 
455ad8b1aafSjsg 	/* Power/Energy */
456ad8b1aafSjsg 	uint16_t			average_socket_power;
457ad8b1aafSjsg 	uint32_t			energy_accumulator;
458ad8b1aafSjsg 
459ad8b1aafSjsg 	/* Average clocks */
460ad8b1aafSjsg 	uint16_t			average_gfxclk_frequency;
461ad8b1aafSjsg 	uint16_t			average_socclk_frequency;
462ad8b1aafSjsg 	uint16_t			average_uclk_frequency;
463ad8b1aafSjsg 	uint16_t			average_vclk0_frequency;
464ad8b1aafSjsg 	uint16_t			average_dclk0_frequency;
465ad8b1aafSjsg 	uint16_t			average_vclk1_frequency;
466ad8b1aafSjsg 	uint16_t			average_dclk1_frequency;
467ad8b1aafSjsg 
468ad8b1aafSjsg 	/* Current clocks */
469ad8b1aafSjsg 	uint16_t			current_gfxclk;
470ad8b1aafSjsg 	uint16_t			current_socclk;
471ad8b1aafSjsg 	uint16_t			current_uclk;
472ad8b1aafSjsg 	uint16_t			current_vclk0;
473ad8b1aafSjsg 	uint16_t			current_dclk0;
474ad8b1aafSjsg 	uint16_t			current_vclk1;
475ad8b1aafSjsg 	uint16_t			current_dclk1;
476ad8b1aafSjsg 
477ad8b1aafSjsg 	/* Throttle status */
478ad8b1aafSjsg 	uint32_t			throttle_status;
479ad8b1aafSjsg 
480ad8b1aafSjsg 	/* Fans */
481ad8b1aafSjsg 	uint16_t			current_fan_speed;
482ad8b1aafSjsg 
483ad8b1aafSjsg 	/* Link width/speed */
484ad8b1aafSjsg 	uint8_t				pcie_link_width;
485ad8b1aafSjsg 	uint8_t				pcie_link_speed; // in 0.1 GT/s
486ad8b1aafSjsg };
487ad8b1aafSjsg 
4885ca02815Sjsg struct gpu_metrics_v1_1 {
4895ca02815Sjsg 	struct metrics_table_header	common_header;
4905ca02815Sjsg 
4915ca02815Sjsg 	/* Temperature */
4925ca02815Sjsg 	uint16_t			temperature_edge;
4935ca02815Sjsg 	uint16_t			temperature_hotspot;
4945ca02815Sjsg 	uint16_t			temperature_mem;
4955ca02815Sjsg 	uint16_t			temperature_vrgfx;
4965ca02815Sjsg 	uint16_t			temperature_vrsoc;
4975ca02815Sjsg 	uint16_t			temperature_vrmem;
4985ca02815Sjsg 
4995ca02815Sjsg 	/* Utilization */
5005ca02815Sjsg 	uint16_t			average_gfx_activity;
5015ca02815Sjsg 	uint16_t			average_umc_activity; // memory controller
5025ca02815Sjsg 	uint16_t			average_mm_activity; // UVD or VCN
5035ca02815Sjsg 
5045ca02815Sjsg 	/* Power/Energy */
5055ca02815Sjsg 	uint16_t			average_socket_power;
5065ca02815Sjsg 	uint64_t			energy_accumulator;
5075ca02815Sjsg 
5085ca02815Sjsg 	/* Driver attached timestamp (in ns) */
5095ca02815Sjsg 	uint64_t			system_clock_counter;
5105ca02815Sjsg 
5115ca02815Sjsg 	/* Average clocks */
5125ca02815Sjsg 	uint16_t			average_gfxclk_frequency;
5135ca02815Sjsg 	uint16_t			average_socclk_frequency;
5145ca02815Sjsg 	uint16_t			average_uclk_frequency;
5155ca02815Sjsg 	uint16_t			average_vclk0_frequency;
5165ca02815Sjsg 	uint16_t			average_dclk0_frequency;
5175ca02815Sjsg 	uint16_t			average_vclk1_frequency;
5185ca02815Sjsg 	uint16_t			average_dclk1_frequency;
5195ca02815Sjsg 
5205ca02815Sjsg 	/* Current clocks */
5215ca02815Sjsg 	uint16_t			current_gfxclk;
5225ca02815Sjsg 	uint16_t			current_socclk;
5235ca02815Sjsg 	uint16_t			current_uclk;
5245ca02815Sjsg 	uint16_t			current_vclk0;
5255ca02815Sjsg 	uint16_t			current_dclk0;
5265ca02815Sjsg 	uint16_t			current_vclk1;
5275ca02815Sjsg 	uint16_t			current_dclk1;
5285ca02815Sjsg 
5295ca02815Sjsg 	/* Throttle status */
5305ca02815Sjsg 	uint32_t			throttle_status;
5315ca02815Sjsg 
5325ca02815Sjsg 	/* Fans */
5335ca02815Sjsg 	uint16_t			current_fan_speed;
5345ca02815Sjsg 
5355ca02815Sjsg 	/* Link width/speed */
5365ca02815Sjsg 	uint16_t			pcie_link_width;
5375ca02815Sjsg 	uint16_t			pcie_link_speed; // in 0.1 GT/s
5385ca02815Sjsg 
5395ca02815Sjsg 	uint16_t			padding;
5405ca02815Sjsg 
5415ca02815Sjsg 	uint32_t			gfx_activity_acc;
5425ca02815Sjsg 	uint32_t			mem_activity_acc;
5435ca02815Sjsg 
5445ca02815Sjsg 	uint16_t			temperature_hbm[NUM_HBM_INSTANCES];
5455ca02815Sjsg };
5465ca02815Sjsg 
5475ca02815Sjsg struct gpu_metrics_v1_2 {
5485ca02815Sjsg 	struct metrics_table_header	common_header;
5495ca02815Sjsg 
5505ca02815Sjsg 	/* Temperature */
5515ca02815Sjsg 	uint16_t			temperature_edge;
5525ca02815Sjsg 	uint16_t			temperature_hotspot;
5535ca02815Sjsg 	uint16_t			temperature_mem;
5545ca02815Sjsg 	uint16_t			temperature_vrgfx;
5555ca02815Sjsg 	uint16_t			temperature_vrsoc;
5565ca02815Sjsg 	uint16_t			temperature_vrmem;
5575ca02815Sjsg 
5585ca02815Sjsg 	/* Utilization */
5595ca02815Sjsg 	uint16_t			average_gfx_activity;
5605ca02815Sjsg 	uint16_t			average_umc_activity; // memory controller
5615ca02815Sjsg 	uint16_t			average_mm_activity; // UVD or VCN
5625ca02815Sjsg 
5635ca02815Sjsg 	/* Power/Energy */
5645ca02815Sjsg 	uint16_t			average_socket_power;
5655ca02815Sjsg 	uint64_t			energy_accumulator;
5665ca02815Sjsg 
5675ca02815Sjsg 	/* Driver attached timestamp (in ns) */
5685ca02815Sjsg 	uint64_t			system_clock_counter;
5695ca02815Sjsg 
5705ca02815Sjsg 	/* Average clocks */
5715ca02815Sjsg 	uint16_t			average_gfxclk_frequency;
5725ca02815Sjsg 	uint16_t			average_socclk_frequency;
5735ca02815Sjsg 	uint16_t			average_uclk_frequency;
5745ca02815Sjsg 	uint16_t			average_vclk0_frequency;
5755ca02815Sjsg 	uint16_t			average_dclk0_frequency;
5765ca02815Sjsg 	uint16_t			average_vclk1_frequency;
5775ca02815Sjsg 	uint16_t			average_dclk1_frequency;
5785ca02815Sjsg 
5795ca02815Sjsg 	/* Current clocks */
5805ca02815Sjsg 	uint16_t			current_gfxclk;
5815ca02815Sjsg 	uint16_t			current_socclk;
5825ca02815Sjsg 	uint16_t			current_uclk;
5835ca02815Sjsg 	uint16_t			current_vclk0;
5845ca02815Sjsg 	uint16_t			current_dclk0;
5855ca02815Sjsg 	uint16_t			current_vclk1;
5865ca02815Sjsg 	uint16_t			current_dclk1;
5875ca02815Sjsg 
5885ca02815Sjsg 	/* Throttle status (ASIC dependent) */
5895ca02815Sjsg 	uint32_t			throttle_status;
5905ca02815Sjsg 
5915ca02815Sjsg 	/* Fans */
5925ca02815Sjsg 	uint16_t			current_fan_speed;
5935ca02815Sjsg 
5945ca02815Sjsg 	/* Link width/speed */
5955ca02815Sjsg 	uint16_t			pcie_link_width;
5965ca02815Sjsg 	uint16_t			pcie_link_speed; // in 0.1 GT/s
5975ca02815Sjsg 
5985ca02815Sjsg 	uint16_t			padding;
5995ca02815Sjsg 
6005ca02815Sjsg 	uint32_t			gfx_activity_acc;
6015ca02815Sjsg 	uint32_t			mem_activity_acc;
6025ca02815Sjsg 
6035ca02815Sjsg 	uint16_t			temperature_hbm[NUM_HBM_INSTANCES];
6045ca02815Sjsg 
6055ca02815Sjsg 	/* PMFW attached timestamp (10ns resolution) */
6065ca02815Sjsg 	uint64_t			firmware_timestamp;
6075ca02815Sjsg };
6085ca02815Sjsg 
6095ca02815Sjsg struct gpu_metrics_v1_3 {
6105ca02815Sjsg 	struct metrics_table_header	common_header;
6115ca02815Sjsg 
6125ca02815Sjsg 	/* Temperature */
6135ca02815Sjsg 	uint16_t			temperature_edge;
6145ca02815Sjsg 	uint16_t			temperature_hotspot;
6155ca02815Sjsg 	uint16_t			temperature_mem;
6165ca02815Sjsg 	uint16_t			temperature_vrgfx;
6175ca02815Sjsg 	uint16_t			temperature_vrsoc;
6185ca02815Sjsg 	uint16_t			temperature_vrmem;
6195ca02815Sjsg 
6205ca02815Sjsg 	/* Utilization */
6215ca02815Sjsg 	uint16_t			average_gfx_activity;
6225ca02815Sjsg 	uint16_t			average_umc_activity; // memory controller
6235ca02815Sjsg 	uint16_t			average_mm_activity; // UVD or VCN
6245ca02815Sjsg 
6255ca02815Sjsg 	/* Power/Energy */
6265ca02815Sjsg 	uint16_t			average_socket_power;
6275ca02815Sjsg 	uint64_t			energy_accumulator;
6285ca02815Sjsg 
6295ca02815Sjsg 	/* Driver attached timestamp (in ns) */
6305ca02815Sjsg 	uint64_t			system_clock_counter;
6315ca02815Sjsg 
6325ca02815Sjsg 	/* Average clocks */
6335ca02815Sjsg 	uint16_t			average_gfxclk_frequency;
6345ca02815Sjsg 	uint16_t			average_socclk_frequency;
6355ca02815Sjsg 	uint16_t			average_uclk_frequency;
6365ca02815Sjsg 	uint16_t			average_vclk0_frequency;
6375ca02815Sjsg 	uint16_t			average_dclk0_frequency;
6385ca02815Sjsg 	uint16_t			average_vclk1_frequency;
6395ca02815Sjsg 	uint16_t			average_dclk1_frequency;
6405ca02815Sjsg 
6415ca02815Sjsg 	/* Current clocks */
6425ca02815Sjsg 	uint16_t			current_gfxclk;
6435ca02815Sjsg 	uint16_t			current_socclk;
6445ca02815Sjsg 	uint16_t			current_uclk;
6455ca02815Sjsg 	uint16_t			current_vclk0;
6465ca02815Sjsg 	uint16_t			current_dclk0;
6475ca02815Sjsg 	uint16_t			current_vclk1;
6485ca02815Sjsg 	uint16_t			current_dclk1;
6495ca02815Sjsg 
6505ca02815Sjsg 	/* Throttle status */
6515ca02815Sjsg 	uint32_t			throttle_status;
6525ca02815Sjsg 
6535ca02815Sjsg 	/* Fans */
6545ca02815Sjsg 	uint16_t			current_fan_speed;
6555ca02815Sjsg 
6565ca02815Sjsg 	/* Link width/speed */
6575ca02815Sjsg 	uint16_t			pcie_link_width;
6585ca02815Sjsg 	uint16_t			pcie_link_speed; // in 0.1 GT/s
6595ca02815Sjsg 
6605ca02815Sjsg 	uint16_t			padding;
6615ca02815Sjsg 
6625ca02815Sjsg 	uint32_t			gfx_activity_acc;
6635ca02815Sjsg 	uint32_t			mem_activity_acc;
6645ca02815Sjsg 
6655ca02815Sjsg 	uint16_t			temperature_hbm[NUM_HBM_INSTANCES];
6665ca02815Sjsg 
6675ca02815Sjsg 	/* PMFW attached timestamp (10ns resolution) */
6685ca02815Sjsg 	uint64_t			firmware_timestamp;
6695ca02815Sjsg 
6705ca02815Sjsg 	/* Voltage (mV) */
6715ca02815Sjsg 	uint16_t			voltage_soc;
6725ca02815Sjsg 	uint16_t			voltage_gfx;
6735ca02815Sjsg 	uint16_t			voltage_mem;
6745ca02815Sjsg 
6755ca02815Sjsg 	uint16_t			padding1;
6765ca02815Sjsg 
6775ca02815Sjsg 	/* Throttle status (ASIC independent) */
6785ca02815Sjsg 	uint64_t			indep_throttle_status;
6795ca02815Sjsg };
6805ca02815Sjsg 
6815ca02815Sjsg /*
6825ca02815Sjsg  * gpu_metrics_v2_0 is not recommended as it's not naturally aligned.
6835ca02815Sjsg  * Use gpu_metrics_v2_1 or later instead.
6845ca02815Sjsg  */
685ad8b1aafSjsg struct gpu_metrics_v2_0 {
686ad8b1aafSjsg 	struct metrics_table_header	common_header;
687ad8b1aafSjsg 
688ad8b1aafSjsg 	/* Driver attached timestamp (in ns) */
689ad8b1aafSjsg 	uint64_t			system_clock_counter;
690ad8b1aafSjsg 
691ad8b1aafSjsg 	/* Temperature */
692ad8b1aafSjsg 	uint16_t			temperature_gfx; // gfx temperature on APUs
693ad8b1aafSjsg 	uint16_t			temperature_soc; // soc temperature on APUs
694ad8b1aafSjsg 	uint16_t			temperature_core[8]; // CPU core temperature on APUs
695ad8b1aafSjsg 	uint16_t			temperature_l3[2];
696ad8b1aafSjsg 
697ad8b1aafSjsg 	/* Utilization */
698ad8b1aafSjsg 	uint16_t			average_gfx_activity;
699ad8b1aafSjsg 	uint16_t			average_mm_activity; // UVD or VCN
700ad8b1aafSjsg 
701ad8b1aafSjsg 	/* Power/Energy */
702ad8b1aafSjsg 	uint16_t			average_socket_power; // dGPU + APU power on A + A platform
703ad8b1aafSjsg 	uint16_t			average_cpu_power;
704ad8b1aafSjsg 	uint16_t			average_soc_power;
705ad8b1aafSjsg 	uint16_t			average_gfx_power;
706ad8b1aafSjsg 	uint16_t			average_core_power[8]; // CPU core power on APUs
707ad8b1aafSjsg 
708ad8b1aafSjsg 	/* Average clocks */
709ad8b1aafSjsg 	uint16_t			average_gfxclk_frequency;
710ad8b1aafSjsg 	uint16_t			average_socclk_frequency;
711ad8b1aafSjsg 	uint16_t			average_uclk_frequency;
712ad8b1aafSjsg 	uint16_t			average_fclk_frequency;
713ad8b1aafSjsg 	uint16_t			average_vclk_frequency;
714ad8b1aafSjsg 	uint16_t			average_dclk_frequency;
715ad8b1aafSjsg 
716ad8b1aafSjsg 	/* Current clocks */
717ad8b1aafSjsg 	uint16_t			current_gfxclk;
718ad8b1aafSjsg 	uint16_t			current_socclk;
719ad8b1aafSjsg 	uint16_t			current_uclk;
720ad8b1aafSjsg 	uint16_t			current_fclk;
721ad8b1aafSjsg 	uint16_t			current_vclk;
722ad8b1aafSjsg 	uint16_t			current_dclk;
723ad8b1aafSjsg 	uint16_t			current_coreclk[8]; // CPU core clocks
724ad8b1aafSjsg 	uint16_t			current_l3clk[2];
725ad8b1aafSjsg 
726ad8b1aafSjsg 	/* Throttle status */
727ad8b1aafSjsg 	uint32_t			throttle_status;
728ad8b1aafSjsg 
729ad8b1aafSjsg 	/* Fans */
730ad8b1aafSjsg 	uint16_t			fan_pwm;
731ad8b1aafSjsg 
732ad8b1aafSjsg 	uint16_t			padding;
733fb4d8502Sjsg };
734fb4d8502Sjsg 
7355ca02815Sjsg struct gpu_metrics_v2_1 {
7365ca02815Sjsg 	struct metrics_table_header	common_header;
7375ca02815Sjsg 
7385ca02815Sjsg 	/* Temperature */
7395ca02815Sjsg 	uint16_t			temperature_gfx; // gfx temperature on APUs
7405ca02815Sjsg 	uint16_t			temperature_soc; // soc temperature on APUs
7415ca02815Sjsg 	uint16_t			temperature_core[8]; // CPU core temperature on APUs
7425ca02815Sjsg 	uint16_t			temperature_l3[2];
7435ca02815Sjsg 
7445ca02815Sjsg 	/* Utilization */
7455ca02815Sjsg 	uint16_t			average_gfx_activity;
7465ca02815Sjsg 	uint16_t			average_mm_activity; // UVD or VCN
7475ca02815Sjsg 
7485ca02815Sjsg 	/* Driver attached timestamp (in ns) */
7495ca02815Sjsg 	uint64_t			system_clock_counter;
7505ca02815Sjsg 
7515ca02815Sjsg 	/* Power/Energy */
7525ca02815Sjsg 	uint16_t			average_socket_power; // dGPU + APU power on A + A platform
7535ca02815Sjsg 	uint16_t			average_cpu_power;
7545ca02815Sjsg 	uint16_t			average_soc_power;
7555ca02815Sjsg 	uint16_t			average_gfx_power;
7565ca02815Sjsg 	uint16_t			average_core_power[8]; // CPU core power on APUs
7575ca02815Sjsg 
7585ca02815Sjsg 	/* Average clocks */
7595ca02815Sjsg 	uint16_t			average_gfxclk_frequency;
7605ca02815Sjsg 	uint16_t			average_socclk_frequency;
7615ca02815Sjsg 	uint16_t			average_uclk_frequency;
7625ca02815Sjsg 	uint16_t			average_fclk_frequency;
7635ca02815Sjsg 	uint16_t			average_vclk_frequency;
7645ca02815Sjsg 	uint16_t			average_dclk_frequency;
7655ca02815Sjsg 
7665ca02815Sjsg 	/* Current clocks */
7675ca02815Sjsg 	uint16_t			current_gfxclk;
7685ca02815Sjsg 	uint16_t			current_socclk;
7695ca02815Sjsg 	uint16_t			current_uclk;
7705ca02815Sjsg 	uint16_t			current_fclk;
7715ca02815Sjsg 	uint16_t			current_vclk;
7725ca02815Sjsg 	uint16_t			current_dclk;
7735ca02815Sjsg 	uint16_t			current_coreclk[8]; // CPU core clocks
7745ca02815Sjsg 	uint16_t			current_l3clk[2];
7755ca02815Sjsg 
7765ca02815Sjsg 	/* Throttle status */
7775ca02815Sjsg 	uint32_t			throttle_status;
7785ca02815Sjsg 
7795ca02815Sjsg 	/* Fans */
7805ca02815Sjsg 	uint16_t			fan_pwm;
7815ca02815Sjsg 
7825ca02815Sjsg 	uint16_t			padding[3];
7835ca02815Sjsg };
7845ca02815Sjsg 
7855ca02815Sjsg struct gpu_metrics_v2_2 {
7865ca02815Sjsg 	struct metrics_table_header	common_header;
7875ca02815Sjsg 
7885ca02815Sjsg 	/* Temperature */
7895ca02815Sjsg 	uint16_t			temperature_gfx; // gfx temperature on APUs
7905ca02815Sjsg 	uint16_t			temperature_soc; // soc temperature on APUs
7915ca02815Sjsg 	uint16_t			temperature_core[8]; // CPU core temperature on APUs
7925ca02815Sjsg 	uint16_t			temperature_l3[2];
7935ca02815Sjsg 
7945ca02815Sjsg 	/* Utilization */
7955ca02815Sjsg 	uint16_t			average_gfx_activity;
7965ca02815Sjsg 	uint16_t			average_mm_activity; // UVD or VCN
7975ca02815Sjsg 
7985ca02815Sjsg 	/* Driver attached timestamp (in ns) */
7995ca02815Sjsg 	uint64_t			system_clock_counter;
8005ca02815Sjsg 
8015ca02815Sjsg 	/* Power/Energy */
8025ca02815Sjsg 	uint16_t			average_socket_power; // dGPU + APU power on A + A platform
8035ca02815Sjsg 	uint16_t			average_cpu_power;
8045ca02815Sjsg 	uint16_t			average_soc_power;
8055ca02815Sjsg 	uint16_t			average_gfx_power;
8065ca02815Sjsg 	uint16_t			average_core_power[8]; // CPU core power on APUs
8075ca02815Sjsg 
8085ca02815Sjsg 	/* Average clocks */
8095ca02815Sjsg 	uint16_t			average_gfxclk_frequency;
8105ca02815Sjsg 	uint16_t			average_socclk_frequency;
8115ca02815Sjsg 	uint16_t			average_uclk_frequency;
8125ca02815Sjsg 	uint16_t			average_fclk_frequency;
8135ca02815Sjsg 	uint16_t			average_vclk_frequency;
8145ca02815Sjsg 	uint16_t			average_dclk_frequency;
8155ca02815Sjsg 
8165ca02815Sjsg 	/* Current clocks */
8175ca02815Sjsg 	uint16_t			current_gfxclk;
8185ca02815Sjsg 	uint16_t			current_socclk;
8195ca02815Sjsg 	uint16_t			current_uclk;
8205ca02815Sjsg 	uint16_t			current_fclk;
8215ca02815Sjsg 	uint16_t			current_vclk;
8225ca02815Sjsg 	uint16_t			current_dclk;
8235ca02815Sjsg 	uint16_t			current_coreclk[8]; // CPU core clocks
8245ca02815Sjsg 	uint16_t			current_l3clk[2];
8255ca02815Sjsg 
8265ca02815Sjsg 	/* Throttle status (ASIC dependent) */
8275ca02815Sjsg 	uint32_t			throttle_status;
8285ca02815Sjsg 
8295ca02815Sjsg 	/* Fans */
8305ca02815Sjsg 	uint16_t			fan_pwm;
8315ca02815Sjsg 
8325ca02815Sjsg 	uint16_t			padding[3];
8335ca02815Sjsg 
8345ca02815Sjsg 	/* Throttle status (ASIC independent) */
8355ca02815Sjsg 	uint64_t			indep_throttle_status;
8365ca02815Sjsg };
8375ca02815Sjsg 
8381bb76ff1Sjsg struct gpu_metrics_v2_3 {
8391bb76ff1Sjsg 	struct metrics_table_header	common_header;
8401bb76ff1Sjsg 
8411bb76ff1Sjsg 	/* Temperature */
8421bb76ff1Sjsg 	uint16_t			temperature_gfx; // gfx temperature on APUs
8431bb76ff1Sjsg 	uint16_t			temperature_soc; // soc temperature on APUs
8441bb76ff1Sjsg 	uint16_t			temperature_core[8]; // CPU core temperature on APUs
8451bb76ff1Sjsg 	uint16_t			temperature_l3[2];
8461bb76ff1Sjsg 
8471bb76ff1Sjsg 	/* Utilization */
8481bb76ff1Sjsg 	uint16_t			average_gfx_activity;
8491bb76ff1Sjsg 	uint16_t			average_mm_activity; // UVD or VCN
8501bb76ff1Sjsg 
8511bb76ff1Sjsg 	/* Driver attached timestamp (in ns) */
8521bb76ff1Sjsg 	uint64_t			system_clock_counter;
8531bb76ff1Sjsg 
8541bb76ff1Sjsg 	/* Power/Energy */
8551bb76ff1Sjsg 	uint16_t			average_socket_power; // dGPU + APU power on A + A platform
8561bb76ff1Sjsg 	uint16_t			average_cpu_power;
8571bb76ff1Sjsg 	uint16_t			average_soc_power;
8581bb76ff1Sjsg 	uint16_t			average_gfx_power;
8591bb76ff1Sjsg 	uint16_t			average_core_power[8]; // CPU core power on APUs
8601bb76ff1Sjsg 
8611bb76ff1Sjsg 	/* Average clocks */
8621bb76ff1Sjsg 	uint16_t			average_gfxclk_frequency;
8631bb76ff1Sjsg 	uint16_t			average_socclk_frequency;
8641bb76ff1Sjsg 	uint16_t			average_uclk_frequency;
8651bb76ff1Sjsg 	uint16_t			average_fclk_frequency;
8661bb76ff1Sjsg 	uint16_t			average_vclk_frequency;
8671bb76ff1Sjsg 	uint16_t			average_dclk_frequency;
8681bb76ff1Sjsg 
8691bb76ff1Sjsg 	/* Current clocks */
8701bb76ff1Sjsg 	uint16_t			current_gfxclk;
8711bb76ff1Sjsg 	uint16_t			current_socclk;
8721bb76ff1Sjsg 	uint16_t			current_uclk;
8731bb76ff1Sjsg 	uint16_t			current_fclk;
8741bb76ff1Sjsg 	uint16_t			current_vclk;
8751bb76ff1Sjsg 	uint16_t			current_dclk;
8761bb76ff1Sjsg 	uint16_t			current_coreclk[8]; // CPU core clocks
8771bb76ff1Sjsg 	uint16_t			current_l3clk[2];
8781bb76ff1Sjsg 
8791bb76ff1Sjsg 	/* Throttle status (ASIC dependent) */
8801bb76ff1Sjsg 	uint32_t			throttle_status;
8811bb76ff1Sjsg 
8821bb76ff1Sjsg 	/* Fans */
8831bb76ff1Sjsg 	uint16_t			fan_pwm;
8841bb76ff1Sjsg 
8851bb76ff1Sjsg 	uint16_t			padding[3];
8861bb76ff1Sjsg 
8871bb76ff1Sjsg 	/* Throttle status (ASIC independent) */
8881bb76ff1Sjsg 	uint64_t			indep_throttle_status;
8891bb76ff1Sjsg 
8901bb76ff1Sjsg 	/* Average Temperature */
8911bb76ff1Sjsg 	uint16_t			average_temperature_gfx; // average gfx temperature on APUs
8921bb76ff1Sjsg 	uint16_t			average_temperature_soc; // average soc temperature on APUs
8931bb76ff1Sjsg 	uint16_t			average_temperature_core[8]; // average CPU core temperature on APUs
8941bb76ff1Sjsg 	uint16_t			average_temperature_l3[2];
8951bb76ff1Sjsg };
896*f005ef32Sjsg 
897*f005ef32Sjsg struct gpu_metrics_v2_4 {
898*f005ef32Sjsg 	struct metrics_table_header	common_header;
899*f005ef32Sjsg 
900*f005ef32Sjsg 	/* Temperature (unit: centi-Celsius) */
901*f005ef32Sjsg 	uint16_t			temperature_gfx;
902*f005ef32Sjsg 	uint16_t			temperature_soc;
903*f005ef32Sjsg 	uint16_t			temperature_core[8];
904*f005ef32Sjsg 	uint16_t			temperature_l3[2];
905*f005ef32Sjsg 
906*f005ef32Sjsg 	/* Utilization (unit: centi) */
907*f005ef32Sjsg 	uint16_t			average_gfx_activity;
908*f005ef32Sjsg 	uint16_t			average_mm_activity;
909*f005ef32Sjsg 
910*f005ef32Sjsg 	/* Driver attached timestamp (in ns) */
911*f005ef32Sjsg 	uint64_t			system_clock_counter;
912*f005ef32Sjsg 
913*f005ef32Sjsg 	/* Power/Energy (unit: mW) */
914*f005ef32Sjsg 	uint16_t			average_socket_power;
915*f005ef32Sjsg 	uint16_t			average_cpu_power;
916*f005ef32Sjsg 	uint16_t			average_soc_power;
917*f005ef32Sjsg 	uint16_t			average_gfx_power;
918*f005ef32Sjsg 	uint16_t			average_core_power[8];
919*f005ef32Sjsg 
920*f005ef32Sjsg 	/* Average clocks (unit: MHz) */
921*f005ef32Sjsg 	uint16_t			average_gfxclk_frequency;
922*f005ef32Sjsg 	uint16_t			average_socclk_frequency;
923*f005ef32Sjsg 	uint16_t			average_uclk_frequency;
924*f005ef32Sjsg 	uint16_t			average_fclk_frequency;
925*f005ef32Sjsg 	uint16_t			average_vclk_frequency;
926*f005ef32Sjsg 	uint16_t			average_dclk_frequency;
927*f005ef32Sjsg 
928*f005ef32Sjsg 	/* Current clocks (unit: MHz) */
929*f005ef32Sjsg 	uint16_t			current_gfxclk;
930*f005ef32Sjsg 	uint16_t			current_socclk;
931*f005ef32Sjsg 	uint16_t			current_uclk;
932*f005ef32Sjsg 	uint16_t			current_fclk;
933*f005ef32Sjsg 	uint16_t			current_vclk;
934*f005ef32Sjsg 	uint16_t			current_dclk;
935*f005ef32Sjsg 	uint16_t			current_coreclk[8];
936*f005ef32Sjsg 	uint16_t			current_l3clk[2];
937*f005ef32Sjsg 
938*f005ef32Sjsg 	/* Throttle status (ASIC dependent) */
939*f005ef32Sjsg 	uint32_t			throttle_status;
940*f005ef32Sjsg 
941*f005ef32Sjsg 	/* Fans */
942*f005ef32Sjsg 	uint16_t			fan_pwm;
943*f005ef32Sjsg 
944*f005ef32Sjsg 	uint16_t			padding[3];
945*f005ef32Sjsg 
946*f005ef32Sjsg 	/* Throttle status (ASIC independent) */
947*f005ef32Sjsg 	uint64_t			indep_throttle_status;
948*f005ef32Sjsg 
949*f005ef32Sjsg 	/* Average Temperature (unit: centi-Celsius) */
950*f005ef32Sjsg 	uint16_t			average_temperature_gfx;
951*f005ef32Sjsg 	uint16_t			average_temperature_soc;
952*f005ef32Sjsg 	uint16_t			average_temperature_core[8];
953*f005ef32Sjsg 	uint16_t			average_temperature_l3[2];
954*f005ef32Sjsg 
955*f005ef32Sjsg 	/* Power/Voltage (unit: mV) */
956*f005ef32Sjsg 	uint16_t			average_cpu_voltage;
957*f005ef32Sjsg 	uint16_t			average_soc_voltage;
958*f005ef32Sjsg 	uint16_t			average_gfx_voltage;
959*f005ef32Sjsg 
960*f005ef32Sjsg 	/* Power/Current (unit: mA) */
961*f005ef32Sjsg 	uint16_t			average_cpu_current;
962*f005ef32Sjsg 	uint16_t			average_soc_current;
963*f005ef32Sjsg 	uint16_t			average_gfx_current;
964*f005ef32Sjsg };
965fb4d8502Sjsg #endif
966