root/include/linux/cpuidle.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. cpuidle_get_device
  2. disable_cpuidle
  3. cpuidle_not_available
  4. cpuidle_select
  5. cpuidle_enter
  6. cpuidle_reflect
  7. cpuidle_poll_time
  8. cpuidle_register_driver
  9. cpuidle_get_driver
  10. cpuidle_driver_ref
  11. cpuidle_driver_unref
  12. cpuidle_unregister_driver
  13. cpuidle_register_device
  14. cpuidle_unregister_device
  15. cpuidle_register
  16. cpuidle_unregister
  17. cpuidle_pause_and_lock
  18. cpuidle_resume_and_unlock
  19. cpuidle_pause
  20. cpuidle_resume
  21. cpuidle_enable_device
  22. cpuidle_disable_device
  23. cpuidle_play_dead
  24. cpuidle_get_cpu_driver
  25. cpuidle_get_device
  26. cpuidle_find_deepest_state
  27. cpuidle_enter_s2idle
  28. cpuidle_use_deepest_state
  29. cpuidle_coupled_parallel_barrier
  30. cpuidle_poll_state_init
  31. cpuidle_register_governor

   1 /*
   2  * cpuidle.h - a generic framework for CPU idle power management
   3  *
   4  * (C) 2007 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
   5  *          Shaohua Li <shaohua.li@intel.com>
   6  *          Adam Belay <abelay@novell.com>
   7  *
   8  * This code is licenced under the GPL.
   9  */
  10 
  11 #ifndef _LINUX_CPUIDLE_H
  12 #define _LINUX_CPUIDLE_H
  13 
  14 #include <linux/percpu.h>
  15 #include <linux/list.h>
  16 #include <linux/hrtimer.h>
  17 
  18 #define CPUIDLE_STATE_MAX       10
  19 #define CPUIDLE_NAME_LEN        16
  20 #define CPUIDLE_DESC_LEN        32
  21 
  22 struct module;
  23 
  24 struct cpuidle_device;
  25 struct cpuidle_driver;
  26 
  27 
  28 /****************************
  29  * CPUIDLE DEVICE INTERFACE *
  30  ****************************/
  31 
  32 struct cpuidle_state_usage {
  33         unsigned long long      disable;
  34         unsigned long long      usage;
  35         unsigned long long      time; /* in US */
  36         unsigned long long      above; /* Number of times it's been too deep */
  37         unsigned long long      below; /* Number of times it's been too shallow */
  38 #ifdef CONFIG_SUSPEND
  39         unsigned long long      s2idle_usage;
  40         unsigned long long      s2idle_time; /* in US */
  41 #endif
  42 };
  43 
  44 struct cpuidle_state {
  45         char            name[CPUIDLE_NAME_LEN];
  46         char            desc[CPUIDLE_DESC_LEN];
  47 
  48         unsigned int    flags;
  49         unsigned int    exit_latency; /* in US */
  50         int             power_usage; /* in mW */
  51         unsigned int    target_residency; /* in US */
  52         bool            disabled; /* disabled on all CPUs */
  53 
  54         int (*enter)    (struct cpuidle_device *dev,
  55                         struct cpuidle_driver *drv,
  56                         int index);
  57 
  58         int (*enter_dead) (struct cpuidle_device *dev, int index);
  59 
  60         /*
  61          * CPUs execute ->enter_s2idle with the local tick or entire timekeeping
  62          * suspended, so it must not re-enable interrupts at any point (even
  63          * temporarily) or attempt to change states of clock event devices.
  64          */
  65         void (*enter_s2idle) (struct cpuidle_device *dev,
  66                               struct cpuidle_driver *drv,
  67                               int index);
  68 };
  69 
  70 /* Idle State Flags */
  71 #define CPUIDLE_FLAG_NONE       (0x00)
  72 #define CPUIDLE_FLAG_POLLING    BIT(0) /* polling state */
  73 #define CPUIDLE_FLAG_COUPLED    BIT(1) /* state applies to multiple cpus */
  74 #define CPUIDLE_FLAG_TIMER_STOP BIT(2) /* timer is stopped on this state */
  75 
  76 struct cpuidle_device_kobj;
  77 struct cpuidle_state_kobj;
  78 struct cpuidle_driver_kobj;
  79 
  80 struct cpuidle_device {
  81         unsigned int            registered:1;
  82         unsigned int            enabled:1;
  83         unsigned int            use_deepest_state:1;
  84         unsigned int            poll_time_limit:1;
  85         unsigned int            cpu;
  86         ktime_t                 next_hrtimer;
  87 
  88         int                     last_state_idx;
  89         int                     last_residency;
  90         u64                     poll_limit_ns;
  91         struct cpuidle_state_usage      states_usage[CPUIDLE_STATE_MAX];
  92         struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
  93         struct cpuidle_driver_kobj *kobj_driver;
  94         struct cpuidle_device_kobj *kobj_dev;
  95         struct list_head        device_list;
  96 
  97 #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
  98         cpumask_t               coupled_cpus;
  99         struct cpuidle_coupled  *coupled;
 100 #endif
 101 };
 102 
 103 DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices);
 104 DECLARE_PER_CPU(struct cpuidle_device, cpuidle_dev);
 105 
 106 /****************************
 107  * CPUIDLE DRIVER INTERFACE *
 108  ****************************/
 109 
 110 struct cpuidle_driver {
 111         const char              *name;
 112         struct module           *owner;
 113         int                     refcnt;
 114 
 115         /* used by the cpuidle framework to setup the broadcast timer */
 116         unsigned int            bctimer:1;
 117         /* states array must be ordered in decreasing power consumption */
 118         struct cpuidle_state    states[CPUIDLE_STATE_MAX];
 119         int                     state_count;
 120         int                     safe_state_index;
 121 
 122         /* the driver handles the cpus in cpumask */
 123         struct cpumask          *cpumask;
 124 
 125         /* preferred governor to switch at register time */
 126         const char              *governor;
 127 };
 128 
 129 #ifdef CONFIG_CPU_IDLE
 130 extern void disable_cpuidle(void);
 131 extern bool cpuidle_not_available(struct cpuidle_driver *drv,
 132                                   struct cpuidle_device *dev);
 133 
 134 extern int cpuidle_select(struct cpuidle_driver *drv,
 135                           struct cpuidle_device *dev,
 136                           bool *stop_tick);
 137 extern int cpuidle_enter(struct cpuidle_driver *drv,
 138                          struct cpuidle_device *dev, int index);
 139 extern void cpuidle_reflect(struct cpuidle_device *dev, int index);
 140 extern u64 cpuidle_poll_time(struct cpuidle_driver *drv,
 141                              struct cpuidle_device *dev);
 142 
 143 extern int cpuidle_register_driver(struct cpuidle_driver *drv);
 144 extern struct cpuidle_driver *cpuidle_get_driver(void);
 145 extern struct cpuidle_driver *cpuidle_driver_ref(void);
 146 extern void cpuidle_driver_unref(void);
 147 extern void cpuidle_unregister_driver(struct cpuidle_driver *drv);
 148 extern int cpuidle_register_device(struct cpuidle_device *dev);
 149 extern void cpuidle_unregister_device(struct cpuidle_device *dev);
 150 extern int cpuidle_register(struct cpuidle_driver *drv,
 151                             const struct cpumask *const coupled_cpus);
 152 extern void cpuidle_unregister(struct cpuidle_driver *drv);
 153 extern void cpuidle_pause_and_lock(void);
 154 extern void cpuidle_resume_and_unlock(void);
 155 extern void cpuidle_pause(void);
 156 extern void cpuidle_resume(void);
 157 extern int cpuidle_enable_device(struct cpuidle_device *dev);
 158 extern void cpuidle_disable_device(struct cpuidle_device *dev);
 159 extern int cpuidle_play_dead(void);
 160 
 161 extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev);
 162 static inline struct cpuidle_device *cpuidle_get_device(void)
 163 {return __this_cpu_read(cpuidle_devices); }
 164 #else
 165 static inline void disable_cpuidle(void) { }
 166 static inline bool cpuidle_not_available(struct cpuidle_driver *drv,
 167                                          struct cpuidle_device *dev)
 168 {return true; }
 169 static inline int cpuidle_select(struct cpuidle_driver *drv,
 170                                  struct cpuidle_device *dev, bool *stop_tick)
 171 {return -ENODEV; }
 172 static inline int cpuidle_enter(struct cpuidle_driver *drv,
 173                                 struct cpuidle_device *dev, int index)
 174 {return -ENODEV; }
 175 static inline void cpuidle_reflect(struct cpuidle_device *dev, int index) { }
 176 static inline u64 cpuidle_poll_time(struct cpuidle_driver *drv,
 177                              struct cpuidle_device *dev)
 178 {return 0; }
 179 static inline int cpuidle_register_driver(struct cpuidle_driver *drv)
 180 {return -ENODEV; }
 181 static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; }
 182 static inline struct cpuidle_driver *cpuidle_driver_ref(void) {return NULL; }
 183 static inline void cpuidle_driver_unref(void) {}
 184 static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { }
 185 static inline int cpuidle_register_device(struct cpuidle_device *dev)
 186 {return -ENODEV; }
 187 static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { }
 188 static inline int cpuidle_register(struct cpuidle_driver *drv,
 189                                    const struct cpumask *const coupled_cpus)
 190 {return -ENODEV; }
 191 static inline void cpuidle_unregister(struct cpuidle_driver *drv) { }
 192 static inline void cpuidle_pause_and_lock(void) { }
 193 static inline void cpuidle_resume_and_unlock(void) { }
 194 static inline void cpuidle_pause(void) { }
 195 static inline void cpuidle_resume(void) { }
 196 static inline int cpuidle_enable_device(struct cpuidle_device *dev)
 197 {return -ENODEV; }
 198 static inline void cpuidle_disable_device(struct cpuidle_device *dev) { }
 199 static inline int cpuidle_play_dead(void) {return -ENODEV; }
 200 static inline struct cpuidle_driver *cpuidle_get_cpu_driver(
 201         struct cpuidle_device *dev) {return NULL; }
 202 static inline struct cpuidle_device *cpuidle_get_device(void) {return NULL; }
 203 #endif
 204 
 205 #ifdef CONFIG_CPU_IDLE
 206 extern int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
 207                                       struct cpuidle_device *dev);
 208 extern int cpuidle_enter_s2idle(struct cpuidle_driver *drv,
 209                                 struct cpuidle_device *dev);
 210 extern void cpuidle_use_deepest_state(bool enable);
 211 #else
 212 static inline int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
 213                                              struct cpuidle_device *dev)
 214 {return -ENODEV; }
 215 static inline int cpuidle_enter_s2idle(struct cpuidle_driver *drv,
 216                                        struct cpuidle_device *dev)
 217 {return -ENODEV; }
 218 static inline void cpuidle_use_deepest_state(bool enable)
 219 {
 220 }
 221 #endif
 222 
 223 /* kernel/sched/idle.c */
 224 extern void sched_idle_set_state(struct cpuidle_state *idle_state);
 225 extern void default_idle_call(void);
 226 
 227 #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
 228 void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a);
 229 #else
 230 static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a)
 231 {
 232 }
 233 #endif
 234 
 235 #if defined(CONFIG_CPU_IDLE) && defined(CONFIG_ARCH_HAS_CPU_RELAX)
 236 void cpuidle_poll_state_init(struct cpuidle_driver *drv);
 237 #else
 238 static inline void cpuidle_poll_state_init(struct cpuidle_driver *drv) {}
 239 #endif
 240 
 241 /******************************
 242  * CPUIDLE GOVERNOR INTERFACE *
 243  ******************************/
 244 
 245 struct cpuidle_governor {
 246         char                    name[CPUIDLE_NAME_LEN];
 247         struct list_head        governor_list;
 248         unsigned int            rating;
 249 
 250         int  (*enable)          (struct cpuidle_driver *drv,
 251                                         struct cpuidle_device *dev);
 252         void (*disable)         (struct cpuidle_driver *drv,
 253                                         struct cpuidle_device *dev);
 254 
 255         int  (*select)          (struct cpuidle_driver *drv,
 256                                         struct cpuidle_device *dev,
 257                                         bool *stop_tick);
 258         void (*reflect)         (struct cpuidle_device *dev, int index);
 259 };
 260 
 261 #ifdef CONFIG_CPU_IDLE
 262 extern int cpuidle_register_governor(struct cpuidle_governor *gov);
 263 extern int cpuidle_governor_latency_req(unsigned int cpu);
 264 #else
 265 static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
 266 {return 0;}
 267 #endif
 268 
 269 #define __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter,                   \
 270                                 idx,                                    \
 271                                 state,                                  \
 272                                 is_retention)                           \
 273 ({                                                                      \
 274         int __ret = 0;                                                  \
 275                                                                         \
 276         if (!idx) {                                                     \
 277                 cpu_do_idle();                                          \
 278                 return idx;                                             \
 279         }                                                               \
 280                                                                         \
 281         if (!is_retention)                                              \
 282                 __ret =  cpu_pm_enter();                                \
 283         if (!__ret) {                                                   \
 284                 __ret = low_level_idle_enter(state);                    \
 285                 if (!is_retention)                                      \
 286                         cpu_pm_exit();                                  \
 287         }                                                               \
 288                                                                         \
 289         __ret ? -1 : idx;                                               \
 290 })
 291 
 292 #define CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx)        \
 293         __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, idx, 0)
 294 
 295 #define CPU_PM_CPU_IDLE_ENTER_RETENTION(low_level_idle_enter, idx)      \
 296         __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, idx, 1)
 297 
 298 #define CPU_PM_CPU_IDLE_ENTER_PARAM(low_level_idle_enter, idx, state)   \
 299         __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, state, 0)
 300 
 301 #define CPU_PM_CPU_IDLE_ENTER_RETENTION_PARAM(low_level_idle_enter, idx, state) \
 302         __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, state, 1)
 303 
 304 #endif /* _LINUX_CPUIDLE_H */

/* [<][>][^][v][top][bottom][index][help] */