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