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_available_frequencies { 24 unsigned long frequency; 25 struct cpufreq_available_frequencies *next; 26 struct cpufreq_available_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_available_frequencies 128 *cpufreq_get_available_frequencies(unsigned int cpu); 129 130 void cpufreq_put_available_frequencies( 131 struct cpufreq_available_frequencies *first); 132 133 struct cpufreq_available_frequencies 134 *cpufreq_get_boost_frequencies(unsigned int cpu); 135 136 void cpufreq_put_boost_frequencies( 137 struct cpufreq_available_frequencies *first); 138 139 140 /* determine affected CPUs 141 * 142 * Remember to call cpufreq_put_affected_cpus when no longer needed 143 * to avoid memory leakage, please. 144 */ 145 146 struct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned 147 int cpu); 148 149 void cpufreq_put_affected_cpus(struct cpufreq_affected_cpus *first); 150 151 152 /* determine related CPUs 153 * 154 * Remember to call cpufreq_put_related_cpus when no longer needed 155 * to avoid memory leakage, please. 156 */ 157 158 struct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned 159 int cpu); 160 161 void cpufreq_put_related_cpus(struct cpufreq_affected_cpus *first); 162 163 164 /* determine stats for cpufreq subsystem 165 * 166 * This is not available in all kernel versions or configurations. 167 */ 168 169 struct cpufreq_stats *cpufreq_get_stats(unsigned int cpu, 170 unsigned long long *total_time); 171 172 void cpufreq_put_stats(struct cpufreq_stats *stats); 173 174 unsigned long cpufreq_get_transitions(unsigned int cpu); 175 176 177 /* set new cpufreq policy 178 * 179 * Tries to set the passed policy as new policy as close as possible, 180 * but results may differ depending e.g. on governors being available. 181 */ 182 183 int cpufreq_set_policy(unsigned int cpu, struct cpufreq_policy *policy); 184 185 186 /* modify a policy by only changing min/max freq or governor 187 * 188 * Does not check whether result is what was intended. 189 */ 190 191 int cpufreq_modify_policy_min(unsigned int cpu, unsigned long min_freq); 192 int cpufreq_modify_policy_max(unsigned int cpu, unsigned long max_freq); 193 int cpufreq_modify_policy_governor(unsigned int cpu, char *governor); 194 195 196 /* set a specific frequency 197 * 198 * Does only work if userspace governor can be used and no external 199 * interference (other calls to this function or to set/modify_policy) 200 * occurs. Also does not work on ->range() cpufreq drivers. 201 */ 202 203 int cpufreq_set_frequency(unsigned int cpu, 204 unsigned long target_frequency); 205 206 /* 207 * get the sysfs value from specific table 208 * 209 * Read the value with the sysfs file name from specific table. Does 210 * only work if the cpufreq driver has the specific sysfs interfaces. 211 */ 212 213 unsigned long cpufreq_get_sysfs_value_from_table(unsigned int cpu, 214 const char **table, 215 unsigned int index, 216 unsigned int size); 217 218 #ifdef __cplusplus 219 } 220 #endif 221 222 #endif /* _CPUFREQ_H */ 223