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 11struct cpufreq_policy { 12 unsigned long min; 13 unsigned long max; 14 char *governor; 15}; 16 17struct cpufreq_available_governors { 18 char *governor; 19 struct cpufreq_available_governors *next; 20 struct cpufreq_available_governors *first; 21}; 22 23struct cpufreq_frequencies { 24 unsigned long frequency; 25 struct cpufreq_frequencies *next; 26 struct cpufreq_frequencies *first; 27}; 28 29 30struct cpufreq_affected_cpus { 31 unsigned int cpu; 32 struct cpufreq_affected_cpus *next; 33 struct cpufreq_affected_cpus *first; 34}; 35 36struct 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 46extern "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 57unsigned long cpufreq_get_freq_kernel(unsigned int cpu); 58 59unsigned 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 */ 68unsigned 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 77int 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 88char *cpufreq_get_driver(unsigned int cpu); 89 90void 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 100struct cpufreq_policy *cpufreq_get_policy(unsigned int cpu); 101 102void 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 113struct cpufreq_available_governors 114*cpufreq_get_available_governors(unsigned int cpu); 115 116void 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 127struct cpufreq_frequencies 128*cpufreq_get_frequencies(const char *type, unsigned int cpu); 129 130void 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 140struct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned 141 int cpu); 142 143void 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 152struct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned 153 int cpu); 154 155void 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 163struct cpufreq_stats *cpufreq_get_stats(unsigned int cpu, 164 unsigned long long *total_time); 165 166void cpufreq_put_stats(struct cpufreq_stats *stats); 167 168unsigned 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 177int 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 185int cpufreq_modify_policy_min(unsigned int cpu, unsigned long min_freq); 186int cpufreq_modify_policy_max(unsigned int cpu, unsigned long max_freq); 187int 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 197int cpufreq_set_frequency(unsigned int cpu, 198 unsigned long target_frequency); 199 200#ifdef __cplusplus 201} 202#endif 203 204#endif /* _CPUFREQ_H */ 205