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