18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * cpufreq.h - definitions for libcpufreq 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2004-2009 Dominik Brodowski <linux@dominikbrodowski.de> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef __CPUPOWER_CPUFREQ_H__ 98c2ecf20Sopenharmony_ci#define __CPUPOWER_CPUFREQ_H__ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_cistruct cpufreq_policy { 128c2ecf20Sopenharmony_ci unsigned long min; 138c2ecf20Sopenharmony_ci unsigned long max; 148c2ecf20Sopenharmony_ci char *governor; 158c2ecf20Sopenharmony_ci}; 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistruct cpufreq_available_governors { 188c2ecf20Sopenharmony_ci char *governor; 198c2ecf20Sopenharmony_ci struct cpufreq_available_governors *next; 208c2ecf20Sopenharmony_ci struct cpufreq_available_governors *first; 218c2ecf20Sopenharmony_ci}; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct cpufreq_available_frequencies { 248c2ecf20Sopenharmony_ci unsigned long frequency; 258c2ecf20Sopenharmony_ci struct cpufreq_available_frequencies *next; 268c2ecf20Sopenharmony_ci struct cpufreq_available_frequencies *first; 278c2ecf20Sopenharmony_ci}; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistruct cpufreq_affected_cpus { 318c2ecf20Sopenharmony_ci unsigned int cpu; 328c2ecf20Sopenharmony_ci struct cpufreq_affected_cpus *next; 338c2ecf20Sopenharmony_ci struct cpufreq_affected_cpus *first; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistruct cpufreq_stats { 378c2ecf20Sopenharmony_ci unsigned long frequency; 388c2ecf20Sopenharmony_ci unsigned long long time_in_state; 398c2ecf20Sopenharmony_ci struct cpufreq_stats *next; 408c2ecf20Sopenharmony_ci struct cpufreq_stats *first; 418c2ecf20Sopenharmony_ci}; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#ifdef __cplusplus 468c2ecf20Sopenharmony_ciextern "C" { 478c2ecf20Sopenharmony_ci#endif 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci/* determine current CPU frequency 508c2ecf20Sopenharmony_ci * - _kernel variant means kernel's opinion of CPU frequency 518c2ecf20Sopenharmony_ci * - _hardware variant means actual hardware CPU frequency, 528c2ecf20Sopenharmony_ci * which is only available to root. 538c2ecf20Sopenharmony_ci * 548c2ecf20Sopenharmony_ci * returns 0 on failure, else frequency in kHz. 558c2ecf20Sopenharmony_ci */ 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ciunsigned long cpufreq_get_freq_kernel(unsigned int cpu); 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ciunsigned long cpufreq_get_freq_hardware(unsigned int cpu); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#define cpufreq_get(cpu) cpufreq_get_freq_kernel(cpu); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci/* determine CPU transition latency 658c2ecf20Sopenharmony_ci * 668c2ecf20Sopenharmony_ci * returns 0 on failure, else transition latency in 10^(-9) s = nanoseconds 678c2ecf20Sopenharmony_ci */ 688c2ecf20Sopenharmony_ciunsigned long cpufreq_get_transition_latency(unsigned int cpu); 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci/* determine hardware CPU frequency limits 728c2ecf20Sopenharmony_ci * 738c2ecf20Sopenharmony_ci * These may be limited further by thermal, energy or other 748c2ecf20Sopenharmony_ci * considerations by cpufreq policy notifiers in the kernel. 758c2ecf20Sopenharmony_ci */ 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ciint cpufreq_get_hardware_limits(unsigned int cpu, 788c2ecf20Sopenharmony_ci unsigned long *min, 798c2ecf20Sopenharmony_ci unsigned long *max); 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci/* determine CPUfreq driver used 838c2ecf20Sopenharmony_ci * 848c2ecf20Sopenharmony_ci * Remember to call cpufreq_put_driver when no longer needed 858c2ecf20Sopenharmony_ci * to avoid memory leakage, please. 868c2ecf20Sopenharmony_ci */ 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cichar *cpufreq_get_driver(unsigned int cpu); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_civoid cpufreq_put_driver(char *ptr); 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci/* determine CPUfreq policy currently used 948c2ecf20Sopenharmony_ci * 958c2ecf20Sopenharmony_ci * Remember to call cpufreq_put_policy when no longer needed 968c2ecf20Sopenharmony_ci * to avoid memory leakage, please. 978c2ecf20Sopenharmony_ci */ 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cistruct cpufreq_policy *cpufreq_get_policy(unsigned int cpu); 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_civoid cpufreq_put_policy(struct cpufreq_policy *policy); 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci/* determine CPUfreq governors currently available 1068c2ecf20Sopenharmony_ci * 1078c2ecf20Sopenharmony_ci * may be modified by modprobe'ing or rmmod'ing other governors. Please 1088c2ecf20Sopenharmony_ci * free allocated memory by calling cpufreq_put_available_governors 1098c2ecf20Sopenharmony_ci * after use. 1108c2ecf20Sopenharmony_ci */ 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cistruct cpufreq_available_governors 1148c2ecf20Sopenharmony_ci*cpufreq_get_available_governors(unsigned int cpu); 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_civoid cpufreq_put_available_governors( 1178c2ecf20Sopenharmony_ci struct cpufreq_available_governors *first); 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci/* determine CPU frequency states available 1218c2ecf20Sopenharmony_ci * 1228c2ecf20Sopenharmony_ci * Only present on _some_ ->target() cpufreq drivers. For information purposes 1238c2ecf20Sopenharmony_ci * only. Please free allocated memory by calling 1248c2ecf20Sopenharmony_ci * cpufreq_put_frequencies after use. 1258c2ecf20Sopenharmony_ci */ 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cistruct cpufreq_available_frequencies 1288c2ecf20Sopenharmony_ci*cpufreq_get_available_frequencies(unsigned int cpu); 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_civoid cpufreq_put_available_frequencies( 1318c2ecf20Sopenharmony_ci struct cpufreq_available_frequencies *first); 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistruct cpufreq_available_frequencies 1348c2ecf20Sopenharmony_ci*cpufreq_get_boost_frequencies(unsigned int cpu); 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_civoid cpufreq_put_boost_frequencies( 1378c2ecf20Sopenharmony_ci struct cpufreq_available_frequencies *first); 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci/* determine affected CPUs 1418c2ecf20Sopenharmony_ci * 1428c2ecf20Sopenharmony_ci * Remember to call cpufreq_put_affected_cpus when no longer needed 1438c2ecf20Sopenharmony_ci * to avoid memory leakage, please. 1448c2ecf20Sopenharmony_ci */ 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_cistruct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned 1478c2ecf20Sopenharmony_ci int cpu); 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_civoid cpufreq_put_affected_cpus(struct cpufreq_affected_cpus *first); 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci/* determine related CPUs 1538c2ecf20Sopenharmony_ci * 1548c2ecf20Sopenharmony_ci * Remember to call cpufreq_put_related_cpus when no longer needed 1558c2ecf20Sopenharmony_ci * to avoid memory leakage, please. 1568c2ecf20Sopenharmony_ci */ 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_cistruct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned 1598c2ecf20Sopenharmony_ci int cpu); 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_civoid cpufreq_put_related_cpus(struct cpufreq_affected_cpus *first); 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci/* determine stats for cpufreq subsystem 1658c2ecf20Sopenharmony_ci * 1668c2ecf20Sopenharmony_ci * This is not available in all kernel versions or configurations. 1678c2ecf20Sopenharmony_ci */ 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_cistruct cpufreq_stats *cpufreq_get_stats(unsigned int cpu, 1708c2ecf20Sopenharmony_ci unsigned long long *total_time); 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_civoid cpufreq_put_stats(struct cpufreq_stats *stats); 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ciunsigned long cpufreq_get_transitions(unsigned int cpu); 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci/* set new cpufreq policy 1788c2ecf20Sopenharmony_ci * 1798c2ecf20Sopenharmony_ci * Tries to set the passed policy as new policy as close as possible, 1808c2ecf20Sopenharmony_ci * but results may differ depending e.g. on governors being available. 1818c2ecf20Sopenharmony_ci */ 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ciint cpufreq_set_policy(unsigned int cpu, struct cpufreq_policy *policy); 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci/* modify a policy by only changing min/max freq or governor 1878c2ecf20Sopenharmony_ci * 1888c2ecf20Sopenharmony_ci * Does not check whether result is what was intended. 1898c2ecf20Sopenharmony_ci */ 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ciint cpufreq_modify_policy_min(unsigned int cpu, unsigned long min_freq); 1928c2ecf20Sopenharmony_ciint cpufreq_modify_policy_max(unsigned int cpu, unsigned long max_freq); 1938c2ecf20Sopenharmony_ciint cpufreq_modify_policy_governor(unsigned int cpu, char *governor); 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci/* set a specific frequency 1978c2ecf20Sopenharmony_ci * 1988c2ecf20Sopenharmony_ci * Does only work if userspace governor can be used and no external 1998c2ecf20Sopenharmony_ci * interference (other calls to this function or to set/modify_policy) 2008c2ecf20Sopenharmony_ci * occurs. Also does not work on ->range() cpufreq drivers. 2018c2ecf20Sopenharmony_ci */ 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ciint cpufreq_set_frequency(unsigned int cpu, 2048c2ecf20Sopenharmony_ci unsigned long target_frequency); 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci#ifdef __cplusplus 2078c2ecf20Sopenharmony_ci} 2088c2ecf20Sopenharmony_ci#endif 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci#endif /* _CPUFREQ_H */ 211