This source file includes following definitions.
- cpuidle_get_device
 
- disable_cpuidle
 
- cpuidle_not_available
 
- cpuidle_select
 
- cpuidle_enter
 
- cpuidle_reflect
 
- cpuidle_poll_time
 
- cpuidle_register_driver
 
- cpuidle_get_driver
 
- cpuidle_driver_ref
 
- cpuidle_driver_unref
 
- cpuidle_unregister_driver
 
- cpuidle_register_device
 
- cpuidle_unregister_device
 
- cpuidle_register
 
- cpuidle_unregister
 
- cpuidle_pause_and_lock
 
- cpuidle_resume_and_unlock
 
- cpuidle_pause
 
- cpuidle_resume
 
- cpuidle_enable_device
 
- cpuidle_disable_device
 
- cpuidle_play_dead
 
- cpuidle_get_cpu_driver
 
- cpuidle_get_device
 
- cpuidle_find_deepest_state
 
- cpuidle_enter_s2idle
 
- cpuidle_use_deepest_state
 
- cpuidle_coupled_parallel_barrier
 
- cpuidle_poll_state_init
 
- cpuidle_register_governor
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   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 
  30 
  31 
  32 struct cpuidle_state_usage {
  33         unsigned long long      disable;
  34         unsigned long long      usage;
  35         unsigned long long      time; 
  36         unsigned long long      above; 
  37         unsigned long long      below; 
  38 #ifdef CONFIG_SUSPEND
  39         unsigned long long      s2idle_usage;
  40         unsigned long long      s2idle_time; 
  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; 
  50         int             power_usage; 
  51         unsigned int    target_residency; 
  52         bool            disabled; 
  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 
  62 
  63 
  64 
  65         void (*enter_s2idle) (struct cpuidle_device *dev,
  66                               struct cpuidle_driver *drv,
  67                               int index);
  68 };
  69 
  70 
  71 #define CPUIDLE_FLAG_NONE       (0x00)
  72 #define CPUIDLE_FLAG_POLLING    BIT(0) 
  73 #define CPUIDLE_FLAG_COUPLED    BIT(1) 
  74 #define CPUIDLE_FLAG_TIMER_STOP BIT(2) 
  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 
 108 
 109 
 110 struct cpuidle_driver {
 111         const char              *name;
 112         struct module           *owner;
 113         int                     refcnt;
 114 
 115         
 116         unsigned int            bctimer:1;
 117         
 118         struct cpuidle_state    states[CPUIDLE_STATE_MAX];
 119         int                     state_count;
 120         int                     safe_state_index;
 121 
 122         
 123         struct cpumask          *cpumask;
 124 
 125         
 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 
 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 
 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