linux/include/linux/cpufreq.h
<<
>>
Prefs
   1/*
   2 *  linux/include/linux/cpufreq.h
   3 *
   4 *  Copyright (C) 2001 Russell King
   5 *            (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11#ifndef _LINUX_CPUFREQ_H
  12#define _LINUX_CPUFREQ_H
  13
  14#include <linux/mutex.h>
  15#include <linux/notifier.h>
  16#include <linux/threads.h>
  17#include <linux/kobject.h>
  18#include <linux/sysfs.h>
  19#include <linux/completion.h>
  20#include <linux/workqueue.h>
  21#include <linux/cpumask.h>
  22#include <asm/div64.h>
  23
  24#define CPUFREQ_NAME_LEN 16
  25
  26
  27/*********************************************************************
  28 *                     CPUFREQ NOTIFIER INTERFACE                    *
  29 *********************************************************************/
  30
  31#define CPUFREQ_TRANSITION_NOTIFIER     (0)
  32#define CPUFREQ_POLICY_NOTIFIER         (1)
  33
  34#ifdef CONFIG_CPU_FREQ
  35int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list);
  36int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);
  37extern void disable_cpufreq(void);
  38#else           /* CONFIG_CPU_FREQ */
  39static inline int cpufreq_register_notifier(struct notifier_block *nb,
  40                                                unsigned int list)
  41{
  42        return 0;
  43}
  44static inline int cpufreq_unregister_notifier(struct notifier_block *nb,
  45                                                unsigned int list)
  46{
  47        return 0;
  48}
  49static inline void disable_cpufreq(void) { }
  50#endif          /* CONFIG_CPU_FREQ */
  51
  52/* if (cpufreq_driver->target) exists, the ->governor decides what frequency
  53 * within the limits is used. If (cpufreq_driver->setpolicy> exists, these
  54 * two generic policies are available:
  55 */
  56
  57#define CPUFREQ_POLICY_POWERSAVE        (1)
  58#define CPUFREQ_POLICY_PERFORMANCE      (2)
  59
  60/* Frequency values here are CPU kHz so that hardware which doesn't run
  61 * with some frequencies can complain without having to guess what per
  62 * cent / per mille means.
  63 * Maximum transition latency is in nanoseconds - if it's unknown,
  64 * CPUFREQ_ETERNAL shall be used.
  65 */
  66
  67struct cpufreq_governor;
  68
  69/* /sys/devices/system/cpu/cpufreq: entry point for global variables */
  70extern struct kobject *cpufreq_global_kobject;
  71
  72#define CPUFREQ_ETERNAL                 (-1)
  73struct cpufreq_cpuinfo {
  74        unsigned int            max_freq;
  75        unsigned int            min_freq;
  76
  77        /* in 10^(-9) s = nanoseconds */
  78        unsigned int            transition_latency;
  79};
  80
  81struct cpufreq_real_policy {
  82        unsigned int            min;    /* in kHz */
  83        unsigned int            max;    /* in kHz */
  84        unsigned int            policy; /* see above */
  85        struct cpufreq_governor *governor; /* see below */
  86};
  87
  88struct cpufreq_policy {
  89        cpumask_var_t           cpus;   /* CPUs requiring sw coordination */
  90        cpumask_var_t           related_cpus; /* CPUs with any coordination */
  91        unsigned int            shared_type; /* ANY or ALL affected CPUs
  92                                                should set cpufreq */
  93        unsigned int            cpu;    /* cpu nr of registered CPU */
  94        struct cpufreq_cpuinfo  cpuinfo;/* see above */
  95
  96        unsigned int            min;    /* in kHz */
  97        unsigned int            max;    /* in kHz */
  98        unsigned int            cur;    /* in kHz, only needed if cpufreq
  99                                         * governors are used */
 100        unsigned int            policy; /* see above */
 101        struct cpufreq_governor *governor; /* see below */
 102
 103        struct work_struct      update; /* if update_policy() needs to be
 104                                         * called, but you're in IRQ context */
 105
 106        struct cpufreq_real_policy      user_policy;
 107
 108        struct kobject          kobj;
 109        struct completion       kobj_unregister;
 110};
 111
 112#define CPUFREQ_ADJUST          (0)
 113#define CPUFREQ_INCOMPATIBLE    (1)
 114#define CPUFREQ_NOTIFY          (2)
 115#define CPUFREQ_START           (3)
 116
 117#define CPUFREQ_SHARED_TYPE_NONE (0) /* None */
 118#define CPUFREQ_SHARED_TYPE_HW   (1) /* HW does needed coordination */
 119#define CPUFREQ_SHARED_TYPE_ALL  (2) /* All dependent CPUs should set freq */
 120#define CPUFREQ_SHARED_TYPE_ANY  (3) /* Freq can be set from any dependent CPU*/
 121
 122/******************** cpufreq transition notifiers *******************/
 123
 124#define CPUFREQ_PRECHANGE       (0)
 125#define CPUFREQ_POSTCHANGE      (1)
 126#define CPUFREQ_RESUMECHANGE    (8)
 127#define CPUFREQ_SUSPENDCHANGE   (9)
 128
 129struct cpufreq_freqs {
 130        unsigned int cpu;       /* cpu nr */
 131        unsigned int old;
 132        unsigned int new;
 133        u8 flags;               /* flags of cpufreq_driver, see below. */
 134};
 135
 136
 137/**
 138 * cpufreq_scale - "old * mult / div" calculation for large values (32-bit-arch safe)
 139 * @old:   old value
 140 * @div:   divisor
 141 * @mult:  multiplier
 142 *
 143 *
 144 *    new = old * mult / div
 145 */
 146static inline unsigned long cpufreq_scale(unsigned long old, u_int div, u_int mult)
 147{
 148#if BITS_PER_LONG == 32
 149
 150        u64 result = ((u64) old) * ((u64) mult);
 151        do_div(result, div);
 152        return (unsigned long) result;
 153
 154#elif BITS_PER_LONG == 64
 155
 156        unsigned long result = old * ((u64) mult);
 157        result /= div;
 158        return result;
 159
 160#endif
 161};
 162
 163/*********************************************************************
 164 *                          CPUFREQ GOVERNORS                        *
 165 *********************************************************************/
 166
 167#define CPUFREQ_GOV_START  1
 168#define CPUFREQ_GOV_STOP   2
 169#define CPUFREQ_GOV_LIMITS 3
 170
 171struct cpufreq_governor {
 172        char    name[CPUFREQ_NAME_LEN];
 173        int     (*governor)     (struct cpufreq_policy *policy,
 174                                 unsigned int event);
 175        ssize_t (*show_setspeed)        (struct cpufreq_policy *policy,
 176                                         char *buf);
 177        int     (*store_setspeed)       (struct cpufreq_policy *policy,
 178                                         unsigned int freq);
 179        unsigned int max_transition_latency; /* HW must be able to switch to
 180                        next freq faster than this value in nano secs or we
 181                        will fallback to performance governor */
 182        struct list_head        governor_list;
 183        struct module           *owner;
 184};
 185
 186/*
 187 * Pass a target to the cpufreq driver.
 188 */
 189extern int cpufreq_driver_target(struct cpufreq_policy *policy,
 190                                 unsigned int target_freq,
 191                                 unsigned int relation);
 192extern int __cpufreq_driver_target(struct cpufreq_policy *policy,
 193                                   unsigned int target_freq,
 194                                   unsigned int relation);
 195
 196
 197extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy,
 198                                   unsigned int cpu);
 199
 200int cpufreq_register_governor(struct cpufreq_governor *governor);
 201void cpufreq_unregister_governor(struct cpufreq_governor *governor);
 202
 203
 204/*********************************************************************
 205 *                      CPUFREQ DRIVER INTERFACE                     *
 206 *********************************************************************/
 207
 208#define CPUFREQ_RELATION_L 0  /* lowest frequency at or above target */
 209#define CPUFREQ_RELATION_H 1  /* highest frequency below or at target */
 210
 211struct freq_attr;
 212
 213struct cpufreq_driver {
 214        struct module           *owner;
 215        char                    name[CPUFREQ_NAME_LEN];
 216        u8                      flags;
 217
 218        /* needed by all drivers */
 219        int     (*init)         (struct cpufreq_policy *policy);
 220        int     (*verify)       (struct cpufreq_policy *policy);
 221
 222        /* define one out of two */
 223        int     (*setpolicy)    (struct cpufreq_policy *policy);
 224        int     (*target)       (struct cpufreq_policy *policy,
 225                                 unsigned int target_freq,
 226                                 unsigned int relation);
 227
 228        /* should be defined, if possible */
 229        unsigned int    (*get)  (unsigned int cpu);
 230
 231        /* optional */
 232        unsigned int (*getavg)  (struct cpufreq_policy *policy,
 233                                 unsigned int cpu);
 234        int     (*bios_limit)   (int cpu, unsigned int *limit);
 235
 236        int     (*exit)         (struct cpufreq_policy *policy);
 237        int     (*suspend)      (struct cpufreq_policy *policy);
 238        int     (*resume)       (struct cpufreq_policy *policy);
 239        struct freq_attr        **attr;
 240};
 241
 242/* flags */
 243
 244#define CPUFREQ_STICKY          0x01    /* the driver isn't removed even if
 245                                         * all ->init() calls failed */
 246#define CPUFREQ_CONST_LOOPS     0x02    /* loops_per_jiffy or other kernel
 247                                         * "constants" aren't affected by
 248                                         * frequency transitions */
 249#define CPUFREQ_PM_NO_WARN      0x04    /* don't warn on suspend/resume speed
 250                                         * mismatches */
 251
 252int cpufreq_register_driver(struct cpufreq_driver *driver_data);
 253int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
 254
 255
 256void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state);
 257
 258
 259static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned int min, unsigned int max)
 260{
 261        if (policy->min < min)
 262                policy->min = min;
 263        if (policy->max < min)
 264                policy->max = min;
 265        if (policy->min > max)
 266                policy->min = max;
 267        if (policy->max > max)
 268                policy->max = max;
 269        if (policy->min > policy->max)
 270                policy->min = policy->max;
 271        return;
 272}
 273
 274struct freq_attr {
 275        struct attribute attr;
 276        ssize_t (*show)(struct cpufreq_policy *, char *);
 277        ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);
 278};
 279
 280#define cpufreq_freq_attr_ro(_name)             \
 281static struct freq_attr _name =                 \
 282__ATTR(_name, 0444, show_##_name, NULL)
 283
 284#define cpufreq_freq_attr_ro_perm(_name, _perm) \
 285static struct freq_attr _name =                 \
 286__ATTR(_name, _perm, show_##_name, NULL)
 287
 288#define cpufreq_freq_attr_rw(_name)             \
 289static struct freq_attr _name =                 \
 290__ATTR(_name, 0644, show_##_name, store_##_name)
 291
 292struct global_attr {
 293        struct attribute attr;
 294        ssize_t (*show)(struct kobject *kobj,
 295                        struct attribute *attr, char *buf);
 296        ssize_t (*store)(struct kobject *a, struct attribute *b,
 297                         const char *c, size_t count);
 298};
 299
 300#define define_one_global_ro(_name)             \
 301static struct global_attr _name =               \
 302__ATTR(_name, 0444, show_##_name, NULL)
 303
 304#define define_one_global_rw(_name)             \
 305static struct global_attr _name =               \
 306__ATTR(_name, 0644, show_##_name, store_##_name)
 307
 308
 309/*********************************************************************
 310 *                        CPUFREQ 2.6. INTERFACE                     *
 311 *********************************************************************/
 312int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
 313int cpufreq_update_policy(unsigned int cpu);
 314
 315#ifdef CONFIG_CPU_FREQ
 316/* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */
 317unsigned int cpufreq_get(unsigned int cpu);
 318#else
 319static inline unsigned int cpufreq_get(unsigned int cpu)
 320{
 321        return 0;
 322}
 323#endif
 324
 325/* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */
 326#ifdef CONFIG_CPU_FREQ
 327unsigned int cpufreq_quick_get(unsigned int cpu);
 328unsigned int cpufreq_quick_get_max(unsigned int cpu);
 329#else
 330static inline unsigned int cpufreq_quick_get(unsigned int cpu)
 331{
 332        return 0;
 333}
 334static inline unsigned int cpufreq_quick_get_max(unsigned int cpu)
 335{
 336        return 0;
 337}
 338#endif
 339
 340
 341/*********************************************************************
 342 *                       CPUFREQ DEFAULT GOVERNOR                    *
 343 *********************************************************************/
 344
 345
 346/*
 347  Performance governor is fallback governor if any other gov failed to
 348  auto load due latency restrictions
 349*/
 350#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
 351extern struct cpufreq_governor cpufreq_gov_performance;
 352#endif
 353#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
 354#define CPUFREQ_DEFAULT_GOVERNOR        (&cpufreq_gov_performance)
 355#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE)
 356extern struct cpufreq_governor cpufreq_gov_powersave;
 357#define CPUFREQ_DEFAULT_GOVERNOR        (&cpufreq_gov_powersave)
 358#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE)
 359extern struct cpufreq_governor cpufreq_gov_userspace;
 360#define CPUFREQ_DEFAULT_GOVERNOR        (&cpufreq_gov_userspace)
 361#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND)
 362extern struct cpufreq_governor cpufreq_gov_ondemand;
 363#define CPUFREQ_DEFAULT_GOVERNOR        (&cpufreq_gov_ondemand)
 364#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE)
 365extern struct cpufreq_governor cpufreq_gov_conservative;
 366#define CPUFREQ_DEFAULT_GOVERNOR        (&cpufreq_gov_conservative)
 367#endif
 368
 369
 370/*********************************************************************
 371 *                     FREQUENCY TABLE HELPERS                       *
 372 *********************************************************************/
 373
 374#define CPUFREQ_ENTRY_INVALID ~0
 375#define CPUFREQ_TABLE_END     ~1
 376
 377struct cpufreq_frequency_table {
 378        unsigned int    index;     /* any */
 379        unsigned int    frequency; /* kHz - doesn't need to be in ascending
 380                                    * order */
 381};
 382
 383int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 384                                    struct cpufreq_frequency_table *table);
 385
 386int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
 387                                   struct cpufreq_frequency_table *table);
 388
 389int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 390                                   struct cpufreq_frequency_table *table,
 391                                   unsigned int target_freq,
 392                                   unsigned int relation,
 393                                   unsigned int *index);
 394
 395/* the following 3 funtions are for cpufreq core use only */
 396struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 397struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu);
 398void   cpufreq_cpu_put(struct cpufreq_policy *data);
 399
 400/* the following are really really optional */
 401extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
 402
 403void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 404                                      unsigned int cpu);
 405
 406void cpufreq_frequency_table_put_attr(unsigned int cpu);
 407
 408
 409#endif /* _LINUX_CPUFREQ_H */
 410