1 /* SPDX-License-Identifier: GPL-2.0 */
3 * AMD Platform Management Framework Driver
5 * Copyright (c) 2022, Advanced Micro Devices, Inc.
14 #include <linux/acpi.h>
15 #include <linux/input.h>
16 #include <linux/platform_profile.h>
18 #define POLICY_BUF_MAX_SZ 0x4b000
19 #define POLICY_SIGN_COOKIE 0x31535024
20 #define POLICY_COOKIE_OFFSET 0x10
22 struct cookie_header {
28 #define APMF_FUNC_VERIFY_INTERFACE 0
29 #define APMF_FUNC_GET_SYS_PARAMS 1
30 #define APMF_FUNC_SBIOS_REQUESTS 2
31 #define APMF_FUNC_SBIOS_HEARTBEAT 4
32 #define APMF_FUNC_AUTO_MODE 5
33 #define APMF_FUNC_SET_FAN_IDX 7
34 #define APMF_FUNC_OS_POWER_SLIDER_UPDATE 8
35 #define APMF_FUNC_STATIC_SLIDER_GRANULAR 9
36 #define APMF_FUNC_DYN_SLIDER_AC 11
37 #define APMF_FUNC_DYN_SLIDER_DC 12
38 #define APMF_FUNC_SBIOS_HEARTBEAT_V2 16
40 /* Message Definitions */
41 #define SET_SPL 0x03 /* SPL: Sustained Power Limit */
42 #define SET_SPPT 0x05 /* SPPT: Slow Package Power Tracking */
43 #define SET_FPPT 0x07 /* FPPT: Fast Package Power Tracking */
47 #define SET_DRAM_ADDR_HIGH 0x14
48 #define SET_DRAM_ADDR_LOW 0x15
49 #define SET_TRANSFER_TABLE 0x16
50 #define SET_STT_MIN_LIMIT 0x18 /* STT: Skin Temperature Tracking */
51 #define SET_STT_LIMIT_APU 0x19
52 #define SET_STT_LIMIT_HS2 0x1A
53 #define SET_SPPT_APU_ONLY 0x1D
54 #define GET_SPPT_APU_ONLY 0x1E
55 #define GET_STT_MIN_LIMIT 0x1F
56 #define GET_STT_LIMIT_APU 0x20
57 #define GET_STT_LIMIT_HS2 0x21
58 #define SET_P3T 0x23 /* P3T: Peak Package Power Limit */
59 #define SET_PMF_PPT 0x25
60 #define SET_PMF_PPT_APU_ONLY 0x26
62 /* OS slider update notification */
63 #define DC_BEST_PERF 0
64 #define DC_BETTER_PERF 1
65 #define DC_BATTERY_SAVER 3
66 #define AC_BEST_PERF 4
67 #define AC_BETTER_PERF 5
68 #define AC_BETTER_BATTERY 6
70 /* Fan Index for Auto Mode */
71 #define FAN_INDEX_AUTO 0xFFFFFFFF
74 #define AVG_SAMPLE_SIZE 3
77 #define PMF_POLICY_SPL 2
78 #define PMF_POLICY_SPPT 3
79 #define PMF_POLICY_FPPT 4
80 #define PMF_POLICY_SPPT_APU_ONLY 5
81 #define PMF_POLICY_STT_MIN 6
82 #define PMF_POLICY_STT_SKINTEMP_APU 7
83 #define PMF_POLICY_STT_SKINTEMP_HS2 8
84 #define PMF_POLICY_SYSTEM_STATE 9
85 #define PMF_POLICY_P3T 38
88 #define PMF_TA_IF_VERSION_MAJOR 1
89 #define TA_PMF_ACTION_MAX 32
90 #define TA_PMF_UNDO_MAX 8
91 #define TA_OUTPUT_RESERVED_MEM 906
92 #define MAX_OPERATION_PARAMS 4
97 #define APTS_MAX_STATES 16
99 /* APTS PMF BIOS Interface */
100 struct amd_pmf_apts_output {
104 u32 ppt_pmf_apu_only;
106 u8 stt_skin_temp_limit_apu;
107 u8 stt_skin_temp_limit_hs2;
110 struct amd_pmf_apts_granular_output {
112 struct amd_pmf_apts_output val;
115 struct amd_pmf_apts_granular {
117 struct amd_pmf_apts_output val[APTS_MAX_STATES];
120 struct sbios_hb_event_v2 {
135 /* AMD PMF BIOS interfaces */
136 struct apmf_verify_interface {
139 u32 notification_mask;
140 u32 supported_functions;
143 struct apmf_system_params {
151 struct apmf_sbios_req {
166 struct apmf_sbios_req_v2 {
171 u32 ppt_pmf_apu_only;
175 u32 custom_policy[10];
178 struct apmf_fan_idx {
184 struct smu_pmf_metrics {
185 u16 gfxclk_freq; /* in MHz */
186 u16 socclk_freq; /* in MHz */
187 u16 vclk_freq; /* in MHz */
188 u16 dclk_freq; /* in MHz */
189 u16 memclk_freq; /* in MHz */
191 u16 gfx_activity; /* in Centi */
192 u16 uvd_activity; /* in Centi */
193 u16 voltage[2]; /* in mV */
194 u16 currents[2]; /* in mA */
195 u16 power[2];/* in mW */
196 u16 core_freq[8]; /* in MHz */
197 u16 core_power[8]; /* in mW */
198 u16 core_temp[8]; /* in centi-Celsius */
199 u16 l3_freq; /* in MHz */
200 u16 l3_temp; /* in centi-Celsius */
201 u16 gfx_temp; /* in centi-Celsius */
202 u16 soc_temp; /* in centi-Celsius */
203 u16 throttler_status;
204 u16 current_socketpower; /* in mW */
205 u16 stapm_orig_limit; /* in W */
206 u16 stapm_cur_limit; /* in W */
207 u32 apu_power; /* in mW */
208 u32 dgpu_power; /* in mW */
209 u16 vdd_tdc_val; /* in mA */
210 u16 soc_tdc_val; /* in mA */
211 u16 vdd_edc_val; /* in mA */
212 u16 soc_edcv_al; /* in mA */
213 u16 infra_cpu_maxfreq; /* in MHz */
214 u16 infra_gfx_maxfreq; /* in MHz */
215 u16 skin_temp; /* in centi-Celsius */
217 u16 curtemp; /* in centi-Celsius */
218 u16 filter_alpha_value;
219 u16 avg_gfx_clkfrequency;
220 u16 avg_fclk_frequency;
221 u16 avg_gfx_activity;
222 u16 avg_socclk_frequency;
223 u16 avg_vclk_frequency;
224 u16 avg_vcn_activity;
227 u16 avg_socket_power;
228 u16 avg_core_power[2];
229 u16 avg_core_c0residency[16];
234 enum amd_stt_skin_temp {
252 POWER_MODE_PERFORMANCE,
253 POWER_MODE_BALANCED_POWER,
254 POWER_MODE_POWER_SAVER,
258 enum power_modes_v2 {
259 POWER_MODE_BEST_PERFORMANCE,
261 POWER_MODE_BEST_POWER_EFFICIENCY,
262 POWER_MODE_ENERGY_SAVE,
267 void __iomem *regbase;
268 void __iomem *smu_virt_addr;
273 struct mutex lock; /* protects the PMF interface */
275 enum platform_profile_option current_profile;
276 struct platform_profile_handler pprof;
277 struct dentry *dbgfs_dir;
278 int hb_interval; /* SBIOS heartbeat interval */
279 struct delayed_work heart_beat;
280 struct smu_pmf_metrics m_table;
281 struct delayed_work work_buffer;
283 int socket_power_history[AVG_SAMPLE_SIZE];
284 int socket_power_history_idx;
286 struct mutex update_mutex; /* protects race between ACPI handler and metrics thread */
289 struct notifier_block pwr_src_notifier;
290 /* Smart PC solution builder */
291 struct dentry *esbin;
292 unsigned char *policy_buf;
294 struct tee_context *tee_ctx;
295 struct tee_shm *fw_shm_pool;
298 struct delayed_work pb_work;
299 struct pmf_action_table *prev_data;
301 void __iomem *policy_base;
302 bool smart_pc_enabled;
304 struct input_dev *pmf_idev;
307 struct apmf_sps_prop_granular_v2 {
308 u8 power_states[POWER_SOURCE_MAX][POWER_MODE_V2_MAX];
311 struct apmf_sps_prop_granular {
317 u8 stt_skin_temp[STT_TEMP_COUNT];
322 struct apmf_static_slider_granular_output {
324 struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX * POWER_MODE_MAX];
327 struct amd_pmf_static_slider_granular {
329 struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX][POWER_MODE_MAX];
332 struct apmf_static_slider_granular_output_v2 {
334 struct apmf_sps_prop_granular_v2 sps_idx;
337 struct amd_pmf_static_slider_granular_v2 {
339 struct apmf_sps_prop_granular_v2 sps_idx;
342 struct os_power_slider {
347 struct fan_table_control {
349 unsigned long fan_id;
352 struct power_table_control {
358 u32 stt_skin_temp[STT_TEMP_COUNT];
362 /* Auto Mode Layer */
363 enum auto_mode_transition_priority {
364 AUTO_TRANSITION_TO_PERFORMANCE, /* Any other mode to Performance Mode */
365 AUTO_TRANSITION_FROM_QUIET_TO_BALANCE, /* Quiet Mode to Balance Mode */
366 AUTO_TRANSITION_TO_QUIET, /* Any other mode to Quiet Mode */
367 AUTO_TRANSITION_FROM_PERFORMANCE_TO_BALANCE, /* Performance Mode to Balance Mode */
371 enum auto_mode_mode {
374 AUTO_PERFORMANCE_ON_LAP,
379 struct auto_mode_trans_params {
380 u32 time_constant; /* minimum time required to switch to next mode */
381 u32 power_delta; /* delta power to shift mode */
383 u32 timer; /* elapsed time. if timer > TimeThreshold, it will move to next mode */
385 enum auto_mode_mode target_mode;
389 struct auto_mode_mode_settings {
390 struct power_table_control power_control;
391 struct fan_table_control fan_control;
395 struct auto_mode_mode_config {
396 struct auto_mode_trans_params transition[AUTO_TRANSITION_MAX];
397 struct auto_mode_mode_settings mode_set[AUTO_MODE_MAX];
398 enum auto_mode_mode current_mode;
401 struct apmf_auto_mode {
404 u32 balanced_to_perf;
405 u32 perf_to_balanced;
406 u32 quiet_to_balanced;
407 u32 balanced_to_quiet;
412 /* Power delta for mode change */
413 u32 pd_balanced_to_perf;
414 u32 pd_perf_to_balanced;
415 u32 pd_quiet_to_balanced;
416 u32 pd_balanced_to_quiet;
417 /* skin temperature limits */
418 u8 stt_apu_perf_on_lap; /* CQL ON */
419 u8 stt_hs2_perf_on_lap; /* CQL ON */
426 u32 stt_min_limit_perf_on_lap; /* CQL ON */
427 u32 stt_min_limit_perf;
428 u32 stt_min_limit_balanced;
429 u32 stt_min_limit_quiet;
431 u32 fppt_perf_on_lap; /* CQL ON */
432 u32 sppt_perf_on_lap; /* CQL ON */
433 u32 spl_perf_on_lap; /* CQL ON */
434 u32 sppt_apu_only_perf_on_lap; /* CQL ON */
438 u32 sppt_apu_only_perf;
442 u32 sppt_apu_only_balanced;
446 u32 sppt_apu_only_quiet;
454 enum cnqf_trans_priority {
455 CNQF_TRANSITION_TO_TURBO, /* Any other mode to Turbo Mode */
456 CNQF_TRANSITION_FROM_BALANCE_TO_PERFORMANCE, /* quiet/balance to Performance Mode */
457 CNQF_TRANSITION_FROM_QUIET_TO_BALANCE, /* Quiet Mode to Balance Mode */
458 CNQF_TRANSITION_TO_QUIET, /* Any other mode to Quiet Mode */
459 CNQF_TRANSITION_FROM_PERFORMANCE_TO_BALANCE, /* Performance/Turbo to Balance Mode */
460 CNQF_TRANSITION_FROM_TURBO_TO_PERFORMANCE, /* Turbo mode to Performance Mode */
467 CNQF_MODE_PERFORMANCE,
474 APMF_CNQF_PERFORMANCE,
480 struct cnqf_mode_settings {
481 struct power_table_control power_control;
482 struct fan_table_control fan_control;
486 struct cnqf_tran_params {
487 u32 time_constant; /* minimum time required to switch to next mode */
489 u32 timer; /* elapsed time. if timer > timethreshold, it will move to next mode */
494 enum cnqf_mode target_mode;
498 struct cnqf_tran_params trans_param[POWER_SOURCE_MAX][CNQF_TRANSITION_MAX];
499 struct cnqf_mode_settings mode_set[POWER_SOURCE_MAX][CNQF_MODE_MAX];
500 struct power_table_control defaults;
501 enum cnqf_mode current_mode;
506 struct apmf_cnqf_power_set {
513 u8 stt_skintemp[STT_TEMP_COUNT];
517 struct apmf_dyn_slider_output {
521 u32 t_balanced_to_perf;
522 u32 t_quiet_to_balanced;
523 u32 t_balanced_to_quiet;
524 u32 t_perf_to_balanced;
526 struct apmf_cnqf_power_set ps[APMF_CNQF_MAX];
529 /* Smart PC - TA internals */
533 SYSTEM_STATE_SCREEN_LOCK,
540 TA_BETTER_PERFORMANCE,
545 /* Command ids for TA communication */
546 enum ta_pmf_command {
547 TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE,
548 TA_PMF_COMMAND_POLICY_BUILDER_ENACT_POLICIES,
551 enum ta_pmf_error_type {
553 TA_PMF_ERROR_TYPE_GENERIC,
554 TA_PMF_ERROR_TYPE_CRYPTO,
555 TA_PMF_ERROR_TYPE_CRYPTO_VALIDATE,
556 TA_PMF_ERROR_TYPE_CRYPTO_VERIFY_OEM,
557 TA_PMF_ERROR_TYPE_POLICY_BUILDER,
558 TA_PMF_ERROR_TYPE_PB_CONVERT,
559 TA_PMF_ERROR_TYPE_PB_SETUP,
560 TA_PMF_ERROR_TYPE_PB_ENACT,
561 TA_PMF_ERROR_TYPE_ASD_GET_DEVICE_INFO,
562 TA_PMF_ERROR_TYPE_ASD_GET_DEVICE_PCIE_INFO,
563 TA_PMF_ERROR_TYPE_SYS_DRV_FW_VALIDATION,
564 TA_PMF_ERROR_TYPE_MAX,
567 struct pmf_action_table {
568 enum system_state system_state;
570 u32 sppt; /* in mW */
571 u32 sppt_apuonly; /* in mW */
572 u32 fppt; /* in mW */
573 u32 stt_minlimit; /* in mW */
574 u32 stt_skintemp_apu; /* in C */
575 u32 stt_skintemp_hs2; /* in C */
576 u32 p3t_limit; /* in mW */
579 /* Input conditions */
580 struct ta_pmf_condition_info {
590 u32 full_charge_capacity;
595 u32 skin_temperature;
611 struct ta_pmf_load_policy_table {
613 u8 table[POLICY_BUF_MAX_SZ];
616 /* TA initialization params */
617 struct ta_pmf_init_table {
618 u32 frequency; /* SMU sampling frequency */
621 bool metadata_macrocheck;
622 struct ta_pmf_load_policy_table policies_table;
625 /* Everything the TA needs to Enact Policies */
626 struct ta_pmf_enact_table {
627 struct ta_pmf_condition_info ev_info;
631 struct ta_pmf_action {
636 /* Output actions from TA */
637 struct ta_pmf_enact_result {
639 struct ta_pmf_action actions_list[TA_PMF_ACTION_MAX];
641 struct ta_pmf_action undo_list[TA_PMF_UNDO_MAX];
645 struct ta_pmf_enact_table enact_table;
646 struct ta_pmf_init_table init_table;
649 union ta_pmf_output {
650 struct ta_pmf_enact_result policy_apply_table;
651 u32 rsvd[TA_OUTPUT_RESERVED_MEM];
654 struct ta_pmf_shared_memory {
659 union ta_pmf_output pmf_output;
660 union ta_pmf_input pmf_input;
664 int apmf_acpi_init(struct amd_pmf_dev *pmf_dev);
665 void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev);
666 int is_apmf_func_supported(struct amd_pmf_dev *pdev, unsigned long index);
667 int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32 *data);
668 int amd_pmf_init_metrics_table(struct amd_pmf_dev *dev);
669 int amd_pmf_get_power_source(void);
670 int apmf_install_handler(struct amd_pmf_dev *pmf_dev);
671 int apmf_os_power_slider_update(struct amd_pmf_dev *dev, u8 flag);
672 int amd_pmf_set_dram_addr(struct amd_pmf_dev *dev, bool alloc_buffer);
673 int amd_pmf_notify_sbios_heartbeat_event_v2(struct amd_pmf_dev *dev, u8 flag);
676 int amd_pmf_get_pprof_modes(struct amd_pmf_dev *pmf);
677 void amd_pmf_update_slider(struct amd_pmf_dev *dev, bool op, int idx,
678 struct amd_pmf_static_slider_granular *table);
679 int amd_pmf_init_sps(struct amd_pmf_dev *dev);
680 void amd_pmf_deinit_sps(struct amd_pmf_dev *dev);
681 int apmf_get_static_slider_granular(struct amd_pmf_dev *pdev,
682 struct apmf_static_slider_granular_output *output);
683 bool is_pprof_balanced(struct amd_pmf_dev *pmf);
684 int amd_pmf_power_slider_update_event(struct amd_pmf_dev *dev);
685 const char *amd_pmf_source_as_str(unsigned int state);
687 const char *amd_pmf_source_as_str(unsigned int state);
689 int apmf_update_fan_idx(struct amd_pmf_dev *pdev, bool manual, u32 idx);
690 int amd_pmf_set_sps_power_limits(struct amd_pmf_dev *pmf);
691 int apmf_get_static_slider_granular_v2(struct amd_pmf_dev *dev,
692 struct apmf_static_slider_granular_output_v2 *data);
693 int apts_get_static_slider_granular_v2(struct amd_pmf_dev *pdev,
694 struct amd_pmf_apts_granular_output *data, u32 apts_idx);
696 /* Auto Mode Layer */
697 int apmf_get_auto_mode_def(struct amd_pmf_dev *pdev, struct apmf_auto_mode *data);
698 void amd_pmf_init_auto_mode(struct amd_pmf_dev *dev);
699 void amd_pmf_deinit_auto_mode(struct amd_pmf_dev *dev);
700 void amd_pmf_trans_automode(struct amd_pmf_dev *dev, int socket_power, ktime_t time_elapsed_ms);
701 int apmf_get_sbios_requests(struct amd_pmf_dev *pdev, struct apmf_sbios_req *req);
702 int apmf_get_sbios_requests_v2(struct amd_pmf_dev *pdev, struct apmf_sbios_req_v2 *req);
704 void amd_pmf_update_2_cql(struct amd_pmf_dev *dev, bool is_cql_event);
705 int amd_pmf_reset_amt(struct amd_pmf_dev *dev);
706 void amd_pmf_handle_amt(struct amd_pmf_dev *dev);
709 int apmf_get_dyn_slider_def_ac(struct amd_pmf_dev *pdev, struct apmf_dyn_slider_output *data);
710 int apmf_get_dyn_slider_def_dc(struct amd_pmf_dev *pdev, struct apmf_dyn_slider_output *data);
711 int amd_pmf_init_cnqf(struct amd_pmf_dev *dev);
712 void amd_pmf_deinit_cnqf(struct amd_pmf_dev *dev);
713 int amd_pmf_trans_cnqf(struct amd_pmf_dev *dev, int socket_power, ktime_t time_lapsed_ms);
714 extern const struct attribute_group cnqf_feature_attribute_group;
716 /* Smart PC builder Layer */
717 int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev);
718 void amd_pmf_deinit_smart_pc(struct amd_pmf_dev *dev);
719 int apmf_check_smart_pc(struct amd_pmf_dev *pmf_dev);
721 /* Smart PC - TA interfaces */
722 void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
723 void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
725 /* Quirk infrastructure */
726 void amd_pmf_quirks_init(struct amd_pmf_dev *dev);