pmf.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  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. #ifndef PMF_H
  11. #define PMF_H
  12. #include <linux/acpi.h>
  13. #include <linux/input.h>
  14. #include <linux/platform_profile.h>
  15. #define POLICY_BUF_MAX_SZ 0x4b000
  16. #define POLICY_SIGN_COOKIE 0x31535024
  17. #define POLICY_COOKIE_OFFSET 0x10
  18. /* List of supported CPU ids */
  19. #define AMD_CPU_ID_RMB 0x14b5
  20. #define AMD_CPU_ID_PS 0x14e8
  21. #define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507
  22. #define PCI_DEVICE_ID_AMD_1AH_M60H_ROOT 0x1122
  23. struct cookie_header {
  24. u32 sign;
  25. u32 length;
  26. } __packed;
  27. /* APMF Functions */
  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_NOTIFY_SMART_PC_UPDATES 14
  39. #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 */
  44. #define GET_SPL 0x0B
  45. #define GET_SPPT 0x0D
  46. #define GET_FPPT 0x0F
  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
  61. /* OS slider update notification */
  62. #define DC_BEST_PERF 0
  63. #define DC_BETTER_PERF 1
  64. #define DC_BATTERY_SAVER 3
  65. #define AC_BEST_PERF 4
  66. #define AC_BETTER_PERF 5
  67. #define AC_BETTER_BATTERY 6
  68. /* Fan Index for Auto Mode */
  69. #define FAN_INDEX_AUTO 0xFFFFFFFF
  70. #define ARG_NONE 0
  71. #define AVG_SAMPLE_SIZE 3
  72. /* Policy Actions */
  73. #define PMF_POLICY_SPL 2
  74. #define PMF_POLICY_SPPT 3
  75. #define PMF_POLICY_FPPT 4
  76. #define PMF_POLICY_SPPT_APU_ONLY 5
  77. #define PMF_POLICY_STT_MIN 6
  78. #define PMF_POLICY_STT_SKINTEMP_APU 7
  79. #define PMF_POLICY_STT_SKINTEMP_HS2 8
  80. #define PMF_POLICY_SYSTEM_STATE 9
  81. #define PMF_POLICY_BIOS_OUTPUT_1 10
  82. #define PMF_POLICY_BIOS_OUTPUT_2 11
  83. #define PMF_POLICY_P3T 38
  84. #define PMF_POLICY_BIOS_OUTPUT_3 57
  85. #define PMF_POLICY_BIOS_OUTPUT_4 58
  86. #define PMF_POLICY_BIOS_OUTPUT_5 59
  87. #define PMF_POLICY_BIOS_OUTPUT_6 60
  88. #define PMF_POLICY_BIOS_OUTPUT_7 61
  89. #define PMF_POLICY_BIOS_OUTPUT_8 62
  90. #define PMF_POLICY_BIOS_OUTPUT_9 63
  91. #define PMF_POLICY_BIOS_OUTPUT_10 64
  92. /* TA macros */
  93. #define PMF_TA_IF_VERSION_MAJOR 1
  94. #define TA_PMF_ACTION_MAX 32
  95. #define TA_PMF_UNDO_MAX 8
  96. #define TA_OUTPUT_RESERVED_MEM 922
  97. #define MAX_OPERATION_PARAMS 4
  98. #define TA_ERROR_CRYPTO_INVALID_PARAM 0x20002
  99. #define TA_ERROR_CRYPTO_BIN_TOO_LARGE 0x2000d
  100. #define PMF_IF_V1 1
  101. #define PMF_IF_V2 2
  102. #define APTS_MAX_STATES 16
  103. /* APTS PMF BIOS Interface */
  104. struct amd_pmf_apts_output {
  105. u16 table_version;
  106. u32 fan_table_idx;
  107. u32 pmf_ppt;
  108. u32 ppt_pmf_apu_only;
  109. u32 stt_min_limit;
  110. u8 stt_skin_temp_limit_apu;
  111. u8 stt_skin_temp_limit_hs2;
  112. } __packed;
  113. struct amd_pmf_apts_granular_output {
  114. u16 size;
  115. struct amd_pmf_apts_output val;
  116. } __packed;
  117. struct amd_pmf_apts_granular {
  118. u16 size;
  119. struct amd_pmf_apts_output val[APTS_MAX_STATES];
  120. };
  121. struct sbios_hb_event_v2 {
  122. u16 size;
  123. u8 load;
  124. u8 unload;
  125. u8 suspend;
  126. u8 resume;
  127. } __packed;
  128. enum sbios_hb_v2 {
  129. ON_LOAD,
  130. ON_UNLOAD,
  131. ON_SUSPEND,
  132. ON_RESUME,
  133. };
  134. /* AMD PMF BIOS interfaces */
  135. struct apmf_verify_interface {
  136. u16 size;
  137. u16 version;
  138. u32 notification_mask;
  139. u32 supported_functions;
  140. } __packed;
  141. struct apmf_system_params {
  142. u16 size;
  143. u32 valid_mask;
  144. u32 flags;
  145. u8 command_code;
  146. u32 heartbeat_int;
  147. } __packed;
  148. struct apmf_sbios_req {
  149. u16 size;
  150. u32 pending_req;
  151. u8 rsd;
  152. u8 cql_event;
  153. u8 amt_event;
  154. u32 fppt;
  155. u32 sppt;
  156. u32 fppt_apu_only;
  157. u32 spl;
  158. u32 stt_min_limit;
  159. u8 skin_temp_apu;
  160. u8 skin_temp_hs2;
  161. } __packed;
  162. struct apmf_sbios_req_v2 {
  163. u16 size;
  164. u32 pending_req;
  165. u8 rsd;
  166. u32 ppt_pmf;
  167. u32 ppt_pmf_apu_only;
  168. u32 stt_min_limit;
  169. u8 skin_temp_apu;
  170. u8 skin_temp_hs2;
  171. u32 custom_policy[10];
  172. } __packed;
  173. struct apmf_fan_idx {
  174. u16 size;
  175. u8 fan_ctl_mode;
  176. u32 fan_ctl_idx;
  177. } __packed;
  178. struct smu_pmf_metrics_v2 {
  179. u16 core_frequency[16]; /* MHz */
  180. u16 core_power[16]; /* mW */
  181. u16 core_temp[16]; /* centi-C */
  182. u16 gfx_temp; /* centi-C */
  183. u16 soc_temp; /* centi-C */
  184. u16 stapm_opn_limit; /* mW */
  185. u16 stapm_cur_limit; /* mW */
  186. u16 infra_cpu_maxfreq; /* MHz */
  187. u16 infra_gfx_maxfreq; /* MHz */
  188. u16 skin_temp; /* centi-C */
  189. u16 gfxclk_freq; /* MHz */
  190. u16 fclk_freq; /* MHz */
  191. u16 gfx_activity; /* GFX busy % [0-100] */
  192. u16 socclk_freq; /* MHz */
  193. u16 vclk_freq; /* MHz */
  194. u16 vcn_activity; /* VCN busy % [0-100] */
  195. u16 vpeclk_freq; /* MHz */
  196. u16 ipuclk_freq; /* MHz */
  197. u16 ipu_busy[8]; /* NPU busy % [0-100] */
  198. u16 dram_reads; /* MB/sec */
  199. u16 dram_writes; /* MB/sec */
  200. u16 core_c0residency[16]; /* C0 residency % [0-100] */
  201. u16 ipu_power; /* mW */
  202. u32 apu_power; /* mW */
  203. u32 gfx_power; /* mW */
  204. u32 dgpu_power; /* mW */
  205. u32 socket_power; /* mW */
  206. u32 all_core_power; /* mW */
  207. u32 filter_alpha_value; /* time constant [us] */
  208. u32 metrics_counter;
  209. u16 memclk_freq; /* MHz */
  210. u16 mpipuclk_freq; /* MHz */
  211. u16 ipu_reads; /* MB/sec */
  212. u16 ipu_writes; /* MB/sec */
  213. u32 throttle_residency_prochot;
  214. u32 throttle_residency_spl;
  215. u32 throttle_residency_fppt;
  216. u32 throttle_residency_sppt;
  217. u32 throttle_residency_thm_core;
  218. u32 throttle_residency_thm_gfx;
  219. u32 throttle_residency_thm_soc;
  220. u16 psys;
  221. u16 spare1;
  222. u32 spare[6];
  223. } __packed;
  224. struct smu_pmf_metrics {
  225. u16 gfxclk_freq; /* in MHz */
  226. u16 socclk_freq; /* in MHz */
  227. u16 vclk_freq; /* in MHz */
  228. u16 dclk_freq; /* in MHz */
  229. u16 memclk_freq; /* in MHz */
  230. u16 spare;
  231. u16 gfx_activity; /* in Centi */
  232. u16 uvd_activity; /* in Centi */
  233. u16 voltage[2]; /* in mV */
  234. u16 currents[2]; /* in mA */
  235. u16 power[2];/* in mW */
  236. u16 core_freq[8]; /* in MHz */
  237. u16 core_power[8]; /* in mW */
  238. u16 core_temp[8]; /* in centi-Celsius */
  239. u16 l3_freq; /* in MHz */
  240. u16 l3_temp; /* in centi-Celsius */
  241. u16 gfx_temp; /* in centi-Celsius */
  242. u16 soc_temp; /* in centi-Celsius */
  243. u16 throttler_status;
  244. u16 current_socketpower; /* in mW */
  245. u16 stapm_orig_limit; /* in W */
  246. u16 stapm_cur_limit; /* in W */
  247. u32 apu_power; /* in mW */
  248. u32 dgpu_power; /* in mW */
  249. u16 vdd_tdc_val; /* in mA */
  250. u16 soc_tdc_val; /* in mA */
  251. u16 vdd_edc_val; /* in mA */
  252. u16 soc_edcv_al; /* in mA */
  253. u16 infra_cpu_maxfreq; /* in MHz */
  254. u16 infra_gfx_maxfreq; /* in MHz */
  255. u16 skin_temp; /* in centi-Celsius */
  256. u16 device_state;
  257. u16 curtemp; /* in centi-Celsius */
  258. u16 filter_alpha_value;
  259. u16 avg_gfx_clkfrequency;
  260. u16 avg_fclk_frequency;
  261. u16 avg_gfx_activity;
  262. u16 avg_socclk_frequency;
  263. u16 avg_vclk_frequency;
  264. u16 avg_vcn_activity;
  265. u16 avg_dram_reads;
  266. u16 avg_dram_writes;
  267. u16 avg_socket_power;
  268. u16 avg_core_power[2];
  269. u16 avg_core_c0residency[16];
  270. u16 spare1;
  271. u32 metrics_counter;
  272. } __packed;
  273. enum amd_stt_skin_temp {
  274. STT_TEMP_APU,
  275. STT_TEMP_HS2,
  276. STT_TEMP_COUNT,
  277. };
  278. enum amd_slider_op {
  279. SLIDER_OP_GET,
  280. SLIDER_OP_SET,
  281. };
  282. enum power_source {
  283. POWER_SOURCE_AC,
  284. POWER_SOURCE_DC,
  285. POWER_SOURCE_MAX,
  286. };
  287. enum power_modes {
  288. POWER_MODE_PERFORMANCE,
  289. POWER_MODE_BALANCED_POWER,
  290. POWER_MODE_POWER_SAVER,
  291. POWER_MODE_MAX,
  292. };
  293. enum power_modes_v2 {
  294. POWER_MODE_BEST_PERFORMANCE,
  295. POWER_MODE_BALANCED,
  296. POWER_MODE_BEST_POWER_EFFICIENCY,
  297. POWER_MODE_ENERGY_SAVE,
  298. POWER_MODE_V2_MAX,
  299. };
  300. struct amd_pmf_dev {
  301. void __iomem *regbase;
  302. void __iomem *smu_virt_addr;
  303. void *buf;
  304. u32 base_addr;
  305. u32 cpu_id;
  306. struct device *dev;
  307. struct mutex lock; /* protects the PMF interface */
  308. u32 supported_func;
  309. enum platform_profile_option current_profile;
  310. struct platform_profile_handler pprof;
  311. struct dentry *dbgfs_dir;
  312. int hb_interval; /* SBIOS heartbeat interval */
  313. struct delayed_work heart_beat;
  314. struct smu_pmf_metrics m_table;
  315. struct smu_pmf_metrics_v2 m_table_v2;
  316. struct delayed_work work_buffer;
  317. ktime_t start_time;
  318. int socket_power_history[AVG_SAMPLE_SIZE];
  319. int socket_power_history_idx;
  320. bool amt_enabled;
  321. struct mutex update_mutex; /* protects race between ACPI handler and metrics thread */
  322. bool cnqf_enabled;
  323. bool cnqf_supported;
  324. struct notifier_block pwr_src_notifier;
  325. /* Smart PC solution builder */
  326. struct dentry *esbin;
  327. unsigned char *policy_buf;
  328. u32 policy_sz;
  329. struct tee_context *tee_ctx;
  330. struct tee_shm *fw_shm_pool;
  331. u32 session_id;
  332. void *shbuf;
  333. struct delayed_work pb_work;
  334. struct pmf_action_table *prev_data;
  335. u64 policy_addr;
  336. void __iomem *policy_base;
  337. bool smart_pc_enabled;
  338. u16 pmf_if_version;
  339. struct input_dev *pmf_idev;
  340. size_t mtable_size;
  341. };
  342. struct apmf_sps_prop_granular_v2 {
  343. u8 power_states[POWER_SOURCE_MAX][POWER_MODE_V2_MAX];
  344. } __packed;
  345. struct apmf_sps_prop_granular {
  346. u32 fppt;
  347. u32 sppt;
  348. u32 sppt_apu_only;
  349. u32 spl;
  350. u32 stt_min;
  351. u8 stt_skin_temp[STT_TEMP_COUNT];
  352. u32 fan_id;
  353. } __packed;
  354. /* Static Slider */
  355. struct apmf_static_slider_granular_output {
  356. u16 size;
  357. struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX * POWER_MODE_MAX];
  358. } __packed;
  359. struct amd_pmf_static_slider_granular {
  360. u16 size;
  361. struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX][POWER_MODE_MAX];
  362. };
  363. struct apmf_static_slider_granular_output_v2 {
  364. u16 size;
  365. struct apmf_sps_prop_granular_v2 sps_idx;
  366. } __packed;
  367. struct amd_pmf_static_slider_granular_v2 {
  368. u16 size;
  369. struct apmf_sps_prop_granular_v2 sps_idx;
  370. };
  371. struct os_power_slider {
  372. u16 size;
  373. u8 slider_event;
  374. } __packed;
  375. struct amd_pmf_notify_smart_pc_update {
  376. u16 size;
  377. u32 pending_req;
  378. u32 custom_bios[10];
  379. } __packed;
  380. struct fan_table_control {
  381. bool manual;
  382. unsigned long fan_id;
  383. };
  384. struct power_table_control {
  385. u32 spl;
  386. u32 sppt;
  387. u32 fppt;
  388. u32 sppt_apu_only;
  389. u32 stt_min;
  390. u32 stt_skin_temp[STT_TEMP_COUNT];
  391. u32 reserved[16];
  392. };
  393. /* Auto Mode Layer */
  394. enum auto_mode_transition_priority {
  395. AUTO_TRANSITION_TO_PERFORMANCE, /* Any other mode to Performance Mode */
  396. AUTO_TRANSITION_FROM_QUIET_TO_BALANCE, /* Quiet Mode to Balance Mode */
  397. AUTO_TRANSITION_TO_QUIET, /* Any other mode to Quiet Mode */
  398. AUTO_TRANSITION_FROM_PERFORMANCE_TO_BALANCE, /* Performance Mode to Balance Mode */
  399. AUTO_TRANSITION_MAX,
  400. };
  401. enum auto_mode_mode {
  402. AUTO_QUIET,
  403. AUTO_BALANCE,
  404. AUTO_PERFORMANCE_ON_LAP,
  405. AUTO_PERFORMANCE,
  406. AUTO_MODE_MAX,
  407. };
  408. struct auto_mode_trans_params {
  409. u32 time_constant; /* minimum time required to switch to next mode */
  410. u32 power_delta; /* delta power to shift mode */
  411. u32 power_threshold;
  412. u32 timer; /* elapsed time. if timer > TimeThreshold, it will move to next mode */
  413. u32 applied;
  414. enum auto_mode_mode target_mode;
  415. u32 shifting_up;
  416. };
  417. struct auto_mode_mode_settings {
  418. struct power_table_control power_control;
  419. struct fan_table_control fan_control;
  420. u32 power_floor;
  421. };
  422. struct auto_mode_mode_config {
  423. struct auto_mode_trans_params transition[AUTO_TRANSITION_MAX];
  424. struct auto_mode_mode_settings mode_set[AUTO_MODE_MAX];
  425. enum auto_mode_mode current_mode;
  426. };
  427. struct apmf_auto_mode {
  428. u16 size;
  429. /* time constant */
  430. u32 balanced_to_perf;
  431. u32 perf_to_balanced;
  432. u32 quiet_to_balanced;
  433. u32 balanced_to_quiet;
  434. /* power floor */
  435. u32 pfloor_perf;
  436. u32 pfloor_balanced;
  437. u32 pfloor_quiet;
  438. /* Power delta for mode change */
  439. u32 pd_balanced_to_perf;
  440. u32 pd_perf_to_balanced;
  441. u32 pd_quiet_to_balanced;
  442. u32 pd_balanced_to_quiet;
  443. /* skin temperature limits */
  444. u8 stt_apu_perf_on_lap; /* CQL ON */
  445. u8 stt_hs2_perf_on_lap; /* CQL ON */
  446. u8 stt_apu_perf;
  447. u8 stt_hs2_perf;
  448. u8 stt_apu_balanced;
  449. u8 stt_hs2_balanced;
  450. u8 stt_apu_quiet;
  451. u8 stt_hs2_quiet;
  452. u32 stt_min_limit_perf_on_lap; /* CQL ON */
  453. u32 stt_min_limit_perf;
  454. u32 stt_min_limit_balanced;
  455. u32 stt_min_limit_quiet;
  456. /* SPL based */
  457. u32 fppt_perf_on_lap; /* CQL ON */
  458. u32 sppt_perf_on_lap; /* CQL ON */
  459. u32 spl_perf_on_lap; /* CQL ON */
  460. u32 sppt_apu_only_perf_on_lap; /* CQL ON */
  461. u32 fppt_perf;
  462. u32 sppt_perf;
  463. u32 spl_perf;
  464. u32 sppt_apu_only_perf;
  465. u32 fppt_balanced;
  466. u32 sppt_balanced;
  467. u32 spl_balanced;
  468. u32 sppt_apu_only_balanced;
  469. u32 fppt_quiet;
  470. u32 sppt_quiet;
  471. u32 spl_quiet;
  472. u32 sppt_apu_only_quiet;
  473. /* Fan ID */
  474. u32 fan_id_perf;
  475. u32 fan_id_balanced;
  476. u32 fan_id_quiet;
  477. } __packed;
  478. /* CnQF Layer */
  479. enum cnqf_trans_priority {
  480. CNQF_TRANSITION_TO_TURBO, /* Any other mode to Turbo Mode */
  481. CNQF_TRANSITION_FROM_BALANCE_TO_PERFORMANCE, /* quiet/balance to Performance Mode */
  482. CNQF_TRANSITION_FROM_QUIET_TO_BALANCE, /* Quiet Mode to Balance Mode */
  483. CNQF_TRANSITION_TO_QUIET, /* Any other mode to Quiet Mode */
  484. CNQF_TRANSITION_FROM_PERFORMANCE_TO_BALANCE, /* Performance/Turbo to Balance Mode */
  485. CNQF_TRANSITION_FROM_TURBO_TO_PERFORMANCE, /* Turbo mode to Performance Mode */
  486. CNQF_TRANSITION_MAX,
  487. };
  488. enum cnqf_mode {
  489. CNQF_MODE_QUIET,
  490. CNQF_MODE_BALANCE,
  491. CNQF_MODE_PERFORMANCE,
  492. CNQF_MODE_TURBO,
  493. CNQF_MODE_MAX,
  494. };
  495. enum apmf_cnqf_pos {
  496. APMF_CNQF_TURBO,
  497. APMF_CNQF_PERFORMANCE,
  498. APMF_CNQF_BALANCE,
  499. APMF_CNQF_QUIET,
  500. APMF_CNQF_MAX,
  501. };
  502. struct cnqf_mode_settings {
  503. struct power_table_control power_control;
  504. struct fan_table_control fan_control;
  505. u32 power_floor;
  506. };
  507. struct cnqf_tran_params {
  508. u32 time_constant; /* minimum time required to switch to next mode */
  509. u32 power_threshold;
  510. u32 timer; /* elapsed time. if timer > timethreshold, it will move to next mode */
  511. u32 total_power;
  512. u32 count;
  513. bool priority;
  514. bool shifting_up;
  515. enum cnqf_mode target_mode;
  516. };
  517. struct cnqf_config {
  518. struct cnqf_tran_params trans_param[POWER_SOURCE_MAX][CNQF_TRANSITION_MAX];
  519. struct cnqf_mode_settings mode_set[POWER_SOURCE_MAX][CNQF_MODE_MAX];
  520. struct power_table_control defaults;
  521. enum cnqf_mode current_mode;
  522. u32 power_src;
  523. u32 avg_power;
  524. };
  525. struct apmf_cnqf_power_set {
  526. u32 pfloor;
  527. u32 fppt;
  528. u32 sppt;
  529. u32 sppt_apu_only;
  530. u32 spl;
  531. u32 stt_min_limit;
  532. u8 stt_skintemp[STT_TEMP_COUNT];
  533. u32 fan_id;
  534. } __packed;
  535. struct apmf_dyn_slider_output {
  536. u16 size;
  537. u16 flags;
  538. u32 t_perf_to_turbo;
  539. u32 t_balanced_to_perf;
  540. u32 t_quiet_to_balanced;
  541. u32 t_balanced_to_quiet;
  542. u32 t_perf_to_balanced;
  543. u32 t_turbo_to_perf;
  544. struct apmf_cnqf_power_set ps[APMF_CNQF_MAX];
  545. } __packed;
  546. /* Smart PC - TA internals */
  547. enum system_state {
  548. SYSTEM_STATE_S0i3,
  549. SYSTEM_STATE_S4,
  550. SYSTEM_STATE_SCREEN_LOCK,
  551. SYSTEM_STATE_MAX,
  552. };
  553. enum ta_slider {
  554. TA_BEST_BATTERY,
  555. TA_BETTER_BATTERY,
  556. TA_BETTER_PERFORMANCE,
  557. TA_BEST_PERFORMANCE,
  558. TA_MAX,
  559. };
  560. /* Command ids for TA communication */
  561. enum ta_pmf_command {
  562. TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE,
  563. TA_PMF_COMMAND_POLICY_BUILDER_ENACT_POLICIES,
  564. };
  565. enum ta_pmf_error_type {
  566. TA_PMF_TYPE_SUCCESS,
  567. TA_PMF_ERROR_TYPE_GENERIC,
  568. TA_PMF_ERROR_TYPE_CRYPTO,
  569. TA_PMF_ERROR_TYPE_CRYPTO_VALIDATE,
  570. TA_PMF_ERROR_TYPE_CRYPTO_VERIFY_OEM,
  571. TA_PMF_ERROR_TYPE_POLICY_BUILDER,
  572. TA_PMF_ERROR_TYPE_PB_CONVERT,
  573. TA_PMF_ERROR_TYPE_PB_SETUP,
  574. TA_PMF_ERROR_TYPE_PB_ENACT,
  575. TA_PMF_ERROR_TYPE_ASD_GET_DEVICE_INFO,
  576. TA_PMF_ERROR_TYPE_ASD_GET_DEVICE_PCIE_INFO,
  577. TA_PMF_ERROR_TYPE_SYS_DRV_FW_VALIDATION,
  578. TA_PMF_ERROR_TYPE_MAX,
  579. };
  580. struct pmf_action_table {
  581. enum system_state system_state;
  582. u32 spl; /* in mW */
  583. u32 sppt; /* in mW */
  584. u32 sppt_apuonly; /* in mW */
  585. u32 fppt; /* in mW */
  586. u32 stt_minlimit; /* in mW */
  587. u32 stt_skintemp_apu; /* in C */
  588. u32 stt_skintemp_hs2; /* in C */
  589. u32 p3t_limit; /* in mW */
  590. };
  591. /* Input conditions */
  592. struct ta_pmf_condition_info {
  593. u32 power_source;
  594. u32 bat_percentage;
  595. u32 power_slider;
  596. u32 lid_state;
  597. bool user_present;
  598. u32 rsvd1[2];
  599. u32 monitor_count;
  600. u32 rsvd2[2];
  601. u32 bat_design;
  602. u32 full_charge_capacity;
  603. int drain_rate;
  604. bool user_engaged;
  605. u32 device_state;
  606. u32 socket_power;
  607. u32 skin_temperature;
  608. u32 rsvd3[5];
  609. u32 ambient_light;
  610. u32 length;
  611. u32 avg_c0residency;
  612. u32 max_c0residency;
  613. u32 s0i3_entry;
  614. u32 gfx_busy;
  615. u32 rsvd4[7];
  616. bool camera_state;
  617. u32 workload_type;
  618. u32 display_type;
  619. u32 display_state;
  620. u32 rsvd5[150];
  621. };
  622. struct ta_pmf_load_policy_table {
  623. u32 table_size;
  624. u8 table[POLICY_BUF_MAX_SZ];
  625. };
  626. /* TA initialization params */
  627. struct ta_pmf_init_table {
  628. u32 frequency; /* SMU sampling frequency */
  629. bool validate;
  630. bool sku_check;
  631. bool metadata_macrocheck;
  632. struct ta_pmf_load_policy_table policies_table;
  633. };
  634. /* Everything the TA needs to Enact Policies */
  635. struct ta_pmf_enact_table {
  636. struct ta_pmf_condition_info ev_info;
  637. u32 name;
  638. };
  639. struct ta_pmf_action {
  640. u32 action_index;
  641. u32 value;
  642. };
  643. /* Output actions from TA */
  644. struct ta_pmf_enact_result {
  645. u32 actions_count;
  646. struct ta_pmf_action actions_list[TA_PMF_ACTION_MAX];
  647. u32 undo_count;
  648. struct ta_pmf_action undo_list[TA_PMF_UNDO_MAX];
  649. };
  650. union ta_pmf_input {
  651. struct ta_pmf_enact_table enact_table;
  652. struct ta_pmf_init_table init_table;
  653. };
  654. union ta_pmf_output {
  655. struct ta_pmf_enact_result policy_apply_table;
  656. u32 rsvd[TA_OUTPUT_RESERVED_MEM];
  657. };
  658. struct ta_pmf_shared_memory {
  659. int command_id;
  660. int resp_id;
  661. u32 pmf_result;
  662. u32 if_version;
  663. union ta_pmf_output pmf_output;
  664. union ta_pmf_input pmf_input;
  665. };
  666. /* Core Layer */
  667. int apmf_acpi_init(struct amd_pmf_dev *pmf_dev);
  668. void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev);
  669. int is_apmf_func_supported(struct amd_pmf_dev *pdev, unsigned long index);
  670. int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32 *data);
  671. int amd_pmf_init_metrics_table(struct amd_pmf_dev *dev);
  672. int amd_pmf_get_power_source(void);
  673. int apmf_install_handler(struct amd_pmf_dev *pmf_dev);
  674. int apmf_os_power_slider_update(struct amd_pmf_dev *dev, u8 flag);
  675. int amd_pmf_set_dram_addr(struct amd_pmf_dev *dev, bool alloc_buffer);
  676. int amd_pmf_notify_sbios_heartbeat_event_v2(struct amd_pmf_dev *dev, u8 flag);
  677. u32 fixp_q88_fromint(u32 val);
  678. /* SPS Layer */
  679. int amd_pmf_get_pprof_modes(struct amd_pmf_dev *pmf);
  680. void amd_pmf_update_slider(struct amd_pmf_dev *dev, bool op, int idx,
  681. struct amd_pmf_static_slider_granular *table);
  682. int amd_pmf_init_sps(struct amd_pmf_dev *dev);
  683. void amd_pmf_deinit_sps(struct amd_pmf_dev *dev);
  684. int apmf_get_static_slider_granular(struct amd_pmf_dev *pdev,
  685. struct apmf_static_slider_granular_output *output);
  686. bool is_pprof_balanced(struct amd_pmf_dev *pmf);
  687. int amd_pmf_power_slider_update_event(struct amd_pmf_dev *dev);
  688. const char *amd_pmf_source_as_str(unsigned int state);
  689. const char *amd_pmf_source_as_str(unsigned int state);
  690. int apmf_update_fan_idx(struct amd_pmf_dev *pdev, bool manual, u32 idx);
  691. int amd_pmf_set_sps_power_limits(struct amd_pmf_dev *pmf);
  692. int apmf_get_static_slider_granular_v2(struct amd_pmf_dev *dev,
  693. struct apmf_static_slider_granular_output_v2 *data);
  694. int apts_get_static_slider_granular_v2(struct amd_pmf_dev *pdev,
  695. 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);
  703. void amd_pmf_update_2_cql(struct amd_pmf_dev *dev, bool is_cql_event);
  704. int amd_pmf_reset_amt(struct amd_pmf_dev *dev);
  705. void amd_pmf_handle_amt(struct amd_pmf_dev *dev);
  706. /* CnQF Layer */
  707. int apmf_get_dyn_slider_def_ac(struct amd_pmf_dev *pdev, struct apmf_dyn_slider_output *data);
  708. int apmf_get_dyn_slider_def_dc(struct amd_pmf_dev *pdev, struct apmf_dyn_slider_output *data);
  709. int amd_pmf_init_cnqf(struct amd_pmf_dev *dev);
  710. void amd_pmf_deinit_cnqf(struct amd_pmf_dev *dev);
  711. int amd_pmf_trans_cnqf(struct amd_pmf_dev *dev, int socket_power, ktime_t time_lapsed_ms);
  712. extern const struct attribute_group cnqf_feature_attribute_group;
  713. /* Smart PC builder Layer */
  714. int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev);
  715. void amd_pmf_deinit_smart_pc(struct amd_pmf_dev *dev);
  716. int apmf_check_smart_pc(struct amd_pmf_dev *pmf_dev);
  717. int amd_pmf_smartpc_apply_bios_output(struct amd_pmf_dev *dev, u32 val, u32 preq, u32 idx);
  718. /* Smart PC - TA interfaces */
  719. void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
  720. void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
  721. /* Quirk infrastructure */
  722. void amd_pmf_quirks_init(struct amd_pmf_dev *dev);
  723. #endif /* PMF_H */