cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cpufreq.h (5491B)


      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/*
    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
    213unsigned 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 */