18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef __ACPI_PROCESSOR_H 38c2ecf20Sopenharmony_ci#define __ACPI_PROCESSOR_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/kernel.h> 68c2ecf20Sopenharmony_ci#include <linux/cpu.h> 78c2ecf20Sopenharmony_ci#include <linux/cpufreq.h> 88c2ecf20Sopenharmony_ci#include <linux/pm_qos.h> 98c2ecf20Sopenharmony_ci#include <linux/thermal.h> 108c2ecf20Sopenharmony_ci#include <asm/acpi.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_CLASS "processor" 138c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_DEVICE_NAME "Processor" 148c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_DEVICE_HID "ACPI0007" 158c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_CONTAINER_HID "ACPI0010" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_BUSY_METRIC 10 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_MAX_POWER 8 208c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_MAX_C2_LATENCY 100 218c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_MAX_C3_LATENCY 1000 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_MAX_THROTTLING 16 248c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_MAX_THROTTLE 250 /* 25% */ 258c2ecf20Sopenharmony_ci#define ACPI_PROCESSOR_MAX_DUTY_WIDTH 4 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#define ACPI_PDC_REVISION_ID 0x1 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define ACPI_PSD_REV0_REVISION 0 /* Support for _PSD as in ACPI 3.0 */ 308c2ecf20Sopenharmony_ci#define ACPI_PSD_REV0_ENTRIES 5 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define ACPI_TSD_REV0_REVISION 0 /* Support for _PSD as in ACPI 3.0 */ 338c2ecf20Sopenharmony_ci#define ACPI_TSD_REV0_ENTRIES 5 348c2ecf20Sopenharmony_ci/* 358c2ecf20Sopenharmony_ci * Types of coordination defined in ACPI 3.0. Same macros can be used across 368c2ecf20Sopenharmony_ci * P, C and T states 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_ci#define DOMAIN_COORD_TYPE_SW_ALL 0xfc 398c2ecf20Sopenharmony_ci#define DOMAIN_COORD_TYPE_SW_ANY 0xfd 408c2ecf20Sopenharmony_ci#define DOMAIN_COORD_TYPE_HW_ALL 0xfe 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define ACPI_CSTATE_SYSTEMIO 0 438c2ecf20Sopenharmony_ci#define ACPI_CSTATE_FFH 1 448c2ecf20Sopenharmony_ci#define ACPI_CSTATE_HALT 2 458c2ecf20Sopenharmony_ci#define ACPI_CSTATE_INTEGER 3 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci#define ACPI_CX_DESC_LEN 32 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci/* Power Management */ 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistruct acpi_processor_cx; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistruct acpi_power_register { 548c2ecf20Sopenharmony_ci u8 descriptor; 558c2ecf20Sopenharmony_ci u16 length; 568c2ecf20Sopenharmony_ci u8 space_id; 578c2ecf20Sopenharmony_ci u8 bit_width; 588c2ecf20Sopenharmony_ci u8 bit_offset; 598c2ecf20Sopenharmony_ci u8 access_size; 608c2ecf20Sopenharmony_ci u64 address; 618c2ecf20Sopenharmony_ci} __packed; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistruct acpi_processor_cx { 648c2ecf20Sopenharmony_ci u8 valid; 658c2ecf20Sopenharmony_ci u8 type; 668c2ecf20Sopenharmony_ci u32 address; 678c2ecf20Sopenharmony_ci u8 entry_method; 688c2ecf20Sopenharmony_ci u8 index; 698c2ecf20Sopenharmony_ci u32 latency; 708c2ecf20Sopenharmony_ci u8 bm_sts_skip; 718c2ecf20Sopenharmony_ci char desc[ACPI_CX_DESC_LEN]; 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cistruct acpi_lpi_state { 758c2ecf20Sopenharmony_ci u32 min_residency; 768c2ecf20Sopenharmony_ci u32 wake_latency; /* worst case */ 778c2ecf20Sopenharmony_ci u32 flags; 788c2ecf20Sopenharmony_ci u32 arch_flags; 798c2ecf20Sopenharmony_ci u32 res_cnt_freq; 808c2ecf20Sopenharmony_ci u32 enable_parent_state; 818c2ecf20Sopenharmony_ci u64 address; 828c2ecf20Sopenharmony_ci u8 index; 838c2ecf20Sopenharmony_ci u8 entry_method; 848c2ecf20Sopenharmony_ci char desc[ACPI_CX_DESC_LEN]; 858c2ecf20Sopenharmony_ci}; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistruct acpi_processor_power { 888c2ecf20Sopenharmony_ci int count; 898c2ecf20Sopenharmony_ci union { 908c2ecf20Sopenharmony_ci struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER]; 918c2ecf20Sopenharmony_ci struct acpi_lpi_state lpi_states[ACPI_PROCESSOR_MAX_POWER]; 928c2ecf20Sopenharmony_ci }; 938c2ecf20Sopenharmony_ci int timer_broadcast_on_state; 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci/* Performance Management */ 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cistruct acpi_psd_package { 998c2ecf20Sopenharmony_ci u64 num_entries; 1008c2ecf20Sopenharmony_ci u64 revision; 1018c2ecf20Sopenharmony_ci u64 domain; 1028c2ecf20Sopenharmony_ci u64 coord_type; 1038c2ecf20Sopenharmony_ci u64 num_processors; 1048c2ecf20Sopenharmony_ci} __packed; 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_cistruct acpi_pct_register { 1078c2ecf20Sopenharmony_ci u8 descriptor; 1088c2ecf20Sopenharmony_ci u16 length; 1098c2ecf20Sopenharmony_ci u8 space_id; 1108c2ecf20Sopenharmony_ci u8 bit_width; 1118c2ecf20Sopenharmony_ci u8 bit_offset; 1128c2ecf20Sopenharmony_ci u8 reserved; 1138c2ecf20Sopenharmony_ci u64 address; 1148c2ecf20Sopenharmony_ci} __packed; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cistruct acpi_processor_px { 1178c2ecf20Sopenharmony_ci u64 core_frequency; /* megahertz */ 1188c2ecf20Sopenharmony_ci u64 power; /* milliWatts */ 1198c2ecf20Sopenharmony_ci u64 transition_latency; /* microseconds */ 1208c2ecf20Sopenharmony_ci u64 bus_master_latency; /* microseconds */ 1218c2ecf20Sopenharmony_ci u64 control; /* control value */ 1228c2ecf20Sopenharmony_ci u64 status; /* success indicator */ 1238c2ecf20Sopenharmony_ci}; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_cistruct acpi_processor_performance { 1268c2ecf20Sopenharmony_ci unsigned int state; 1278c2ecf20Sopenharmony_ci unsigned int platform_limit; 1288c2ecf20Sopenharmony_ci struct acpi_pct_register control_register; 1298c2ecf20Sopenharmony_ci struct acpi_pct_register status_register; 1308c2ecf20Sopenharmony_ci unsigned int state_count; 1318c2ecf20Sopenharmony_ci struct acpi_processor_px *states; 1328c2ecf20Sopenharmony_ci struct acpi_psd_package domain_info; 1338c2ecf20Sopenharmony_ci cpumask_var_t shared_cpu_map; 1348c2ecf20Sopenharmony_ci unsigned int shared_type; 1358c2ecf20Sopenharmony_ci}; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci/* Throttling Control */ 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_cistruct acpi_tsd_package { 1408c2ecf20Sopenharmony_ci u64 num_entries; 1418c2ecf20Sopenharmony_ci u64 revision; 1428c2ecf20Sopenharmony_ci u64 domain; 1438c2ecf20Sopenharmony_ci u64 coord_type; 1448c2ecf20Sopenharmony_ci u64 num_processors; 1458c2ecf20Sopenharmony_ci} __packed; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_cistruct acpi_ptc_register { 1488c2ecf20Sopenharmony_ci u8 descriptor; 1498c2ecf20Sopenharmony_ci u16 length; 1508c2ecf20Sopenharmony_ci u8 space_id; 1518c2ecf20Sopenharmony_ci u8 bit_width; 1528c2ecf20Sopenharmony_ci u8 bit_offset; 1538c2ecf20Sopenharmony_ci u8 reserved; 1548c2ecf20Sopenharmony_ci u64 address; 1558c2ecf20Sopenharmony_ci} __packed; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_cistruct acpi_processor_tx_tss { 1588c2ecf20Sopenharmony_ci u64 freqpercentage; /* */ 1598c2ecf20Sopenharmony_ci u64 power; /* milliWatts */ 1608c2ecf20Sopenharmony_ci u64 transition_latency; /* microseconds */ 1618c2ecf20Sopenharmony_ci u64 control; /* control value */ 1628c2ecf20Sopenharmony_ci u64 status; /* success indicator */ 1638c2ecf20Sopenharmony_ci}; 1648c2ecf20Sopenharmony_cistruct acpi_processor_tx { 1658c2ecf20Sopenharmony_ci u16 power; 1668c2ecf20Sopenharmony_ci u16 performance; 1678c2ecf20Sopenharmony_ci}; 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_cistruct acpi_processor; 1708c2ecf20Sopenharmony_cistruct acpi_processor_throttling { 1718c2ecf20Sopenharmony_ci unsigned int state; 1728c2ecf20Sopenharmony_ci unsigned int platform_limit; 1738c2ecf20Sopenharmony_ci struct acpi_pct_register control_register; 1748c2ecf20Sopenharmony_ci struct acpi_pct_register status_register; 1758c2ecf20Sopenharmony_ci unsigned int state_count; 1768c2ecf20Sopenharmony_ci struct acpi_processor_tx_tss *states_tss; 1778c2ecf20Sopenharmony_ci struct acpi_tsd_package domain_info; 1788c2ecf20Sopenharmony_ci cpumask_var_t shared_cpu_map; 1798c2ecf20Sopenharmony_ci int (*acpi_processor_get_throttling) (struct acpi_processor * pr); 1808c2ecf20Sopenharmony_ci int (*acpi_processor_set_throttling) (struct acpi_processor * pr, 1818c2ecf20Sopenharmony_ci int state, bool force); 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci u32 address; 1848c2ecf20Sopenharmony_ci u8 duty_offset; 1858c2ecf20Sopenharmony_ci u8 duty_width; 1868c2ecf20Sopenharmony_ci u8 tsd_valid_flag; 1878c2ecf20Sopenharmony_ci unsigned int shared_type; 1888c2ecf20Sopenharmony_ci struct acpi_processor_tx states[ACPI_PROCESSOR_MAX_THROTTLING]; 1898c2ecf20Sopenharmony_ci}; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci/* Limit Interface */ 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_cistruct acpi_processor_lx { 1948c2ecf20Sopenharmony_ci int px; /* performance state */ 1958c2ecf20Sopenharmony_ci int tx; /* throttle level */ 1968c2ecf20Sopenharmony_ci}; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_cistruct acpi_processor_limit { 1998c2ecf20Sopenharmony_ci struct acpi_processor_lx state; /* current limit */ 2008c2ecf20Sopenharmony_ci struct acpi_processor_lx thermal; /* thermal limit */ 2018c2ecf20Sopenharmony_ci struct acpi_processor_lx user; /* user limit */ 2028c2ecf20Sopenharmony_ci}; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_cistruct acpi_processor_flags { 2058c2ecf20Sopenharmony_ci u8 power:1; 2068c2ecf20Sopenharmony_ci u8 performance:1; 2078c2ecf20Sopenharmony_ci u8 throttling:1; 2088c2ecf20Sopenharmony_ci u8 limit:1; 2098c2ecf20Sopenharmony_ci u8 bm_control:1; 2108c2ecf20Sopenharmony_ci u8 bm_check:1; 2118c2ecf20Sopenharmony_ci u8 has_cst:1; 2128c2ecf20Sopenharmony_ci u8 has_lpi:1; 2138c2ecf20Sopenharmony_ci u8 power_setup_done:1; 2148c2ecf20Sopenharmony_ci u8 bm_rld_set:1; 2158c2ecf20Sopenharmony_ci u8 need_hotplug_init:1; 2168c2ecf20Sopenharmony_ci}; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cistruct acpi_processor { 2198c2ecf20Sopenharmony_ci acpi_handle handle; 2208c2ecf20Sopenharmony_ci u32 acpi_id; 2218c2ecf20Sopenharmony_ci phys_cpuid_t phys_id; /* CPU hardware ID such as APIC ID for x86 */ 2228c2ecf20Sopenharmony_ci u32 id; /* CPU logical ID allocated by OS */ 2238c2ecf20Sopenharmony_ci u32 pblk; 2248c2ecf20Sopenharmony_ci int performance_platform_limit; 2258c2ecf20Sopenharmony_ci int throttling_platform_limit; 2268c2ecf20Sopenharmony_ci /* 0 - states 0..n-th state available */ 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci struct acpi_processor_flags flags; 2298c2ecf20Sopenharmony_ci struct acpi_processor_power power; 2308c2ecf20Sopenharmony_ci struct acpi_processor_performance *performance; 2318c2ecf20Sopenharmony_ci struct acpi_processor_throttling throttling; 2328c2ecf20Sopenharmony_ci struct acpi_processor_limit limit; 2338c2ecf20Sopenharmony_ci struct thermal_cooling_device *cdev; 2348c2ecf20Sopenharmony_ci struct device *dev; /* Processor device. */ 2358c2ecf20Sopenharmony_ci struct freq_qos_request perflib_req; 2368c2ecf20Sopenharmony_ci struct freq_qos_request thermal_req; 2378c2ecf20Sopenharmony_ci}; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistruct acpi_processor_errata { 2408c2ecf20Sopenharmony_ci u8 smp; 2418c2ecf20Sopenharmony_ci struct { 2428c2ecf20Sopenharmony_ci u8 throttle:1; 2438c2ecf20Sopenharmony_ci u8 fdma:1; 2448c2ecf20Sopenharmony_ci u8 reserved:6; 2458c2ecf20Sopenharmony_ci u32 bmisx; 2468c2ecf20Sopenharmony_ci } piix4; 2478c2ecf20Sopenharmony_ci}; 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ciextern int acpi_processor_preregister_performance(struct 2508c2ecf20Sopenharmony_ci acpi_processor_performance 2518c2ecf20Sopenharmony_ci __percpu *performance); 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ciextern int acpi_processor_register_performance(struct acpi_processor_performance 2548c2ecf20Sopenharmony_ci *performance, unsigned int cpu); 2558c2ecf20Sopenharmony_ciextern void acpi_processor_unregister_performance(unsigned int cpu); 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ciint acpi_processor_pstate_control(void); 2588c2ecf20Sopenharmony_ci/* note: this locks both the calling module and the processor module 2598c2ecf20Sopenharmony_ci if a _PPC object exists, rmmod is disallowed then */ 2608c2ecf20Sopenharmony_ciint acpi_processor_notify_smm(struct module *calling_module); 2618c2ecf20Sopenharmony_ciint acpi_processor_get_psd(acpi_handle handle, 2628c2ecf20Sopenharmony_ci struct acpi_psd_package *pdomain); 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci/* parsing the _P* objects. */ 2658c2ecf20Sopenharmony_ciextern int acpi_processor_get_performance_info(struct acpi_processor *pr); 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci/* for communication between multiple parts of the processor kernel module */ 2688c2ecf20Sopenharmony_ciDECLARE_PER_CPU(struct acpi_processor *, processors); 2698c2ecf20Sopenharmony_ciextern struct acpi_processor_errata errata; 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci#if defined(ARCH_HAS_POWER_INIT) && defined(CONFIG_ACPI_PROCESSOR_CSTATE) 2728c2ecf20Sopenharmony_civoid acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, 2738c2ecf20Sopenharmony_ci unsigned int cpu); 2748c2ecf20Sopenharmony_ciint acpi_processor_ffh_cstate_probe(unsigned int cpu, 2758c2ecf20Sopenharmony_ci struct acpi_processor_cx *cx, 2768c2ecf20Sopenharmony_ci struct acpi_power_register *reg); 2778c2ecf20Sopenharmony_civoid acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cstate); 2788c2ecf20Sopenharmony_ci#else 2798c2ecf20Sopenharmony_cistatic inline void acpi_processor_power_init_bm_check(struct 2808c2ecf20Sopenharmony_ci acpi_processor_flags 2818c2ecf20Sopenharmony_ci *flags, unsigned int cpu) 2828c2ecf20Sopenharmony_ci{ 2838c2ecf20Sopenharmony_ci flags->bm_check = 1; 2848c2ecf20Sopenharmony_ci return; 2858c2ecf20Sopenharmony_ci} 2868c2ecf20Sopenharmony_cistatic inline int acpi_processor_ffh_cstate_probe(unsigned int cpu, 2878c2ecf20Sopenharmony_ci struct acpi_processor_cx *cx, 2888c2ecf20Sopenharmony_ci struct acpi_power_register 2898c2ecf20Sopenharmony_ci *reg) 2908c2ecf20Sopenharmony_ci{ 2918c2ecf20Sopenharmony_ci return -1; 2928c2ecf20Sopenharmony_ci} 2938c2ecf20Sopenharmony_cistatic inline void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx 2948c2ecf20Sopenharmony_ci *cstate) 2958c2ecf20Sopenharmony_ci{ 2968c2ecf20Sopenharmony_ci return; 2978c2ecf20Sopenharmony_ci} 2988c2ecf20Sopenharmony_ci#endif 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_cistatic inline int call_on_cpu(int cpu, long (*fn)(void *), void *arg, 3018c2ecf20Sopenharmony_ci bool direct) 3028c2ecf20Sopenharmony_ci{ 3038c2ecf20Sopenharmony_ci if (direct || (is_percpu_thread() && cpu == smp_processor_id())) 3048c2ecf20Sopenharmony_ci return fn(arg); 3058c2ecf20Sopenharmony_ci return work_on_cpu(cpu, fn, arg); 3068c2ecf20Sopenharmony_ci} 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci/* in processor_perflib.c */ 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_FREQ 3118c2ecf20Sopenharmony_ciextern bool acpi_processor_cpufreq_init; 3128c2ecf20Sopenharmony_civoid acpi_processor_ignore_ppc_init(void); 3138c2ecf20Sopenharmony_civoid acpi_processor_ppc_init(struct cpufreq_policy *policy); 3148c2ecf20Sopenharmony_civoid acpi_processor_ppc_exit(struct cpufreq_policy *policy); 3158c2ecf20Sopenharmony_civoid acpi_processor_ppc_has_changed(struct acpi_processor *pr, int event_flag); 3168c2ecf20Sopenharmony_ciextern int acpi_processor_get_bios_limit(int cpu, unsigned int *limit); 3178c2ecf20Sopenharmony_ci#else 3188c2ecf20Sopenharmony_cistatic inline void acpi_processor_ignore_ppc_init(void) 3198c2ecf20Sopenharmony_ci{ 3208c2ecf20Sopenharmony_ci return; 3218c2ecf20Sopenharmony_ci} 3228c2ecf20Sopenharmony_cistatic inline void acpi_processor_ppc_init(struct cpufreq_policy *policy) 3238c2ecf20Sopenharmony_ci{ 3248c2ecf20Sopenharmony_ci return; 3258c2ecf20Sopenharmony_ci} 3268c2ecf20Sopenharmony_cistatic inline void acpi_processor_ppc_exit(struct cpufreq_policy *policy) 3278c2ecf20Sopenharmony_ci{ 3288c2ecf20Sopenharmony_ci return; 3298c2ecf20Sopenharmony_ci} 3308c2ecf20Sopenharmony_cistatic inline void acpi_processor_ppc_has_changed(struct acpi_processor *pr, 3318c2ecf20Sopenharmony_ci int event_flag) 3328c2ecf20Sopenharmony_ci{ 3338c2ecf20Sopenharmony_ci static unsigned int printout = 1; 3348c2ecf20Sopenharmony_ci if (printout) { 3358c2ecf20Sopenharmony_ci printk(KERN_WARNING 3368c2ecf20Sopenharmony_ci "Warning: Processor Platform Limit event detected, but not handled.\n"); 3378c2ecf20Sopenharmony_ci printk(KERN_WARNING 3388c2ecf20Sopenharmony_ci "Consider compiling CPUfreq support into your kernel.\n"); 3398c2ecf20Sopenharmony_ci printout = 0; 3408c2ecf20Sopenharmony_ci } 3418c2ecf20Sopenharmony_ci} 3428c2ecf20Sopenharmony_cistatic inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit) 3438c2ecf20Sopenharmony_ci{ 3448c2ecf20Sopenharmony_ci return -ENODEV; 3458c2ecf20Sopenharmony_ci} 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci#endif /* CONFIG_CPU_FREQ */ 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci/* in processor_core.c */ 3508c2ecf20Sopenharmony_ciphys_cpuid_t acpi_get_phys_id(acpi_handle, int type, u32 acpi_id); 3518c2ecf20Sopenharmony_ciphys_cpuid_t acpi_map_madt_entry(u32 acpi_id); 3528c2ecf20Sopenharmony_ciint acpi_map_cpuid(phys_cpuid_t phys_id, u32 acpi_id); 3538c2ecf20Sopenharmony_ciint acpi_get_cpuid(acpi_handle, int type, u32 acpi_id); 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ci#ifdef CONFIG_ACPI_CPPC_LIB 3568c2ecf20Sopenharmony_ciextern int acpi_cppc_processor_probe(struct acpi_processor *pr); 3578c2ecf20Sopenharmony_ciextern void acpi_cppc_processor_exit(struct acpi_processor *pr); 3588c2ecf20Sopenharmony_ci#else 3598c2ecf20Sopenharmony_cistatic inline int acpi_cppc_processor_probe(struct acpi_processor *pr) 3608c2ecf20Sopenharmony_ci{ 3618c2ecf20Sopenharmony_ci return 0; 3628c2ecf20Sopenharmony_ci} 3638c2ecf20Sopenharmony_cistatic inline void acpi_cppc_processor_exit(struct acpi_processor *pr) 3648c2ecf20Sopenharmony_ci{ 3658c2ecf20Sopenharmony_ci return; 3668c2ecf20Sopenharmony_ci} 3678c2ecf20Sopenharmony_ci#endif /* CONFIG_ACPI_CPPC_LIB */ 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci/* in processor_pdc.c */ 3708c2ecf20Sopenharmony_civoid acpi_processor_set_pdc(acpi_handle handle); 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci/* in processor_throttling.c */ 3738c2ecf20Sopenharmony_ci#ifdef CONFIG_ACPI_CPU_FREQ_PSS 3748c2ecf20Sopenharmony_ciint acpi_processor_tstate_has_changed(struct acpi_processor *pr); 3758c2ecf20Sopenharmony_ciint acpi_processor_get_throttling_info(struct acpi_processor *pr); 3768c2ecf20Sopenharmony_ciextern int acpi_processor_set_throttling(struct acpi_processor *pr, 3778c2ecf20Sopenharmony_ci int state, bool force); 3788c2ecf20Sopenharmony_ci/* 3798c2ecf20Sopenharmony_ci * Reevaluate whether the T-state is invalid after one cpu is 3808c2ecf20Sopenharmony_ci * onlined/offlined. In such case the flags.throttling will be updated. 3818c2ecf20Sopenharmony_ci */ 3828c2ecf20Sopenharmony_ciextern void acpi_processor_reevaluate_tstate(struct acpi_processor *pr, 3838c2ecf20Sopenharmony_ci bool is_dead); 3848c2ecf20Sopenharmony_ciextern const struct file_operations acpi_processor_throttling_fops; 3858c2ecf20Sopenharmony_ciextern void acpi_processor_throttling_init(void); 3868c2ecf20Sopenharmony_ci#else 3878c2ecf20Sopenharmony_cistatic inline int acpi_processor_tstate_has_changed(struct acpi_processor *pr) 3888c2ecf20Sopenharmony_ci{ 3898c2ecf20Sopenharmony_ci return 0; 3908c2ecf20Sopenharmony_ci} 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_cistatic inline int acpi_processor_get_throttling_info(struct acpi_processor *pr) 3938c2ecf20Sopenharmony_ci{ 3948c2ecf20Sopenharmony_ci return -ENODEV; 3958c2ecf20Sopenharmony_ci} 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_cistatic inline int acpi_processor_set_throttling(struct acpi_processor *pr, 3988c2ecf20Sopenharmony_ci int state, bool force) 3998c2ecf20Sopenharmony_ci{ 4008c2ecf20Sopenharmony_ci return -ENODEV; 4018c2ecf20Sopenharmony_ci} 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_cistatic inline void acpi_processor_reevaluate_tstate(struct acpi_processor *pr, 4048c2ecf20Sopenharmony_ci bool is_dead) {} 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_cistatic inline void acpi_processor_throttling_init(void) {} 4078c2ecf20Sopenharmony_ci#endif /* CONFIG_ACPI_CPU_FREQ_PSS */ 4088c2ecf20Sopenharmony_ci 4098c2ecf20Sopenharmony_ci/* in processor_idle.c */ 4108c2ecf20Sopenharmony_ciextern struct cpuidle_driver acpi_idle_driver; 4118c2ecf20Sopenharmony_ci#ifdef CONFIG_ACPI_PROCESSOR_IDLE 4128c2ecf20Sopenharmony_ciint acpi_processor_power_init(struct acpi_processor *pr); 4138c2ecf20Sopenharmony_ciint acpi_processor_power_exit(struct acpi_processor *pr); 4148c2ecf20Sopenharmony_ciint acpi_processor_power_state_has_changed(struct acpi_processor *pr); 4158c2ecf20Sopenharmony_ciint acpi_processor_hotplug(struct acpi_processor *pr); 4168c2ecf20Sopenharmony_ci#else 4178c2ecf20Sopenharmony_cistatic inline int acpi_processor_power_init(struct acpi_processor *pr) 4188c2ecf20Sopenharmony_ci{ 4198c2ecf20Sopenharmony_ci return -ENODEV; 4208c2ecf20Sopenharmony_ci} 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_cistatic inline int acpi_processor_power_exit(struct acpi_processor *pr) 4238c2ecf20Sopenharmony_ci{ 4248c2ecf20Sopenharmony_ci return -ENODEV; 4258c2ecf20Sopenharmony_ci} 4268c2ecf20Sopenharmony_ci 4278c2ecf20Sopenharmony_cistatic inline int acpi_processor_power_state_has_changed(struct acpi_processor *pr) 4288c2ecf20Sopenharmony_ci{ 4298c2ecf20Sopenharmony_ci return -ENODEV; 4308c2ecf20Sopenharmony_ci} 4318c2ecf20Sopenharmony_ci 4328c2ecf20Sopenharmony_cistatic inline int acpi_processor_hotplug(struct acpi_processor *pr) 4338c2ecf20Sopenharmony_ci{ 4348c2ecf20Sopenharmony_ci return -ENODEV; 4358c2ecf20Sopenharmony_ci} 4368c2ecf20Sopenharmony_ci#endif /* CONFIG_ACPI_PROCESSOR_IDLE */ 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_ci/* in processor_thermal.c */ 4398c2ecf20Sopenharmony_ciint acpi_processor_get_limit_info(struct acpi_processor *pr); 4408c2ecf20Sopenharmony_ciextern const struct thermal_cooling_device_ops processor_cooling_ops; 4418c2ecf20Sopenharmony_ci#if defined(CONFIG_ACPI_CPU_FREQ_PSS) & defined(CONFIG_CPU_FREQ) 4428c2ecf20Sopenharmony_civoid acpi_thermal_cpufreq_init(struct cpufreq_policy *policy); 4438c2ecf20Sopenharmony_civoid acpi_thermal_cpufreq_exit(struct cpufreq_policy *policy); 4448c2ecf20Sopenharmony_ci#else 4458c2ecf20Sopenharmony_cistatic inline void acpi_thermal_cpufreq_init(struct cpufreq_policy *policy) 4468c2ecf20Sopenharmony_ci{ 4478c2ecf20Sopenharmony_ci return; 4488c2ecf20Sopenharmony_ci} 4498c2ecf20Sopenharmony_cistatic inline void acpi_thermal_cpufreq_exit(struct cpufreq_policy *policy) 4508c2ecf20Sopenharmony_ci{ 4518c2ecf20Sopenharmony_ci return; 4528c2ecf20Sopenharmony_ci} 4538c2ecf20Sopenharmony_ci#endif /* CONFIG_ACPI_CPU_FREQ_PSS */ 4548c2ecf20Sopenharmony_ci 4558c2ecf20Sopenharmony_ci#endif 456