1 /* 2 * cpuidle.h - a generic framework for CPU idle power management 3 * 4 * (C) 2007 Venkatesh Pallipadi <[email protected]> 5 * Shaohua Li <[email protected]> 6 * Adam Belay <[email protected]> 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/module.h> 17 #include <linux/kobject.h> 18 #include <linux/completion.h> 19 20 #define CPUIDLE_STATE_MAX 8 21 #define CPUIDLE_NAME_LEN 16 22 #define CPUIDLE_DESC_LEN 32 23 24 struct cpuidle_device; 25 26 27 /**************************** 28 * CPUIDLE DEVICE INTERFACE * 29 ****************************/ 30 31 struct cpuidle_state { 32 char name[CPUIDLE_NAME_LEN]; 33 char desc[CPUIDLE_DESC_LEN]; 34 void *driver_data; 35 36 unsigned int flags; 37 unsigned int exit_latency; /* in US */ 38 unsigned int power_usage; /* in mW */ 39 unsigned int target_residency; /* in US */ 40 41 unsigned long long usage; 42 unsigned long long time; /* in US */ 43 44 int (*enter) (struct cpuidle_device *dev, 45 int index); 46 }; 47 48 /* Idle State Flags */ 49 #define CPUIDLE_FLAG_TIME_VALID (0x01) /* is residency time measurable? */ 50 #define CPUIDLE_FLAG_IGNORE (0x100) /* ignore during this idle period */ 51 52 #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000) 53 54 /** 55 * cpuidle_get_statedata - retrieves private driver state data 56 * @state: the state 57 */ 58 static inline void * cpuidle_get_statedata(struct cpuidle_state *state) 59 { 60 return state->driver_data; 61 } 62 63 /** 64 * cpuidle_set_statedata - stores private driver state data 65 * @state: the state 66 * @data: the private data 67 */ 68 static inline void 69 cpuidle_set_statedata(struct cpuidle_state *state, void *data) 70 { 71 state->driver_data = data; 72 } 73 74 struct cpuidle_state_kobj { 75 struct cpuidle_state *state; 76 struct completion kobj_unregister; 77 struct kobject kobj; 78 }; 79 80 struct cpuidle_device { 81 unsigned int registered:1; 82 unsigned int enabled:1; 83 unsigned int power_specified:1; 84 unsigned int cpu; 85 86 int last_residency; 87 int state_count; 88 struct cpuidle_state states[CPUIDLE_STATE_MAX]; 89 struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX]; 90 91 struct list_head device_list; 92 struct kobject kobj; 93 struct completion kobj_unregister; 94 void *governor_data; 95 int safe_state_index; 96 97 int (*prepare) (struct cpuidle_device *dev); 98 }; 99 100 DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices); 101 102 /** 103 * cpuidle_get_last_residency - retrieves the last state's residency time 104 * @dev: the target CPU 105 * 106 * NOTE: this value is invalid if CPUIDLE_FLAG_TIME_VALID isn't set 107 */ 108 static inline int cpuidle_get_last_residency(struct cpuidle_device *dev) 109 { 110 return dev->last_residency; 111 } 112 113 114 /**************************** 115 * CPUIDLE DRIVER INTERFACE * 116 ****************************/ 117 118 struct cpuidle_driver { 119 char name[CPUIDLE_NAME_LEN]; 120 struct module *owner; 121 }; 122 123 #ifdef CONFIG_CPU_IDLE 124 extern void disable_cpuidle(void); 125 extern int cpuidle_idle_call(void); 126 127 extern int cpuidle_register_driver(struct cpuidle_driver *drv); 128 struct cpuidle_driver *cpuidle_get_driver(void); 129 extern void cpuidle_unregister_driver(struct cpuidle_driver *drv); 130 extern int cpuidle_register_device(struct cpuidle_device *dev); 131 extern void cpuidle_unregister_device(struct cpuidle_device *dev); 132 133 extern void cpuidle_pause_and_lock(void); 134 extern void cpuidle_resume_and_unlock(void); 135 extern int cpuidle_enable_device(struct cpuidle_device *dev); 136 extern void cpuidle_disable_device(struct cpuidle_device *dev); 137 138 #else 139 static inline void disable_cpuidle(void) { } 140 static inline int cpuidle_idle_call(void) { return -ENODEV; } 141 142 static inline int cpuidle_register_driver(struct cpuidle_driver *drv) 143 {return -ENODEV; } 144 static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; } 145 static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { } 146 static inline int cpuidle_register_device(struct cpuidle_device *dev) 147 {return -ENODEV; } 148 static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { } 149 150 static inline void cpuidle_pause_and_lock(void) { } 151 static inline void cpuidle_resume_and_unlock(void) { } 152 static inline int cpuidle_enable_device(struct cpuidle_device *dev) 153 {return -ENODEV; } 154 static inline void cpuidle_disable_device(struct cpuidle_device *dev) { } 155 156 #endif 157 158 /****************************** 159 * CPUIDLE GOVERNOR INTERFACE * 160 ******************************/ 161 162 struct cpuidle_governor { 163 char name[CPUIDLE_NAME_LEN]; 164 struct list_head governor_list; 165 unsigned int rating; 166 167 int (*enable) (struct cpuidle_device *dev); 168 void (*disable) (struct cpuidle_device *dev); 169 170 int (*select) (struct cpuidle_device *dev); 171 void (*reflect) (struct cpuidle_device *dev, int index); 172 173 struct module *owner; 174 }; 175 176 #ifdef CONFIG_CPU_IDLE 177 178 extern int cpuidle_register_governor(struct cpuidle_governor *gov); 179 extern void cpuidle_unregister_governor(struct cpuidle_governor *gov); 180 181 #else 182 183 static inline int cpuidle_register_governor(struct cpuidle_governor *gov) 184 {return 0;} 185 static inline void cpuidle_unregister_governor(struct cpuidle_governor *gov) { } 186 187 #endif 188 189 #ifdef CONFIG_ARCH_HAS_CPU_RELAX 190 #define CPUIDLE_DRIVER_STATE_START 1 191 #else 192 #define CPUIDLE_DRIVER_STATE_START 0 193 #endif 194 195 #endif /* _LINUX_CPUIDLE_H */ 196