FILE
pmf.h
File preview with syntax highlighting.
linux-6.19.14/drivers/platform/x86/amd/pmf/pmf.h
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/input.h> 16#include <linux/platform_device.h> 17#include <linux/platform_profile.h> 18 19#define POLICY_BUF_MAX_SZ 0x4b000 20#define POLICY_SIGN_COOKIE 0x31535024 21#define POLICY_COOKIE_OFFSET 0x10 22 23/* List of supported CPU ids */ 24#define AMD_CPU_ID_RMB 0x14b5 25#define AMD_CPU_ID_PS 0x14e8 26#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507 27#define PCI_DEVICE_ID_AMD_1AH_M60H_ROOT 0x1122 28 29struct cookie_header { 30 u32 sign; 31 u32 length; 32} __packed; 33 34/* APMF Functions */ 35#define APMF_FUNC_VERIFY_INTERFACE 0 36#define APMF_FUNC_GET_SYS_PARAMS 1 37#define APMF_FUNC_SBIOS_REQUESTS 2 38#define APMF_FUNC_SBIOS_HEARTBEAT 4 39#define APMF_FUNC_AUTO_MODE 5 40#define APMF_FUNC_SET_FAN_IDX 7 41#define APMF_FUNC_OS_POWER_SLIDER_UPDATE 8 42#define APMF_FUNC_STATIC_SLIDER_GRANULAR 9 43#define APMF_FUNC_DYN_SLIDER_AC 11 44#define APMF_FUNC_DYN_SLIDER_DC 12 45#define APMF_FUNC_NOTIFY_SMART_PC_UPDATES 14 46#define APMF_FUNC_SBIOS_HEARTBEAT_V2 16 47 48/* Message Definitions */ 49#define SET_SPL 0x03 /* SPL: Sustained Power Limit */ 50#define SET_SPPT 0x05 /* SPPT: Slow Package Power Tracking */ 51#define SET_FPPT 0x07 /* FPPT: Fast Package Power Tracking */ 52#define GET_SPL 0x0B 53#define GET_SPPT 0x0D 54#define GET_FPPT 0x0F 55#define SET_DRAM_ADDR_HIGH 0x14 56#define SET_DRAM_ADDR_LOW 0x15 57#define SET_TRANSFER_TABLE 0x16 58#define SET_STT_MIN_LIMIT 0x18 /* STT: Skin Temperature Tracking */ 59#define SET_STT_LIMIT_APU 0x19 60#define SET_STT_LIMIT_HS2 0x1A 61#define SET_SPPT_APU_ONLY 0x1D 62#define GET_SPPT_APU_ONLY 0x1E 63#define GET_STT_MIN_LIMIT 0x1F 64#define GET_STT_LIMIT_APU 0x20 65#define GET_STT_LIMIT_HS2 0x21 66#define SET_P3T 0x23 /* P3T: Peak Package Power Limit */ 67#define SET_PMF_PPT 0x25 68#define SET_PMF_PPT_APU_ONLY 0x26 69 70/* OS slider update notification */ 71#define DC_BEST_PERF 0 72#define DC_BETTER_PERF 1 73#define DC_BATTERY_SAVER 3 74#define AC_BEST_PERF 4 75#define AC_BETTER_PERF 5 76#define AC_BETTER_BATTERY 6 77 78/* Fan Index for Auto Mode */ 79#define FAN_INDEX_AUTO 0xFFFFFFFF 80 81#define ARG_NONE 0 82#define AVG_SAMPLE_SIZE 3 83 84/* Policy Actions */ 85#define PMF_POLICY_SPL 2 86#define PMF_POLICY_SPPT 3 87#define PMF_POLICY_FPPT 4 88#define PMF_POLICY_SPPT_APU_ONLY 5 89#define PMF_POLICY_STT_MIN 6 90#define PMF_POLICY_STT_SKINTEMP_APU 7 91#define PMF_POLICY_STT_SKINTEMP_HS2 8 92#define PMF_POLICY_SYSTEM_STATE 9 93#define PMF_POLICY_BIOS_OUTPUT_1 10 94#define PMF_POLICY_BIOS_OUTPUT_2 11 95#define PMF_POLICY_P3T 38 96#define PMF_POLICY_PMF_PPT 54 97#define PMF_POLICY_PMF_PPT_APU_ONLY 55 98#define PMF_POLICY_BIOS_OUTPUT_3 57 99#define PMF_POLICY_BIOS_OUTPUT_4 58 100#define PMF_POLICY_BIOS_OUTPUT_5 59 101#define PMF_POLICY_BIOS_OUTPUT_6 60 102#define PMF_POLICY_BIOS_OUTPUT_7 61 103#define PMF_POLICY_BIOS_OUTPUT_8 62 104#define PMF_POLICY_BIOS_OUTPUT_9 63 105#define PMF_POLICY_BIOS_OUTPUT_10 64 106 107/* TA macros */ 108#define PMF_TA_IF_VERSION_MAJOR 1 109#define TA_PMF_ACTION_MAX 32 110#define TA_PMF_UNDO_MAX 8 111#define TA_OUTPUT_RESERVED_MEM 922 112#define MAX_OPERATION_PARAMS 4 113 114#define TA_ERROR_CRYPTO_INVALID_PARAM 0x20002 115#define TA_ERROR_CRYPTO_BIN_TOO_LARGE 0x2000d 116 117#define PMF_IF_V1 1 118#define PMF_IF_V2 2 119 120#define APTS_MAX_STATES 16 121#define CUSTOM_BIOS_INPUT_BITS GENMASK(16, 7) 122#define BIOS_INPUTS_MAX 10 123 124/* amd_pmf_send_cmd() set/get */ 125#define SET_CMD false 126#define GET_CMD true 127 128#define METRICS_TABLE_ID 7 129 130typedef void (*apmf_event_handler_t)(acpi_handle handle, u32 event, void *data); 131 132static const uuid_t amd_pmf_ta_uuid[] __used = { UUID_INIT(0xd9b39bf2, 0x66bd, 0x4154, 0xaf, 0xb8, 133 0x8a, 0xcc, 0x2b, 0x2b, 0x60, 0xd6), 134 UUID_INIT(0x6fd93b77, 0x3fb8, 0x524d, 0xb1, 0x2d, 135 0xc5, 0x29, 0xb1, 0x3d, 0x85, 0x43), 136 }; 137 138/* APTS PMF BIOS Interface */ 139struct amd_pmf_apts_output { 140 u16 table_version; 141 u32 fan_table_idx; 142 u32 pmf_ppt; 143 u32 ppt_pmf_apu_only; 144 u32 stt_min_limit; 145 u8 stt_skin_temp_limit_apu; 146 u8 stt_skin_temp_limit_hs2; 147} __packed; 148 149struct amd_pmf_apts_granular_output { 150 u16 size; 151 struct amd_pmf_apts_output val; 152} __packed; 153 154struct amd_pmf_apts_granular { 155 u16 size; 156 struct amd_pmf_apts_output val[APTS_MAX_STATES]; 157}; 158 159struct sbios_hb_event_v2 { 160 u16 size; 161 u8 load; 162 u8 unload; 163 u8 suspend; 164 u8 resume; 165} __packed; 166 167enum sbios_hb_v2 { 168 ON_LOAD, 169 ON_UNLOAD, 170 ON_SUSPEND, 171 ON_RESUME, 172}; 173 174/* AMD PMF BIOS interfaces */ 175struct apmf_verify_interface { 176 u16 size; 177 u16 version; 178 u32 notification_mask; 179 u32 supported_functions; 180} __packed; 181 182struct apmf_system_params { 183 u16 size; 184 u32 valid_mask; 185 u32 flags; 186 u8 command_code; 187 u32 heartbeat_int; 188} __packed; 189 190struct apmf_sbios_req { 191 u16 size; 192 u32 pending_req; 193 u8 rsd; 194 u8 cql_event; 195 u8 amt_event; 196 u32 fppt; 197 u32 sppt; 198 u32 fppt_apu_only; 199 u32 spl; 200 u32 stt_min_limit; 201 u8 skin_temp_apu; 202 u8 skin_temp_hs2; 203} __packed; 204 205/* As per APMF spec 1.3 */ 206struct apmf_sbios_req_v1 { 207 u16 size; 208 u32 pending_req; 209 u8 rsvd; 210 u8 cql_event; 211 u8 amt_event; 212 u32 fppt; 213 u32 sppt; 214 u32 sppt_apu_only; 215 u32 spl; 216 u32 stt_min_limit; 217 u8 skin_temp_apu; 218 u8 skin_temp_hs2; 219 u8 enable_cnqf; 220 u32 custom_policy[BIOS_INPUTS_MAX]; 221} __packed; 222 223struct apmf_sbios_req_v2 { 224 u16 size; 225 u32 pending_req; 226 u8 rsd; 227 u32 ppt_pmf; 228 u32 ppt_pmf_apu_only; 229 u32 stt_min_limit; 230 u8 skin_temp_apu; 231 u8 skin_temp_hs2; 232 u32 custom_policy[BIOS_INPUTS_MAX]; 233} __packed; 234 235struct apmf_fan_idx { 236 u16 size; 237 u8 fan_ctl_mode; 238 u32 fan_ctl_idx; 239} __packed; 240 241struct smu_pmf_metrics_v2 { 242 u16 core_frequency[16]; /* MHz */ 243 u16 core_power[16]; /* mW */ 244 u16 core_temp[16]; /* centi-C */ 245 u16 gfx_temp; /* centi-C */ 246 u16 soc_temp; /* centi-C */ 247 u16 stapm_opn_limit; /* mW */ 248 u16 stapm_cur_limit; /* mW */ 249 u16 infra_cpu_maxfreq; /* MHz */ 250 u16 infra_gfx_maxfreq; /* MHz */ 251 u16 skin_temp; /* centi-C */ 252 u16 gfxclk_freq; /* MHz */ 253 u16 fclk_freq; /* MHz */ 254 u16 gfx_activity; /* GFX busy % [0-100] */ 255 u16 socclk_freq; /* MHz */ 256 u16 vclk_freq; /* MHz */ 257 u16 vcn_activity; /* VCN busy % [0-100] */ 258 u16 vpeclk_freq; /* MHz */ 259 u16 npuclk_freq; /* MHz */ 260 u16 npu_busy[8]; /* NPU busy % [0-100] */ 261 u16 dram_reads; /* MB/sec */ 262 u16 dram_writes; /* MB/sec */ 263 u16 core_c0residency[16]; /* C0 residency % [0-100] */ 264 u16 npu_power; /* mW */ 265 u32 apu_power; /* mW */ 266 u32 gfx_power; /* mW */ 267 u32 dgpu_power; /* mW */ 268 u32 socket_power; /* mW */ 269 u32 all_core_power; /* mW */ 270 u32 filter_alpha_value; /* time constant [us] */ 271 u32 metrics_counter; 272 u16 memclk_freq; /* MHz */ 273 u16 mpnpuclk_freq; /* MHz */ 274 u16 npu_reads; /* MB/sec */ 275 u16 npu_writes; /* MB/sec */ 276 u32 throttle_residency_prochot; 277 u32 throttle_residency_spl; 278 u32 throttle_residency_fppt; 279 u32 throttle_residency_sppt; 280 u32 throttle_residency_thm_core; 281 u32 throttle_residency_thm_gfx; 282 u32 throttle_residency_thm_soc; 283 u16 psys; 284 u16 spare1; 285 u32 spare[6]; 286} __packed; 287 288struct smu_pmf_metrics { 289 u16 gfxclk_freq; /* in MHz */ 290 u16 socclk_freq; /* in MHz */ 291 u16 vclk_freq; /* in MHz */ 292 u16 dclk_freq; /* in MHz */ 293 u16 memclk_freq; /* in MHz */ 294 u16 spare; 295 u16 gfx_activity; /* in Centi */ 296 u16 uvd_activity; /* in Centi */ 297 u16 voltage[2]; /* in mV */ 298 u16 currents[2]; /* in mA */ 299 u16 power[2];/* in mW */ 300 u16 core_freq[8]; /* in MHz */ 301 u16 core_power[8]; /* in mW */ 302 u16 core_temp[8]; /* in centi-Celsius */ 303 u16 l3_freq; /* in MHz */ 304 u16 l3_temp; /* in centi-Celsius */ 305 u16 gfx_temp; /* in centi-Celsius */ 306 u16 soc_temp; /* in centi-Celsius */ 307 u16 throttler_status; 308 u16 current_socketpower; /* in mW */ 309 u16 stapm_orig_limit; /* in W */ 310 u16 stapm_cur_limit; /* in W */ 311 u32 apu_power; /* in mW */ 312 u32 dgpu_power; /* in mW */ 313 u16 vdd_tdc_val; /* in mA */ 314 u16 soc_tdc_val; /* in mA */ 315 u16 vdd_edc_val; /* in mA */ 316 u16 soc_edcv_al; /* in mA */ 317 u16 infra_cpu_maxfreq; /* in MHz */ 318 u16 infra_gfx_maxfreq; /* in MHz */ 319 u16 skin_temp; /* in centi-Celsius */ 320 u16 device_state; 321 u16 curtemp; /* in centi-Celsius */ 322 u16 filter_alpha_value; 323 u16 avg_gfx_clkfrequency; 324 u16 avg_fclk_frequency; 325 u16 avg_gfx_activity; 326 u16 avg_socclk_frequency; 327 u16 avg_vclk_frequency; 328 u16 avg_vcn_activity; 329 u16 avg_dram_reads; 330 u16 avg_dram_writes; 331 u16 avg_socket_power; 332 u16 avg_core_power[2]; 333 u16 avg_core_c0residency[16]; 334 u16 spare1; 335 u32 metrics_counter; 336} __packed; 337 338enum amd_stt_skin_temp { 339 STT_TEMP_APU, 340 STT_TEMP_HS2, 341 STT_TEMP_COUNT, 342}; 343 344enum amd_slider_op { 345 SLIDER_OP_GET, 346 SLIDER_OP_SET, 347}; 348 349enum power_source { 350 POWER_SOURCE_AC, 351 POWER_SOURCE_DC, 352 POWER_SOURCE_MAX, 353}; 354 355enum power_modes { 356 POWER_MODE_PERFORMANCE, 357 POWER_MODE_BALANCED_POWER, 358 POWER_MODE_POWER_SAVER, 359 POWER_MODE_MAX, 360}; 361 362enum power_modes_v2 { 363 POWER_MODE_BEST_PERFORMANCE, 364 POWER_MODE_BALANCED, 365 POWER_MODE_BEST_POWER_EFFICIENCY, 366 POWER_MODE_ENERGY_SAVE, 367 POWER_MODE_V2_MAX, 368}; 369 370struct pmf_bios_inputs_prev { 371 u32 custom_bios_inputs[BIOS_INPUTS_MAX]; 372}; 373 374struct amd_pmf_dev { 375 void __iomem *regbase; 376 void __iomem *smu_virt_addr; 377 void *buf; 378 u32 base_addr; 379 u32 cpu_id; 380 struct device *dev; 381 struct mutex lock; /* protects the PMF interface */ 382 u32 supported_func; 383 enum platform_profile_option current_profile; 384 struct device *ppdev; /* platform profile class device */ 385 struct dentry *dbgfs_dir; 386 int hb_interval; /* SBIOS heartbeat interval */ 387 struct delayed_work heart_beat; 388 struct smu_pmf_metrics m_table; 389 struct smu_pmf_metrics_v2 m_table_v2; 390 struct delayed_work work_buffer; 391 ktime_t start_time; 392 int socket_power_history[AVG_SAMPLE_SIZE]; 393 int socket_power_history_idx; 394 bool amt_enabled; 395 struct mutex update_mutex; /* protects race between ACPI handler and metrics thread */ 396 bool cnqf_enabled; 397 bool cnqf_supported; 398 struct notifier_block pwr_src_notifier; 399 /* Smart PC solution builder */ 400 struct dentry *esbin; 401 unsigned char *policy_buf; 402 resource_size_t policy_sz; 403 struct tee_context *tee_ctx; 404 struct tee_shm *fw_shm_pool; 405 u32 session_id; 406 void *shbuf; 407 struct delayed_work pb_work; 408 struct pmf_action_table *prev_data; 409 resource_size_t policy_addr; 410 void __iomem *policy_base; 411 bool smart_pc_enabled; 412 u16 pmf_if_version; 413 struct input_dev *pmf_idev; 414 size_t mtable_size; 415 struct resource *res; 416 struct apmf_sbios_req_v2 req; /* To get custom bios pending request */ 417 struct mutex cb_mutex; 418 u32 notifications; 419 struct apmf_sbios_req_v1 req1; 420 struct pmf_bios_inputs_prev cb_prev; /* To preserve custom BIOS inputs */ 421 bool cb_flag; /* To handle first custom BIOS input */ 422}; 423 424struct apmf_sps_prop_granular_v2 { 425 u8 power_states[POWER_SOURCE_MAX][POWER_MODE_V2_MAX]; 426} __packed; 427 428struct apmf_sps_prop_granular { 429 u32 fppt; 430 u32 sppt; 431 u32 sppt_apu_only; 432 u32 spl; 433 u32 stt_min; 434 u8 stt_skin_temp[STT_TEMP_COUNT]; 435 u32 fan_id; 436} __packed; 437 438/* Static Slider */ 439struct apmf_static_slider_granular_output { 440 u16 size; 441 struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX * POWER_MODE_MAX]; 442} __packed; 443 444struct amd_pmf_static_slider_granular { 445 u16 size; 446 struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX][POWER_MODE_MAX]; 447}; 448 449struct apmf_static_slider_granular_output_v2 { 450 u16 size; 451 struct apmf_sps_prop_granular_v2 sps_idx; 452} __packed; 453 454struct amd_pmf_static_slider_granular_v2 { 455 u16 size; 456 struct apmf_sps_prop_granular_v2 sps_idx; 457}; 458 459struct os_power_slider { 460 u16 size; 461 u8 slider_event; 462} __packed; 463 464struct amd_pmf_notify_smart_pc_update { 465 u16 size; 466 u32 pending_req; 467 u32 custom_bios[BIOS_INPUTS_MAX]; 468} __packed; 469 470struct fan_table_control { 471 bool manual; 472 unsigned long fan_id; 473}; 474 475struct power_table_control { 476 u32 spl; 477 u32 sppt; 478 u32 fppt; 479 u32 sppt_apu_only; 480 u32 stt_min; 481 u32 stt_skin_temp[STT_TEMP_COUNT]; 482 u32 reserved[16]; 483}; 484 485/* Auto Mode Layer */ 486enum auto_mode_transition_priority { 487 AUTO_TRANSITION_TO_PERFORMANCE, /* Any other mode to Performance Mode */ 488 AUTO_TRANSITION_FROM_QUIET_TO_BALANCE, /* Quiet Mode to Balance Mode */ 489 AUTO_TRANSITION_TO_QUIET, /* Any other mode to Quiet Mode */ 490 AUTO_TRANSITION_FROM_PERFORMANCE_TO_BALANCE, /* Performance Mode to Balance Mode */ 491 AUTO_TRANSITION_MAX, 492}; 493 494enum auto_mode_mode { 495 AUTO_QUIET, 496 AUTO_BALANCE, 497 AUTO_PERFORMANCE_ON_LAP, 498 AUTO_PERFORMANCE, 499 AUTO_MODE_MAX, 500}; 501 502struct auto_mode_trans_params { 503 u32 time_constant; /* minimum time required to switch to next mode */ 504 u32 power_delta; /* delta power to shift mode */ 505 u32 power_threshold; 506 u32 timer; /* elapsed time. if timer > TimeThreshold, it will move to next mode */ 507 u32 applied; 508 enum auto_mode_mode target_mode; 509 u32 shifting_up; 510}; 511 512struct auto_mode_mode_settings { 513 struct power_table_control power_control; 514 struct fan_table_control fan_control; 515 u32 power_floor; 516}; 517 518struct auto_mode_mode_config { 519 struct auto_mode_trans_params transition[AUTO_TRANSITION_MAX]; 520 struct auto_mode_mode_settings mode_set[AUTO_MODE_MAX]; 521 enum auto_mode_mode current_mode; 522}; 523 524struct apmf_auto_mode { 525 u16 size; 526 /* time constant */ 527 u32 balanced_to_perf; 528 u32 perf_to_balanced; 529 u32 quiet_to_balanced; 530 u32 balanced_to_quiet; 531 /* power floor */ 532 u32 pfloor_perf; 533 u32 pfloor_balanced; 534 u32 pfloor_quiet; 535 /* Power delta for mode change */ 536 u32 pd_balanced_to_perf; 537 u32 pd_perf_to_balanced; 538 u32 pd_quiet_to_balanced; 539 u32 pd_balanced_to_quiet; 540 /* skin temperature limits */ 541 u8 stt_apu_perf_on_lap; /* CQL ON */ 542 u8 stt_hs2_perf_on_lap; /* CQL ON */ 543 u8 stt_apu_perf; 544 u8 stt_hs2_perf; 545 u8 stt_apu_balanced; 546 u8 stt_hs2_balanced; 547 u8 stt_apu_quiet; 548 u8 stt_hs2_quiet; 549 u32 stt_min_limit_perf_on_lap; /* CQL ON */ 550 u32 stt_min_limit_perf; 551 u32 stt_min_limit_balanced; 552 u32 stt_min_limit_quiet; 553 /* SPL based */ 554 u32 fppt_perf_on_lap; /* CQL ON */ 555 u32 sppt_perf_on_lap; /* CQL ON */ 556 u32 spl_perf_on_lap; /* CQL ON */ 557 u32 sppt_apu_only_perf_on_lap; /* CQL ON */ 558 u32 fppt_perf; 559 u32 sppt_perf; 560 u32 spl_perf; 561 u32 sppt_apu_only_perf; 562 u32 fppt_balanced; 563 u32 sppt_balanced; 564 u32 spl_balanced; 565 u32 sppt_apu_only_balanced; 566 u32 fppt_quiet; 567 u32 sppt_quiet; 568 u32 spl_quiet; 569 u32 sppt_apu_only_quiet; 570 /* Fan ID */ 571 u32 fan_id_perf; 572 u32 fan_id_balanced; 573 u32 fan_id_quiet; 574} __packed; 575 576/* CnQF Layer */ 577enum cnqf_trans_priority { 578 CNQF_TRANSITION_TO_TURBO, /* Any other mode to Turbo Mode */ 579 CNQF_TRANSITION_FROM_BALANCE_TO_PERFORMANCE, /* quiet/balance to Performance Mode */ 580 CNQF_TRANSITION_FROM_QUIET_TO_BALANCE, /* Quiet Mode to Balance Mode */ 581 CNQF_TRANSITION_TO_QUIET, /* Any other mode to Quiet Mode */ 582 CNQF_TRANSITION_FROM_PERFORMANCE_TO_BALANCE, /* Performance/Turbo to Balance Mode */ 583 CNQF_TRANSITION_FROM_TURBO_TO_PERFORMANCE, /* Turbo mode to Performance Mode */ 584 CNQF_TRANSITION_MAX, 585}; 586 587enum cnqf_mode { 588 CNQF_MODE_QUIET, 589 CNQF_MODE_BALANCE, 590 CNQF_MODE_PERFORMANCE, 591 CNQF_MODE_TURBO, 592 CNQF_MODE_MAX, 593}; 594 595enum apmf_cnqf_pos { 596 APMF_CNQF_TURBO, 597 APMF_CNQF_PERFORMANCE, 598 APMF_CNQF_BALANCE, 599 APMF_CNQF_QUIET, 600 APMF_CNQF_MAX, 601}; 602 603struct cnqf_mode_settings { 604 struct power_table_control power_control; 605 struct fan_table_control fan_control; 606 u32 power_floor; 607}; 608 609struct cnqf_tran_params { 610 u32 time_constant; /* minimum time required to switch to next mode */ 611 u32 power_threshold; 612 u32 timer; /* elapsed time. if timer > timethreshold, it will move to next mode */ 613 u32 total_power; 614 u32 count; 615 bool priority; 616 bool shifting_up; 617 enum cnqf_mode target_mode; 618}; 619 620struct cnqf_config { 621 struct cnqf_tran_params trans_param[POWER_SOURCE_MAX][CNQF_TRANSITION_MAX]; 622 struct cnqf_mode_settings mode_set[POWER_SOURCE_MAX][CNQF_MODE_MAX]; 623 struct power_table_control defaults; 624 enum cnqf_mode current_mode; 625 u32 power_src; 626 u32 avg_power; 627}; 628 629struct apmf_cnqf_power_set { 630 u32 pfloor; 631 u32 fppt; 632 u32 sppt; 633 u32 sppt_apu_only; 634 u32 spl; 635 u32 stt_min_limit; 636 u8 stt_skintemp[STT_TEMP_COUNT]; 637 u32 fan_id; 638} __packed; 639 640struct apmf_dyn_slider_output { 641 u16 size; 642 u16 flags; 643 u32 t_perf_to_turbo; 644 u32 t_balanced_to_perf; 645 u32 t_quiet_to_balanced; 646 u32 t_balanced_to_quiet; 647 u32 t_perf_to_balanced; 648 u32 t_turbo_to_perf; 649 struct apmf_cnqf_power_set ps[APMF_CNQF_MAX]; 650} __packed; 651 652/* Smart PC - TA internals */ 653enum system_state { 654 SYSTEM_STATE_S0i3, 655 SYSTEM_STATE_S4, 656 SYSTEM_STATE_SCREEN_LOCK, 657 SYSTEM_STATE_MAX, 658}; 659 660enum ta_slider { 661 TA_BEST_BATTERY, 662 TA_BETTER_BATTERY, 663 TA_BETTER_PERFORMANCE, 664 TA_BEST_PERFORMANCE, 665 TA_MAX, 666}; 667 668struct amd_pmf_pb_bitmap { 669 const char *name; 670 u32 bit_mask; 671}; 672 673static const struct amd_pmf_pb_bitmap custom_bios_inputs[] __used = { 674 {"NOTIFY_CUSTOM_BIOS_INPUT1", BIT(5)}, 675 {"NOTIFY_CUSTOM_BIOS_INPUT2", BIT(6)}, 676 {"NOTIFY_CUSTOM_BIOS_INPUT3", BIT(7)}, 677 {"NOTIFY_CUSTOM_BIOS_INPUT4", BIT(8)}, 678 {"NOTIFY_CUSTOM_BIOS_INPUT5", BIT(9)}, 679 {"NOTIFY_CUSTOM_BIOS_INPUT6", BIT(10)}, 680 {"NOTIFY_CUSTOM_BIOS_INPUT7", BIT(11)}, 681 {"NOTIFY_CUSTOM_BIOS_INPUT8", BIT(12)}, 682 {"NOTIFY_CUSTOM_BIOS_INPUT9", BIT(13)}, 683 {"NOTIFY_CUSTOM_BIOS_INPUT10", BIT(14)}, 684}; 685 686static const struct amd_pmf_pb_bitmap custom_bios_inputs_v1[] __used = { 687 {"NOTIFY_CUSTOM_BIOS_INPUT1", BIT(7)}, 688 {"NOTIFY_CUSTOM_BIOS_INPUT2", BIT(8)}, 689 {"NOTIFY_CUSTOM_BIOS_INPUT3", BIT(9)}, 690 {"NOTIFY_CUSTOM_BIOS_INPUT4", BIT(10)}, 691 {"NOTIFY_CUSTOM_BIOS_INPUT5", BIT(11)}, 692 {"NOTIFY_CUSTOM_BIOS_INPUT6", BIT(12)}, 693 {"NOTIFY_CUSTOM_BIOS_INPUT7", BIT(13)}, 694 {"NOTIFY_CUSTOM_BIOS_INPUT8", BIT(14)}, 695 {"NOTIFY_CUSTOM_BIOS_INPUT9", BIT(15)}, 696 {"NOTIFY_CUSTOM_BIOS_INPUT10", BIT(16)}, 697}; 698 699enum platform_type { 700 PTYPE_UNKNOWN = 0, 701 LID_CLOSE, 702 CLAMSHELL, 703 FLAT, 704 TENT, 705 STAND, 706 TABLET, 707 BOOK, 708 PRESENTATION, 709 PULL_FWD, 710 PTYPE_INVALID = 0xf, 711}; 712 713/* Command ids for TA communication */ 714enum ta_pmf_command { 715 TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE, 716 TA_PMF_COMMAND_POLICY_BUILDER_ENACT_POLICIES, 717}; 718 719enum ta_pmf_error_type { 720 TA_PMF_TYPE_SUCCESS, 721 TA_PMF_ERROR_TYPE_GENERIC, 722 TA_PMF_ERROR_TYPE_CRYPTO, 723 TA_PMF_ERROR_TYPE_CRYPTO_VALIDATE, 724 TA_PMF_ERROR_TYPE_CRYPTO_VERIFY_OEM, 725 TA_PMF_ERROR_TYPE_POLICY_BUILDER, 726 TA_PMF_ERROR_TYPE_PB_CONVERT, 727 TA_PMF_ERROR_TYPE_PB_SETUP, 728 TA_PMF_ERROR_TYPE_PB_ENACT, 729 TA_PMF_ERROR_TYPE_ASD_GET_DEVICE_INFO, 730 TA_PMF_ERROR_TYPE_ASD_GET_DEVICE_PCIE_INFO, 731 TA_PMF_ERROR_TYPE_SYS_DRV_FW_VALIDATION, 732 TA_PMF_ERROR_TYPE_MAX, 733}; 734 735struct pmf_action_table { 736 enum system_state system_state; 737 u32 spl; /* in mW */ 738 u32 sppt; /* in mW */ 739 u32 sppt_apuonly; /* in mW */ 740 u32 fppt; /* in mW */ 741 u32 stt_minlimit; /* in mW */ 742 u32 stt_skintemp_apu; /* in C */ 743 u32 stt_skintemp_hs2; /* in C */ 744 u32 p3t_limit; /* in mW */ 745 u32 pmf_ppt; /* in mW */ 746 u32 pmf_ppt_apu_only; /* in mW */ 747}; 748 749/* Input conditions */ 750struct ta_pmf_condition_info { 751 u32 power_source; 752 u32 bat_percentage; 753 u32 power_slider; 754 u32 lid_state; 755 bool user_present; 756 u32 bios_input_1[2]; 757 u32 monitor_count; 758 u32 rsvd2[2]; 759 u32 bat_design; 760 u32 full_charge_capacity; 761 int drain_rate; 762 bool user_engaged; 763 u32 device_state; 764 u32 socket_power; 765 u32 skin_temperature; 766 u32 rsvd3[2]; 767 u32 platform_type; 768 u32 rsvd3_1[2]; 769 u32 ambient_light; 770 u32 length; 771 u32 avg_c0residency; 772 u32 max_c0residency; 773 u32 s0i3_entry; 774 u32 gfx_busy; 775 u32 rsvd4[7]; 776 bool camera_state; 777 u32 workload_type; 778 u32 display_type; 779 u32 display_state; 780 u32 rsvd5_1[17]; 781 u32 bios_input_2[8]; 782 u32 rsvd5[125]; 783}; 784 785struct ta_pmf_load_policy_table { 786 u32 table_size; 787 u8 table[POLICY_BUF_MAX_SZ]; 788}; 789 790/* TA initialization params */ 791struct ta_pmf_init_table { 792 u32 frequency; /* SMU sampling frequency */ 793 bool validate; 794 bool sku_check; 795 bool metadata_macrocheck; 796 struct ta_pmf_load_policy_table policies_table; 797}; 798 799/* Everything the TA needs to Enact Policies */ 800struct ta_pmf_enact_table { 801 struct ta_pmf_condition_info ev_info; 802 u32 name; 803}; 804 805struct ta_pmf_action { 806 u32 action_index; 807 u32 value; 808 u32 spl_arg; 809}; 810 811/* Output actions from TA */ 812struct ta_pmf_enact_result { 813 u32 actions_count; 814 struct ta_pmf_action actions_list[TA_PMF_ACTION_MAX]; 815 u32 undo_count; 816 struct ta_pmf_action undo_list[TA_PMF_UNDO_MAX]; 817}; 818 819union ta_pmf_input { 820 struct ta_pmf_enact_table enact_table; 821 struct ta_pmf_init_table init_table; 822}; 823 824union ta_pmf_output { 825 struct ta_pmf_enact_result policy_apply_table; 826 u32 rsvd[TA_OUTPUT_RESERVED_MEM]; 827}; 828 829struct ta_pmf_shared_memory { 830 int command_id; 831 int resp_id; 832 u32 pmf_result; 833 u32 if_version; 834 union ta_pmf_output pmf_output; 835 union ta_pmf_input pmf_input; 836}; 837 838/* Core Layer */ 839int apmf_acpi_init(struct amd_pmf_dev *pmf_dev); 840void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev); 841int is_apmf_func_supported(struct amd_pmf_dev *pdev, unsigned long index); 842int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32 *data); 843int amd_pmf_init_metrics_table(struct amd_pmf_dev *dev); 844int amd_pmf_get_power_source(void); 845int apmf_install_handler(struct amd_pmf_dev *pmf_dev); 846int apmf_os_power_slider_update(struct amd_pmf_dev *dev, u8 flag); 847int amd_pmf_set_dram_addr(struct amd_pmf_dev *dev, bool alloc_buffer); 848int amd_pmf_notify_sbios_heartbeat_event_v2(struct amd_pmf_dev *dev, u8 flag); 849u32 fixp_q88_fromint(u32 val); 850int is_apmf_bios_input_notifications_supported(struct amd_pmf_dev *pdev); 851 852/* SPS Layer */ 853int amd_pmf_get_pprof_modes(struct amd_pmf_dev *pmf); 854void amd_pmf_update_slider(struct amd_pmf_dev *dev, bool op, int idx, 855 struct amd_pmf_static_slider_granular *table); 856int amd_pmf_init_sps(struct amd_pmf_dev *dev); 857int apmf_get_static_slider_granular(struct amd_pmf_dev *pdev, 858 struct apmf_static_slider_granular_output *output); 859bool is_pprof_balanced(struct amd_pmf_dev *pmf); 860int amd_pmf_power_slider_update_event(struct amd_pmf_dev *dev); 861const char *amd_pmf_source_as_str(unsigned int state); 862 863const char *amd_pmf_source_as_str(unsigned int state); 864 865int apmf_update_fan_idx(struct amd_pmf_dev *pdev, bool manual, u32 idx); 866int amd_pmf_set_sps_power_limits(struct amd_pmf_dev *pmf); 867int apmf_get_static_slider_granular_v2(struct amd_pmf_dev *dev, 868 struct apmf_static_slider_granular_output_v2 *data); 869int apts_get_static_slider_granular_v2(struct amd_pmf_dev *pdev, 870 struct amd_pmf_apts_granular_output *data, u32 apts_idx); 871 872/* Auto Mode Layer */ 873int apmf_get_auto_mode_def(struct amd_pmf_dev *pdev, struct apmf_auto_mode *data); 874void amd_pmf_init_auto_mode(struct amd_pmf_dev *dev); 875void amd_pmf_deinit_auto_mode(struct amd_pmf_dev *dev); 876void amd_pmf_trans_automode(struct amd_pmf_dev *dev, int socket_power, ktime_t time_elapsed_ms); 877int apmf_get_sbios_requests(struct amd_pmf_dev *pdev, struct apmf_sbios_req *req); 878int apmf_get_sbios_requests_v1(struct amd_pmf_dev *pdev, struct apmf_sbios_req_v1 *req); 879int apmf_get_sbios_requests_v2(struct amd_pmf_dev *pdev, struct apmf_sbios_req_v2 *req); 880 881void amd_pmf_update_2_cql(struct amd_pmf_dev *dev, bool is_cql_event); 882int amd_pmf_reset_amt(struct amd_pmf_dev *dev); 883void amd_pmf_handle_amt(struct amd_pmf_dev *dev); 884 885/* CnQF Layer */ 886int apmf_get_dyn_slider_def_ac(struct amd_pmf_dev *pdev, struct apmf_dyn_slider_output *data); 887int apmf_get_dyn_slider_def_dc(struct amd_pmf_dev *pdev, struct apmf_dyn_slider_output *data); 888int amd_pmf_init_cnqf(struct amd_pmf_dev *dev); 889void amd_pmf_deinit_cnqf(struct amd_pmf_dev *dev); 890int amd_pmf_trans_cnqf(struct amd_pmf_dev *dev, int socket_power, ktime_t time_lapsed_ms); 891extern const struct attribute_group cnqf_feature_attribute_group; 892 893/* Smart PC builder Layer */ 894int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev); 895void amd_pmf_deinit_smart_pc(struct amd_pmf_dev *dev); 896int apmf_check_smart_pc(struct amd_pmf_dev *pmf_dev); 897int amd_pmf_smartpc_apply_bios_output(struct amd_pmf_dev *dev, u32 val, u32 preq, u32 idx); 898 899/* Smart PC - TA interfaces */ 900void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in); 901void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in); 902int amd_pmf_invoke_cmd_enact(struct amd_pmf_dev *dev); 903 904int amd_pmf_tee_init(struct amd_pmf_dev *dev, const uuid_t *uuid); 905void amd_pmf_tee_deinit(struct amd_pmf_dev *dev); 906int amd_pmf_start_policy_engine(struct amd_pmf_dev *dev); 907 908#endif /* PMF_H */
~/
Read-only file preview.