1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * cpufreq.h - definitions for libcpufreq 4 * 5 * Copyright (C) 2004-2009 Dominik Brodowski <linux@dominikbrodowski.de> 6 */ 7 8 #ifndef __CPUPOWER_CPUFREQ_H__ 9 #define __CPUPOWER_CPUFREQ_H__ 10 11 struct cpufreq_policy { 12 unsigned long min; 13 unsigned long max; 14 char *governor; 15 }; 16 17 struct cpufreq_available_governors { 18 char *governor; 19 struct cpufreq_available_governors *next; 20 struct cpufreq_available_governors *first; 21 }; 22 23 struct cpufreq_frequencies { 24 unsigned long frequency; 25 struct cpufreq_frequencies *next; 26 struct cpufreq_frequencies *first; 27 }; 28 29 30 struct cpufreq_affected_cpus { 31 unsigned int cpu; 32 struct cpufreq_affected_cpus *next; 33 struct cpufreq_affected_cpus *first; 34 }; 35 36 struct cpufreq_stats { 37 unsigned long frequency; 38 unsigned long long time_in_state; 39 struct cpufreq_stats *next; 40 struct cpufreq_stats *first; 41 }; 42 43 44 45 #ifdef __cplusplus 46 extern "C" { 47 #endif 48 49 /* determine current CPU frequency 50 * - _kernel variant means kernel's opinion of CPU frequency 51 * - _hardware variant means actual hardware CPU frequency, 52 * which is only available to root. 53 * 54 * returns 0 on failure, else frequency in kHz. 55 */ 56 57 unsigned long cpufreq_get_freq_kernel(unsigned int cpu); 58 59 unsigned long cpufreq_get_freq_hardware(unsigned int cpu); 60 61 #define cpufreq_get(cpu) cpufreq_get_freq_kernel(cpu); 62 63 64 /* determine CPU transition latency 65 * 66 * returns 0 on failure, else transition latency in 10^(-9) s = nanoseconds 67 */ 68 unsigned long cpufreq_get_transition_latency(unsigned int cpu); 69 70 71 /* determine hardware CPU frequency limits 72 * 73 * These may be limited further by thermal, energy or other 74 * considerations by cpufreq policy notifiers in the kernel. 75 */ 76 77 int cpufreq_get_hardware_limits(unsigned int cpu, 78 unsigned long *min, 79 unsigned long *max); 80 81 82 /* determine CPUfreq driver used 83 * 84 * Remember to call cpufreq_put_driver when no longer needed 85 * to avoid memory leakage, please. 86 */ 87 88 char *cpufreq_get_driver(unsigned int cpu); 89 90 void cpufreq_put_driver(char *ptr); 91 92 93 /* determine CPUfreq policy currently used 94 * 95 * Remember to call cpufreq_put_policy when no longer needed 96 * to avoid memory leakage, please. 97 */ 98 99 100 struct cpufreq_policy *cpufreq_get_policy(unsigned int cpu); 101 102 void cpufreq_put_policy(struct cpufreq_policy *policy); 103 104 105 /* determine CPUfreq governors currently available 106 * 107 * may be modified by modprobe'ing or rmmod'ing other governors. Please 108 * free allocated memory by calling cpufreq_put_available_governors 109 * after use. 110 */ 111 112 113 struct cpufreq_available_governors 114 *cpufreq_get_available_governors(unsigned int cpu); 115 116 void cpufreq_put_available_governors( 117 struct cpufreq_available_governors *first); 118 119 120 /* determine CPU frequency states available 121 * 122 * Only present on _some_ ->target() cpufreq drivers. For information purposes 123 * only. Please free allocated memory by calling 124 * cpufreq_put_frequencies after use. 125 */ 126 127 struct cpufreq_frequencies 128 *cpufreq_get_frequencies(const char *type, unsigned int cpu); 129 130 void cpufreq_put_frequencies( 131 struct cpufreq_frequencies *first); 132 133 134 /* determine affected CPUs 135 * 136 * Remember to call cpufreq_put_affected_cpus when no longer needed 137 * to avoid memory leakage, please. 138 */ 139 140 struct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned 141 int cpu); 142 143 void cpufreq_put_affected_cpus(struct cpufreq_affected_cpus *first); 144 145 146 /* determine related CPUs 147 * 148 * Remember to call cpufreq_put_related_cpus when no longer needed 149 * to avoid memory leakage, please. 150 */ 151 152 struct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned 153 int cpu); 154 155 void cpufreq_put_related_cpus(struct cpufreq_affected_cpus *first); 156 157 158 /* determine stats for cpufreq subsystem 159 * 160 * This is not available in all kernel versions or configurations. 161 */ 162 163 struct cpufreq_stats *cpufreq_get_stats(unsigned int cpu, 164 unsigned long long *total_time); 165 166 void cpufreq_put_stats(struct cpufreq_stats *stats); 167 168 unsigned long cpufreq_get_transitions(unsigned int cpu); 169 170 171 /* set new cpufreq policy 172 * 173 * Tries to set the passed policy as new policy as close as possible, 174 * but results may differ depending e.g. on governors being available. 175 */ 176 177 int cpufreq_set_policy(unsigned int cpu, struct cpufreq_policy *policy); 178 179 180 /* modify a policy by only changing min/max freq or governor 181 * 182 * Does not check whether result is what was intended. 183 */ 184 185 int cpufreq_modify_policy_min(unsigned int cpu, unsigned long min_freq); 186 int cpufreq_modify_policy_max(unsigned int cpu, unsigned long max_freq); 187 int cpufreq_modify_policy_governor(unsigned int cpu, char *governor); 188 189 190 /* set a specific frequency 191 * 192 * Does only work if userspace governor can be used and no external 193 * interference (other calls to this function or to set/modify_policy) 194 * occurs. Also does not work on ->range() cpufreq drivers. 195 */ 196 197 int cpufreq_set_frequency(unsigned int cpu, 198 unsigned long target_frequency); 199 200 #ifdef __cplusplus 201 } 202 #endif 203 204 #endif /* _CPUFREQ_H */ 205