linux/tools/power/cpupower/lib/cpufreq.h
<<
>>
Prefs
   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_available_frequencies {
  24        unsigned long frequency;
  25        struct cpufreq_available_frequencies *next;
  26        struct cpufreq_available_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_available_frequencies
 128*cpufreq_get_available_frequencies(unsigned int cpu);
 129
 130void cpufreq_put_available_frequencies(
 131                struct cpufreq_available_frequencies *first);
 132
 133struct cpufreq_available_frequencies
 134*cpufreq_get_boost_frequencies(unsigned int cpu);
 135
 136void 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
 146struct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned
 147                                                        int cpu);
 148
 149void 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
 158struct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned
 159                                                        int cpu);
 160
 161void 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
 169struct cpufreq_stats *cpufreq_get_stats(unsigned int cpu,
 170                                        unsigned long long *total_time);
 171
 172void cpufreq_put_stats(struct cpufreq_stats *stats);
 173
 174unsigned 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
 183int 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
 191int cpufreq_modify_policy_min(unsigned int cpu, unsigned long min_freq);
 192int cpufreq_modify_policy_max(unsigned int cpu, unsigned long max_freq);
 193int 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
 203int cpufreq_set_frequency(unsigned int cpu,
 204                                unsigned long target_frequency);
 205
 206#ifdef __cplusplus
 207}
 208#endif
 209
 210#endif /* _CPUFREQ_H */
 211