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