• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * AMD Platform Management Framework Driver
4  *
5  * Copyright (c) 2022, Advanced Micro Devices, Inc.
6  * All Rights Reserved.
7  *
8  * Author: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
9  */
10 
11 #ifndef PMF_H
12 #define PMF_H
13 
14 #include <linux/acpi.h>
15 #include <linux/platform_profile.h>
16 
17 /* APMF Functions */
18 #define APMF_FUNC_VERIFY_INTERFACE			0
19 #define APMF_FUNC_GET_SYS_PARAMS			1
20 #define APMF_FUNC_SBIOS_REQUESTS			2
21 #define APMF_FUNC_SBIOS_HEARTBEAT			4
22 #define APMF_FUNC_AUTO_MODE					5
23 #define APMF_FUNC_SET_FAN_IDX				7
24 #define APMF_FUNC_OS_POWER_SLIDER_UPDATE		8
25 #define APMF_FUNC_STATIC_SLIDER_GRANULAR       9
26 #define APMF_FUNC_DYN_SLIDER_AC				11
27 #define APMF_FUNC_DYN_SLIDER_DC				12
28 
29 /* Message Definitions */
30 #define SET_SPL				0x03 /* SPL: Sustained Power Limit */
31 #define SET_SPPT			0x05 /* SPPT: Slow Package Power Tracking */
32 #define SET_FPPT			0x07 /* FPPT: Fast Package Power Tracking */
33 #define GET_SPL				0x0B
34 #define GET_SPPT			0x0D
35 #define GET_FPPT			0x0F
36 #define SET_DRAM_ADDR_HIGH	0x14
37 #define SET_DRAM_ADDR_LOW	0x15
38 #define SET_TRANSFER_TABLE	0x16
39 #define SET_STT_MIN_LIMIT	0x18 /* STT: Skin Temperature Tracking */
40 #define SET_STT_LIMIT_APU	0x19
41 #define SET_STT_LIMIT_HS2	0x1A
42 #define SET_SPPT_APU_ONLY	0x1D
43 #define GET_SPPT_APU_ONLY	0x1E
44 #define GET_STT_MIN_LIMIT	0x1F
45 #define GET_STT_LIMIT_APU	0x20
46 #define GET_STT_LIMIT_HS2	0x21
47 
48 /* OS slider update notification */
49 #define DC_BEST_PERF		0
50 #define DC_BETTER_PERF		1
51 #define DC_BATTERY_SAVER	3
52 #define AC_BEST_PERF		4
53 #define AC_BETTER_PERF		5
54 #define AC_BETTER_BATTERY	6
55 
56 /* Fan Index for Auto Mode */
57 #define FAN_INDEX_AUTO		0xFFFFFFFF
58 
59 #define ARG_NONE 0
60 #define AVG_SAMPLE_SIZE 3
61 
62 /* AMD PMF BIOS interfaces */
63 struct apmf_verify_interface {
64 	u16 size;
65 	u16 version;
66 	u32 notification_mask;
67 	u32 supported_functions;
68 } __packed;
69 
70 struct apmf_system_params {
71 	u16 size;
72 	u32 valid_mask;
73 	u32 flags;
74 	u8 command_code;
75 	u32 heartbeat_int;
76 } __packed;
77 
78 struct apmf_sbios_req {
79 	u16 size;
80 	u32 pending_req;
81 	u8 rsd;
82 	u8 cql_event;
83 	u8 amt_event;
84 	u32 fppt;
85 	u32 sppt;
86 	u32 fppt_apu_only;
87 	u32 spl;
88 	u32 stt_min_limit;
89 	u8 skin_temp_apu;
90 	u8 skin_temp_hs2;
91 } __packed;
92 
93 struct apmf_fan_idx {
94 	u16 size;
95 	u8 fan_ctl_mode;
96 	u32 fan_ctl_idx;
97 } __packed;
98 
99 struct smu_pmf_metrics {
100 	u16 gfxclk_freq; /* in MHz */
101 	u16 socclk_freq; /* in MHz */
102 	u16 vclk_freq; /* in MHz */
103 	u16 dclk_freq; /* in MHz */
104 	u16 memclk_freq; /* in MHz */
105 	u16 spare;
106 	u16 gfx_activity; /* in Centi */
107 	u16 uvd_activity; /* in Centi */
108 	u16 voltage[2]; /* in mV */
109 	u16 currents[2]; /* in mA */
110 	u16 power[2];/* in mW */
111 	u16 core_freq[8]; /* in MHz */
112 	u16 core_power[8]; /* in mW */
113 	u16 core_temp[8]; /* in centi-Celsius */
114 	u16 l3_freq; /* in MHz */
115 	u16 l3_temp; /* in centi-Celsius */
116 	u16 gfx_temp; /* in centi-Celsius */
117 	u16 soc_temp; /* in centi-Celsius */
118 	u16 throttler_status;
119 	u16 current_socketpower; /* in mW */
120 	u16 stapm_orig_limit; /* in W */
121 	u16 stapm_cur_limit; /* in W */
122 	u32 apu_power; /* in mW */
123 	u32 dgpu_power; /* in mW */
124 	u16 vdd_tdc_val; /* in mA */
125 	u16 soc_tdc_val; /* in mA */
126 	u16 vdd_edc_val; /* in mA */
127 	u16 soc_edcv_al; /* in mA */
128 	u16 infra_cpu_maxfreq; /* in MHz */
129 	u16 infra_gfx_maxfreq; /* in MHz */
130 	u16 skin_temp; /* in centi-Celsius */
131 	u16 device_state;
132 } __packed;
133 
134 enum amd_stt_skin_temp {
135 	STT_TEMP_APU,
136 	STT_TEMP_HS2,
137 	STT_TEMP_COUNT,
138 };
139 
140 enum amd_slider_op {
141 	SLIDER_OP_GET,
142 	SLIDER_OP_SET,
143 };
144 
145 enum power_source {
146 	POWER_SOURCE_AC,
147 	POWER_SOURCE_DC,
148 	POWER_SOURCE_MAX,
149 };
150 
151 enum power_modes {
152 	POWER_MODE_PERFORMANCE,
153 	POWER_MODE_BALANCED_POWER,
154 	POWER_MODE_POWER_SAVER,
155 	POWER_MODE_MAX,
156 };
157 
158 struct amd_pmf_dev {
159 	void __iomem *regbase;
160 	void __iomem *smu_virt_addr;
161 	void *buf;
162 	u32 base_addr;
163 	u32 cpu_id;
164 	struct device *dev;
165 	struct mutex lock; /* protects the PMF interface */
166 	u32 supported_func;
167 	enum platform_profile_option current_profile;
168 	struct platform_profile_handler pprof;
169 	struct dentry *dbgfs_dir;
170 	int hb_interval; /* SBIOS heartbeat interval */
171 	struct delayed_work heart_beat;
172 	struct smu_pmf_metrics m_table;
173 	struct delayed_work work_buffer;
174 	ktime_t start_time;
175 	int socket_power_history[AVG_SAMPLE_SIZE];
176 	int socket_power_history_idx;
177 	bool amt_enabled;
178 	struct mutex update_mutex; /* protects race between ACPI handler and metrics thread */
179 	bool cnqf_enabled;
180 	bool cnqf_supported;
181 	struct notifier_block pwr_src_notifier;
182 };
183 
184 struct apmf_sps_prop_granular {
185 	u32 fppt;
186 	u32 sppt;
187 	u32 sppt_apu_only;
188 	u32 spl;
189 	u32 stt_min;
190 	u8 stt_skin_temp[STT_TEMP_COUNT];
191 	u32 fan_id;
192 } __packed;
193 
194 /* Static Slider */
195 struct apmf_static_slider_granular_output {
196 	u16 size;
197 	struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX * POWER_MODE_MAX];
198 } __packed;
199 
200 struct amd_pmf_static_slider_granular {
201 	u16 size;
202 	struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX][POWER_MODE_MAX];
203 };
204 
205 struct os_power_slider {
206 	u16 size;
207 	u8 slider_event;
208 } __packed;
209 
210 struct fan_table_control {
211 	bool manual;
212 	unsigned long fan_id;
213 };
214 
215 struct power_table_control {
216 	u32 spl;
217 	u32 sppt;
218 	u32 fppt;
219 	u32 sppt_apu_only;
220 	u32 stt_min;
221 	u32 stt_skin_temp[STT_TEMP_COUNT];
222 	u32 reserved[16];
223 };
224 
225 /* Auto Mode Layer */
226 enum auto_mode_transition_priority {
227 	AUTO_TRANSITION_TO_PERFORMANCE, /* Any other mode to Performance Mode */
228 	AUTO_TRANSITION_FROM_QUIET_TO_BALANCE, /* Quiet Mode to Balance Mode */
229 	AUTO_TRANSITION_TO_QUIET, /* Any other mode to Quiet Mode */
230 	AUTO_TRANSITION_FROM_PERFORMANCE_TO_BALANCE, /* Performance Mode to Balance Mode */
231 	AUTO_TRANSITION_MAX,
232 };
233 
234 enum auto_mode_mode {
235 	AUTO_QUIET,
236 	AUTO_BALANCE,
237 	AUTO_PERFORMANCE_ON_LAP,
238 	AUTO_PERFORMANCE,
239 	AUTO_MODE_MAX,
240 };
241 
242 struct auto_mode_trans_params {
243 	u32 time_constant; /* minimum time required to switch to next mode */
244 	u32 power_delta; /* delta power to shift mode */
245 	u32 power_threshold;
246 	u32 timer; /* elapsed time. if timer > TimeThreshold, it will move to next mode */
247 	u32 applied;
248 	enum auto_mode_mode target_mode;
249 	u32 shifting_up;
250 };
251 
252 struct auto_mode_mode_settings {
253 	struct power_table_control power_control;
254 	struct fan_table_control fan_control;
255 	u32 power_floor;
256 };
257 
258 struct auto_mode_mode_config {
259 	struct auto_mode_trans_params transition[AUTO_TRANSITION_MAX];
260 	struct auto_mode_mode_settings mode_set[AUTO_MODE_MAX];
261 	enum auto_mode_mode current_mode;
262 };
263 
264 struct apmf_auto_mode {
265 	u16 size;
266 	/* time constant */
267 	u32 balanced_to_perf;
268 	u32 perf_to_balanced;
269 	u32 quiet_to_balanced;
270 	u32 balanced_to_quiet;
271 	/* power floor */
272 	u32 pfloor_perf;
273 	u32 pfloor_balanced;
274 	u32 pfloor_quiet;
275 	/* Power delta for mode change */
276 	u32 pd_balanced_to_perf;
277 	u32 pd_perf_to_balanced;
278 	u32 pd_quiet_to_balanced;
279 	u32 pd_balanced_to_quiet;
280 	/* skin temperature limits */
281 	u8 stt_apu_perf_on_lap; /* CQL ON */
282 	u8 stt_hs2_perf_on_lap; /* CQL ON */
283 	u8 stt_apu_perf;
284 	u8 stt_hs2_perf;
285 	u8 stt_apu_balanced;
286 	u8 stt_hs2_balanced;
287 	u8 stt_apu_quiet;
288 	u8 stt_hs2_quiet;
289 	u32 stt_min_limit_perf_on_lap; /* CQL ON */
290 	u32 stt_min_limit_perf;
291 	u32 stt_min_limit_balanced;
292 	u32 stt_min_limit_quiet;
293 	/* SPL based */
294 	u32 fppt_perf_on_lap; /* CQL ON */
295 	u32 sppt_perf_on_lap; /* CQL ON */
296 	u32 spl_perf_on_lap; /* CQL ON */
297 	u32 sppt_apu_only_perf_on_lap; /* CQL ON */
298 	u32 fppt_perf;
299 	u32 sppt_perf;
300 	u32 spl_perf;
301 	u32 sppt_apu_only_perf;
302 	u32 fppt_balanced;
303 	u32 sppt_balanced;
304 	u32 spl_balanced;
305 	u32 sppt_apu_only_balanced;
306 	u32 fppt_quiet;
307 	u32 sppt_quiet;
308 	u32 spl_quiet;
309 	u32 sppt_apu_only_quiet;
310 	/* Fan ID */
311 	u32 fan_id_perf;
312 	u32 fan_id_balanced;
313 	u32 fan_id_quiet;
314 } __packed;
315 
316 /* CnQF Layer */
317 enum cnqf_trans_priority {
318 	CNQF_TRANSITION_TO_TURBO, /* Any other mode to Turbo Mode */
319 	CNQF_TRANSITION_FROM_BALANCE_TO_PERFORMANCE, /* quiet/balance to Performance Mode */
320 	CNQF_TRANSITION_FROM_QUIET_TO_BALANCE, /* Quiet Mode to Balance Mode */
321 	CNQF_TRANSITION_TO_QUIET, /* Any other mode to Quiet Mode */
322 	CNQF_TRANSITION_FROM_PERFORMANCE_TO_BALANCE, /* Performance/Turbo to Balance Mode */
323 	CNQF_TRANSITION_FROM_TURBO_TO_PERFORMANCE, /* Turbo mode to Performance Mode */
324 	CNQF_TRANSITION_MAX,
325 };
326 
327 enum cnqf_mode {
328 	CNQF_MODE_QUIET,
329 	CNQF_MODE_BALANCE,
330 	CNQF_MODE_PERFORMANCE,
331 	CNQF_MODE_TURBO,
332 	CNQF_MODE_MAX,
333 };
334 
335 enum apmf_cnqf_pos {
336 	APMF_CNQF_TURBO,
337 	APMF_CNQF_PERFORMANCE,
338 	APMF_CNQF_BALANCE,
339 	APMF_CNQF_QUIET,
340 	APMF_CNQF_MAX,
341 };
342 
343 struct cnqf_mode_settings {
344 	struct power_table_control power_control;
345 	struct fan_table_control fan_control;
346 	u32 power_floor;
347 };
348 
349 struct cnqf_tran_params {
350 	u32 time_constant; /* minimum time required to switch to next mode */
351 	u32 power_threshold;
352 	u32 timer; /* elapsed time. if timer > timethreshold, it will move to next mode */
353 	u32 total_power;
354 	u32 count;
355 	bool priority;
356 	bool shifting_up;
357 	enum cnqf_mode target_mode;
358 };
359 
360 struct cnqf_config {
361 	struct cnqf_tran_params trans_param[POWER_SOURCE_MAX][CNQF_TRANSITION_MAX];
362 	struct cnqf_mode_settings mode_set[POWER_SOURCE_MAX][CNQF_MODE_MAX];
363 	struct power_table_control defaults;
364 	enum cnqf_mode current_mode;
365 	u32 power_src;
366 	u32 avg_power;
367 };
368 
369 struct apmf_cnqf_power_set {
370 	u32 pfloor;
371 	u32 fppt;
372 	u32 sppt;
373 	u32 sppt_apu_only;
374 	u32 spl;
375 	u32 stt_min_limit;
376 	u8 stt_skintemp[STT_TEMP_COUNT];
377 	u32 fan_id;
378 } __packed;
379 
380 struct apmf_dyn_slider_output {
381 	u16 size;
382 	u16 flags;
383 	u32 t_perf_to_turbo;
384 	u32 t_balanced_to_perf;
385 	u32 t_quiet_to_balanced;
386 	u32 t_balanced_to_quiet;
387 	u32 t_perf_to_balanced;
388 	u32 t_turbo_to_perf;
389 	struct apmf_cnqf_power_set ps[APMF_CNQF_MAX];
390 } __packed;
391 
392 /* Core Layer */
393 int apmf_acpi_init(struct amd_pmf_dev *pmf_dev);
394 void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev);
395 int is_apmf_func_supported(struct amd_pmf_dev *pdev, unsigned long index);
396 int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32 *data);
397 int amd_pmf_init_metrics_table(struct amd_pmf_dev *dev);
398 int amd_pmf_get_power_source(void);
399 int apmf_install_handler(struct amd_pmf_dev *pmf_dev);
400 int apmf_os_power_slider_update(struct amd_pmf_dev *dev, u8 flag);
401 
402 /* SPS Layer */
403 int amd_pmf_get_pprof_modes(struct amd_pmf_dev *pmf);
404 void amd_pmf_update_slider(struct amd_pmf_dev *dev, bool op, int idx,
405 			   struct amd_pmf_static_slider_granular *table);
406 int amd_pmf_init_sps(struct amd_pmf_dev *dev);
407 void amd_pmf_deinit_sps(struct amd_pmf_dev *dev);
408 int apmf_get_static_slider_granular(struct amd_pmf_dev *pdev,
409 				    struct apmf_static_slider_granular_output *output);
410 bool is_pprof_balanced(struct amd_pmf_dev *pmf);
411 int amd_pmf_power_slider_update_event(struct amd_pmf_dev *dev);
412 
413 
414 int apmf_update_fan_idx(struct amd_pmf_dev *pdev, bool manual, u32 idx);
415 int amd_pmf_set_sps_power_limits(struct amd_pmf_dev *pmf);
416 
417 /* Auto Mode Layer */
418 int apmf_get_auto_mode_def(struct amd_pmf_dev *pdev, struct apmf_auto_mode *data);
419 void amd_pmf_init_auto_mode(struct amd_pmf_dev *dev);
420 void amd_pmf_deinit_auto_mode(struct amd_pmf_dev *dev);
421 void amd_pmf_trans_automode(struct amd_pmf_dev *dev, int socket_power, ktime_t time_elapsed_ms);
422 int apmf_get_sbios_requests(struct amd_pmf_dev *pdev, struct apmf_sbios_req *req);
423 
424 void amd_pmf_update_2_cql(struct amd_pmf_dev *dev, bool is_cql_event);
425 int amd_pmf_reset_amt(struct amd_pmf_dev *dev);
426 void amd_pmf_handle_amt(struct amd_pmf_dev *dev);
427 
428 /* CnQF Layer */
429 int apmf_get_dyn_slider_def_ac(struct amd_pmf_dev *pdev, struct apmf_dyn_slider_output *data);
430 int apmf_get_dyn_slider_def_dc(struct amd_pmf_dev *pdev, struct apmf_dyn_slider_output *data);
431 int amd_pmf_init_cnqf(struct amd_pmf_dev *dev);
432 void amd_pmf_deinit_cnqf(struct amd_pmf_dev *dev);
433 int amd_pmf_trans_cnqf(struct amd_pmf_dev *dev, int socket_power, ktime_t time_lapsed_ms);
434 extern const struct attribute_group cnqf_feature_attribute_group;
435 
436 #endif /* PMF_H */
437