Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 0de80bcc2baed116a569c38cbc38c5dcb945d14d 180 lines 4.8 kB view raw
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/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 23struct cpuidle_device; 24 25 26/**************************** 27 * CPUIDLE DEVICE INTERFACE * 28 ****************************/ 29 30struct cpuidle_state { 31 char name[CPUIDLE_NAME_LEN]; 32 void *driver_data; 33 34 unsigned int flags; 35 unsigned int exit_latency; /* in US */ 36 unsigned int power_usage; /* in mW */ 37 unsigned int target_residency; /* in US */ 38 39 unsigned int usage; 40 unsigned int time; /* in US */ 41 42 int (*enter) (struct cpuidle_device *dev, 43 struct cpuidle_state *state); 44}; 45 46/* Idle State Flags */ 47#define CPUIDLE_FLAG_TIME_VALID (0x01) /* is residency time measurable? */ 48#define CPUIDLE_FLAG_CHECK_BM (0x02) /* BM activity will exit state */ 49#define CPUIDLE_FLAG_SHALLOW (0x10) /* low latency, minimal savings */ 50#define CPUIDLE_FLAG_BALANCED (0x20) /* medium latency, moderate savings */ 51#define CPUIDLE_FLAG_DEEP (0x40) /* high latency, large savings */ 52 53#define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000) 54 55/** 56 * cpuidle_get_statedata - retrieves private driver state data 57 * @state: the state 58 */ 59static inline void * cpuidle_get_statedata(struct cpuidle_state *state) 60{ 61 return state->driver_data; 62} 63 64/** 65 * cpuidle_set_statedata - stores private driver state data 66 * @state: the state 67 * @data: the private data 68 */ 69static inline void 70cpuidle_set_statedata(struct cpuidle_state *state, void *data) 71{ 72 state->driver_data = data; 73} 74 75struct cpuidle_state_kobj { 76 struct cpuidle_state *state; 77 struct completion kobj_unregister; 78 struct kobject kobj; 79}; 80 81struct cpuidle_device { 82 int enabled:1; 83 unsigned int cpu; 84 85 int last_residency; 86 int state_count; 87 struct cpuidle_state states[CPUIDLE_STATE_MAX]; 88 struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX]; 89 struct cpuidle_state *last_state; 90 91 struct list_head device_list; 92 struct kobject kobj; 93 struct completion kobj_unregister; 94 void *governor_data; 95}; 96 97DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices); 98 99/** 100 * cpuidle_get_last_residency - retrieves the last state's residency time 101 * @dev: the target CPU 102 * 103 * NOTE: this value is invalid if CPUIDLE_FLAG_TIME_VALID isn't set 104 */ 105static inline int cpuidle_get_last_residency(struct cpuidle_device *dev) 106{ 107 return dev->last_residency; 108} 109 110 111/**************************** 112 * CPUIDLE DRIVER INTERFACE * 113 ****************************/ 114 115struct cpuidle_driver { 116 char name[CPUIDLE_NAME_LEN]; 117 struct module *owner; 118}; 119 120#ifdef CONFIG_CPU_IDLE 121 122extern int cpuidle_register_driver(struct cpuidle_driver *drv); 123extern void cpuidle_unregister_driver(struct cpuidle_driver *drv); 124extern int cpuidle_register_device(struct cpuidle_device *dev); 125extern void cpuidle_unregister_device(struct cpuidle_device *dev); 126 127extern void cpuidle_pause_and_lock(void); 128extern void cpuidle_resume_and_unlock(void); 129extern int cpuidle_enable_device(struct cpuidle_device *dev); 130extern void cpuidle_disable_device(struct cpuidle_device *dev); 131 132#else 133 134static inline int cpuidle_register_driver(struct cpuidle_driver *drv) 135{return 0;} 136static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { } 137static inline int cpuidle_register_device(struct cpuidle_device *dev) 138{return 0;} 139static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { } 140 141static inline void cpuidle_pause_and_lock(void) { } 142static inline void cpuidle_resume_and_unlock(void) { } 143static inline int cpuidle_enable_device(struct cpuidle_device *dev) 144{return 0;} 145static inline void cpuidle_disable_device(struct cpuidle_device *dev) { } 146 147#endif 148 149/****************************** 150 * CPUIDLE GOVERNOR INTERFACE * 151 ******************************/ 152 153struct cpuidle_governor { 154 char name[CPUIDLE_NAME_LEN]; 155 struct list_head governor_list; 156 unsigned int rating; 157 158 int (*enable) (struct cpuidle_device *dev); 159 void (*disable) (struct cpuidle_device *dev); 160 161 int (*select) (struct cpuidle_device *dev); 162 void (*reflect) (struct cpuidle_device *dev); 163 164 struct module *owner; 165}; 166 167#ifdef CONFIG_CPU_IDLE 168 169extern int cpuidle_register_governor(struct cpuidle_governor *gov); 170extern void cpuidle_unregister_governor(struct cpuidle_governor *gov); 171 172#else 173 174static inline int cpuidle_register_governor(struct cpuidle_governor *gov) 175{return 0;} 176static inline void cpuidle_unregister_governor(struct cpuidle_governor *gov) { } 177 178#endif 179 180#endif /* _LINUX_CPUIDLE_H */