162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * cpufreq.h - definitions for libcpufreq 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2004-2009 Dominik Brodowski <linux@dominikbrodowski.de> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __CPUPOWER_CPUFREQ_H__ 962306a36Sopenharmony_ci#define __CPUPOWER_CPUFREQ_H__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct cpufreq_policy { 1262306a36Sopenharmony_ci unsigned long min; 1362306a36Sopenharmony_ci unsigned long max; 1462306a36Sopenharmony_ci char *governor; 1562306a36Sopenharmony_ci}; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct cpufreq_available_governors { 1862306a36Sopenharmony_ci char *governor; 1962306a36Sopenharmony_ci struct cpufreq_available_governors *next; 2062306a36Sopenharmony_ci struct cpufreq_available_governors *first; 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct cpufreq_available_frequencies { 2462306a36Sopenharmony_ci unsigned long frequency; 2562306a36Sopenharmony_ci struct cpufreq_available_frequencies *next; 2662306a36Sopenharmony_ci struct cpufreq_available_frequencies *first; 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistruct cpufreq_affected_cpus { 3162306a36Sopenharmony_ci unsigned int cpu; 3262306a36Sopenharmony_ci struct cpufreq_affected_cpus *next; 3362306a36Sopenharmony_ci struct cpufreq_affected_cpus *first; 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistruct cpufreq_stats { 3762306a36Sopenharmony_ci unsigned long frequency; 3862306a36Sopenharmony_ci unsigned long long time_in_state; 3962306a36Sopenharmony_ci struct cpufreq_stats *next; 4062306a36Sopenharmony_ci struct cpufreq_stats *first; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#ifdef __cplusplus 4662306a36Sopenharmony_ciextern "C" { 4762306a36Sopenharmony_ci#endif 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* determine current CPU frequency 5062306a36Sopenharmony_ci * - _kernel variant means kernel's opinion of CPU frequency 5162306a36Sopenharmony_ci * - _hardware variant means actual hardware CPU frequency, 5262306a36Sopenharmony_ci * which is only available to root. 5362306a36Sopenharmony_ci * 5462306a36Sopenharmony_ci * returns 0 on failure, else frequency in kHz. 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciunsigned long cpufreq_get_freq_kernel(unsigned int cpu); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciunsigned long cpufreq_get_freq_hardware(unsigned int cpu); 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define cpufreq_get(cpu) cpufreq_get_freq_kernel(cpu); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* determine CPU transition latency 6562306a36Sopenharmony_ci * 6662306a36Sopenharmony_ci * returns 0 on failure, else transition latency in 10^(-9) s = nanoseconds 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ciunsigned long cpufreq_get_transition_latency(unsigned int cpu); 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* determine hardware CPU frequency limits 7262306a36Sopenharmony_ci * 7362306a36Sopenharmony_ci * These may be limited further by thermal, energy or other 7462306a36Sopenharmony_ci * considerations by cpufreq policy notifiers in the kernel. 7562306a36Sopenharmony_ci */ 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ciint cpufreq_get_hardware_limits(unsigned int cpu, 7862306a36Sopenharmony_ci unsigned long *min, 7962306a36Sopenharmony_ci unsigned long *max); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* determine CPUfreq driver used 8362306a36Sopenharmony_ci * 8462306a36Sopenharmony_ci * Remember to call cpufreq_put_driver when no longer needed 8562306a36Sopenharmony_ci * to avoid memory leakage, please. 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cichar *cpufreq_get_driver(unsigned int cpu); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_civoid cpufreq_put_driver(char *ptr); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/* determine CPUfreq policy currently used 9462306a36Sopenharmony_ci * 9562306a36Sopenharmony_ci * Remember to call cpufreq_put_policy when no longer needed 9662306a36Sopenharmony_ci * to avoid memory leakage, please. 9762306a36Sopenharmony_ci */ 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistruct cpufreq_policy *cpufreq_get_policy(unsigned int cpu); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_civoid cpufreq_put_policy(struct cpufreq_policy *policy); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/* determine CPUfreq governors currently available 10662306a36Sopenharmony_ci * 10762306a36Sopenharmony_ci * may be modified by modprobe'ing or rmmod'ing other governors. Please 10862306a36Sopenharmony_ci * free allocated memory by calling cpufreq_put_available_governors 10962306a36Sopenharmony_ci * after use. 11062306a36Sopenharmony_ci */ 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistruct cpufreq_available_governors 11462306a36Sopenharmony_ci*cpufreq_get_available_governors(unsigned int cpu); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_civoid cpufreq_put_available_governors( 11762306a36Sopenharmony_ci struct cpufreq_available_governors *first); 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci/* determine CPU frequency states available 12162306a36Sopenharmony_ci * 12262306a36Sopenharmony_ci * Only present on _some_ ->target() cpufreq drivers. For information purposes 12362306a36Sopenharmony_ci * only. Please free allocated memory by calling 12462306a36Sopenharmony_ci * cpufreq_put_frequencies after use. 12562306a36Sopenharmony_ci */ 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistruct cpufreq_available_frequencies 12862306a36Sopenharmony_ci*cpufreq_get_available_frequencies(unsigned int cpu); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_civoid cpufreq_put_available_frequencies( 13162306a36Sopenharmony_ci struct cpufreq_available_frequencies *first); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistruct cpufreq_available_frequencies 13462306a36Sopenharmony_ci*cpufreq_get_boost_frequencies(unsigned int cpu); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_civoid cpufreq_put_boost_frequencies( 13762306a36Sopenharmony_ci struct cpufreq_available_frequencies *first); 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* determine affected CPUs 14162306a36Sopenharmony_ci * 14262306a36Sopenharmony_ci * Remember to call cpufreq_put_affected_cpus when no longer needed 14362306a36Sopenharmony_ci * to avoid memory leakage, please. 14462306a36Sopenharmony_ci */ 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistruct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned 14762306a36Sopenharmony_ci int cpu); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_civoid cpufreq_put_affected_cpus(struct cpufreq_affected_cpus *first); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* determine related CPUs 15362306a36Sopenharmony_ci * 15462306a36Sopenharmony_ci * Remember to call cpufreq_put_related_cpus when no longer needed 15562306a36Sopenharmony_ci * to avoid memory leakage, please. 15662306a36Sopenharmony_ci */ 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cistruct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned 15962306a36Sopenharmony_ci int cpu); 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_civoid cpufreq_put_related_cpus(struct cpufreq_affected_cpus *first); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci/* determine stats for cpufreq subsystem 16562306a36Sopenharmony_ci * 16662306a36Sopenharmony_ci * This is not available in all kernel versions or configurations. 16762306a36Sopenharmony_ci */ 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistruct cpufreq_stats *cpufreq_get_stats(unsigned int cpu, 17062306a36Sopenharmony_ci unsigned long long *total_time); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_civoid cpufreq_put_stats(struct cpufreq_stats *stats); 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ciunsigned long cpufreq_get_transitions(unsigned int cpu); 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* set new cpufreq policy 17862306a36Sopenharmony_ci * 17962306a36Sopenharmony_ci * Tries to set the passed policy as new policy as close as possible, 18062306a36Sopenharmony_ci * but results may differ depending e.g. on governors being available. 18162306a36Sopenharmony_ci */ 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ciint cpufreq_set_policy(unsigned int cpu, struct cpufreq_policy *policy); 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/* modify a policy by only changing min/max freq or governor 18762306a36Sopenharmony_ci * 18862306a36Sopenharmony_ci * Does not check whether result is what was intended. 18962306a36Sopenharmony_ci */ 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ciint cpufreq_modify_policy_min(unsigned int cpu, unsigned long min_freq); 19262306a36Sopenharmony_ciint cpufreq_modify_policy_max(unsigned int cpu, unsigned long max_freq); 19362306a36Sopenharmony_ciint cpufreq_modify_policy_governor(unsigned int cpu, char *governor); 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci/* set a specific frequency 19762306a36Sopenharmony_ci * 19862306a36Sopenharmony_ci * Does only work if userspace governor can be used and no external 19962306a36Sopenharmony_ci * interference (other calls to this function or to set/modify_policy) 20062306a36Sopenharmony_ci * occurs. Also does not work on ->range() cpufreq drivers. 20162306a36Sopenharmony_ci */ 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ciint cpufreq_set_frequency(unsigned int cpu, 20462306a36Sopenharmony_ci unsigned long target_frequency); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/* 20762306a36Sopenharmony_ci * get the sysfs value from specific table 20862306a36Sopenharmony_ci * 20962306a36Sopenharmony_ci * Read the value with the sysfs file name from specific table. Does 21062306a36Sopenharmony_ci * only work if the cpufreq driver has the specific sysfs interfaces. 21162306a36Sopenharmony_ci */ 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ciunsigned long cpufreq_get_sysfs_value_from_table(unsigned int cpu, 21462306a36Sopenharmony_ci const char **table, 21562306a36Sopenharmony_ci unsigned int index, 21662306a36Sopenharmony_ci unsigned int size); 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci#ifdef __cplusplus 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ci#endif 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci#endif /* _CPUFREQ_H */ 223