diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /include/linux/cpuidle.h | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'include/linux/cpuidle.h')
-rw-r--r-- | include/linux/cpuidle.h | 114 |
1 files changed, 35 insertions, 79 deletions
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 3711b34dc4f..b51629e15cf 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h | |||
@@ -13,94 +13,89 @@ | |||
13 | 13 | ||
14 | #include <linux/percpu.h> | 14 | #include <linux/percpu.h> |
15 | #include <linux/list.h> | 15 | #include <linux/list.h> |
16 | #include <linux/module.h> | ||
16 | #include <linux/kobject.h> | 17 | #include <linux/kobject.h> |
17 | #include <linux/completion.h> | 18 | #include <linux/completion.h> |
18 | #include <linux/hrtimer.h> | ||
19 | 19 | ||
20 | #define CPUIDLE_STATE_MAX 8 | 20 | #define CPUIDLE_STATE_MAX 8 |
21 | #define CPUIDLE_NAME_LEN 16 | 21 | #define CPUIDLE_NAME_LEN 16 |
22 | #define CPUIDLE_DESC_LEN 32 | 22 | #define CPUIDLE_DESC_LEN 32 |
23 | 23 | ||
24 | struct module; | ||
25 | |||
26 | struct cpuidle_device; | 24 | struct cpuidle_device; |
27 | struct cpuidle_driver; | ||
28 | 25 | ||
29 | 26 | ||
30 | /**************************** | 27 | /**************************** |
31 | * CPUIDLE DEVICE INTERFACE * | 28 | * CPUIDLE DEVICE INTERFACE * |
32 | ****************************/ | 29 | ****************************/ |
33 | 30 | ||
34 | struct cpuidle_state_usage { | ||
35 | void *driver_data; | ||
36 | |||
37 | unsigned long long disable; | ||
38 | unsigned long long usage; | ||
39 | unsigned long long time; /* in US */ | ||
40 | }; | ||
41 | |||
42 | struct cpuidle_state { | 31 | struct cpuidle_state { |
43 | char name[CPUIDLE_NAME_LEN]; | 32 | char name[CPUIDLE_NAME_LEN]; |
44 | char desc[CPUIDLE_DESC_LEN]; | 33 | char desc[CPUIDLE_DESC_LEN]; |
34 | void *driver_data; | ||
45 | 35 | ||
46 | unsigned int flags; | 36 | unsigned int flags; |
47 | unsigned int exit_latency; /* in US */ | 37 | unsigned int exit_latency; /* in US */ |
48 | int power_usage; /* in mW */ | 38 | unsigned int power_usage; /* in mW */ |
49 | unsigned int target_residency; /* in US */ | 39 | unsigned int target_residency; /* in US */ |
50 | bool disabled; /* disabled on all CPUs */ | ||
51 | 40 | ||
52 | int (*enter) (struct cpuidle_device *dev, | 41 | unsigned long long usage; |
53 | struct cpuidle_driver *drv, | 42 | unsigned long long time; /* in US */ |
54 | int index); | ||
55 | 43 | ||
56 | int (*enter_dead) (struct cpuidle_device *dev, int index); | 44 | int (*enter) (struct cpuidle_device *dev, |
45 | struct cpuidle_state *state); | ||
57 | }; | 46 | }; |
58 | 47 | ||
59 | /* Idle State Flags */ | 48 | /* Idle State Flags */ |
60 | #define CPUIDLE_FLAG_TIME_VALID (0x01) /* is residency time measurable? */ | 49 | #define CPUIDLE_FLAG_TIME_VALID (0x01) /* is residency time measurable? */ |
61 | #define CPUIDLE_FLAG_COUPLED (0x02) /* state applies to multiple cpus */ | 50 | #define CPUIDLE_FLAG_IGNORE (0x100) /* ignore during this idle period */ |
62 | 51 | ||
63 | #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000) | 52 | #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000) |
64 | 53 | ||
65 | /** | 54 | /** |
66 | * cpuidle_get_statedata - retrieves private driver state data | 55 | * cpuidle_get_statedata - retrieves private driver state data |
67 | * @st_usage: the state usage statistics | 56 | * @state: the state |
68 | */ | 57 | */ |
69 | static inline void *cpuidle_get_statedata(struct cpuidle_state_usage *st_usage) | 58 | static inline void * cpuidle_get_statedata(struct cpuidle_state *state) |
70 | { | 59 | { |
71 | return st_usage->driver_data; | 60 | return state->driver_data; |
72 | } | 61 | } |
73 | 62 | ||
74 | /** | 63 | /** |
75 | * cpuidle_set_statedata - stores private driver state data | 64 | * cpuidle_set_statedata - stores private driver state data |
76 | * @st_usage: the state usage statistics | 65 | * @state: the state |
77 | * @data: the private data | 66 | * @data: the private data |
78 | */ | 67 | */ |
79 | static inline void | 68 | static inline void |
80 | cpuidle_set_statedata(struct cpuidle_state_usage *st_usage, void *data) | 69 | cpuidle_set_statedata(struct cpuidle_state *state, void *data) |
81 | { | 70 | { |
82 | st_usage->driver_data = data; | 71 | state->driver_data = data; |
83 | } | 72 | } |
84 | 73 | ||
74 | struct cpuidle_state_kobj { | ||
75 | struct cpuidle_state *state; | ||
76 | struct completion kobj_unregister; | ||
77 | struct kobject kobj; | ||
78 | }; | ||
79 | |||
85 | struct cpuidle_device { | 80 | struct cpuidle_device { |
86 | unsigned int registered:1; | 81 | unsigned int registered:1; |
87 | unsigned int enabled:1; | 82 | unsigned int enabled:1; |
83 | unsigned int power_specified:1; | ||
88 | unsigned int cpu; | 84 | unsigned int cpu; |
89 | 85 | ||
90 | int last_residency; | 86 | int last_residency; |
91 | int state_count; | 87 | int state_count; |
92 | struct cpuidle_state_usage states_usage[CPUIDLE_STATE_MAX]; | 88 | struct cpuidle_state states[CPUIDLE_STATE_MAX]; |
93 | struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX]; | 89 | struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX]; |
94 | struct cpuidle_driver_kobj *kobj_driver; | 90 | struct cpuidle_state *last_state; |
91 | |||
95 | struct list_head device_list; | 92 | struct list_head device_list; |
96 | struct kobject kobj; | 93 | struct kobject kobj; |
97 | struct completion kobj_unregister; | 94 | struct completion kobj_unregister; |
95 | void *governor_data; | ||
96 | struct cpuidle_state *safe_state; | ||
98 | 97 | ||
99 | #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED | 98 | int (*prepare) (struct cpuidle_device *dev); |
100 | int safe_state_index; | ||
101 | cpumask_t coupled_cpus; | ||
102 | struct cpuidle_coupled *coupled; | ||
103 | #endif | ||
104 | }; | 99 | }; |
105 | 100 | ||
106 | DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices); | 101 | DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices); |
@@ -122,53 +117,32 @@ static inline int cpuidle_get_last_residency(struct cpuidle_device *dev) | |||
122 | ****************************/ | 117 | ****************************/ |
123 | 118 | ||
124 | struct cpuidle_driver { | 119 | struct cpuidle_driver { |
125 | const char *name; | 120 | char name[CPUIDLE_NAME_LEN]; |
126 | struct module *owner; | 121 | struct module *owner; |
127 | int refcnt; | ||
128 | |||
129 | unsigned int power_specified:1; | ||
130 | /* set to 1 to use the core cpuidle time keeping (for all states). */ | ||
131 | unsigned int en_core_tk_irqen:1; | ||
132 | struct cpuidle_state states[CPUIDLE_STATE_MAX]; | ||
133 | int state_count; | ||
134 | int safe_state_index; | ||
135 | }; | 122 | }; |
136 | 123 | ||
137 | #ifdef CONFIG_CPU_IDLE | 124 | #ifdef CONFIG_CPU_IDLE |
138 | extern void disable_cpuidle(void); | 125 | extern void disable_cpuidle(void); |
139 | extern int cpuidle_idle_call(void); | 126 | extern int cpuidle_idle_call(void); |
127 | |||
140 | extern int cpuidle_register_driver(struct cpuidle_driver *drv); | 128 | extern int cpuidle_register_driver(struct cpuidle_driver *drv); |
141 | extern struct cpuidle_driver *cpuidle_get_driver(void); | 129 | struct cpuidle_driver *cpuidle_get_driver(void); |
142 | extern struct cpuidle_driver *cpuidle_driver_ref(void); | ||
143 | extern void cpuidle_driver_unref(void); | ||
144 | extern void cpuidle_unregister_driver(struct cpuidle_driver *drv); | 130 | extern void cpuidle_unregister_driver(struct cpuidle_driver *drv); |
145 | extern int cpuidle_register_device(struct cpuidle_device *dev); | 131 | extern int cpuidle_register_device(struct cpuidle_device *dev); |
146 | extern void cpuidle_unregister_device(struct cpuidle_device *dev); | 132 | extern void cpuidle_unregister_device(struct cpuidle_device *dev); |
147 | 133 | ||
148 | extern void cpuidle_pause_and_lock(void); | 134 | extern void cpuidle_pause_and_lock(void); |
149 | extern void cpuidle_resume_and_unlock(void); | 135 | extern void cpuidle_resume_and_unlock(void); |
150 | extern void cpuidle_pause(void); | ||
151 | extern void cpuidle_resume(void); | ||
152 | extern int cpuidle_enable_device(struct cpuidle_device *dev); | 136 | extern int cpuidle_enable_device(struct cpuidle_device *dev); |
153 | extern void cpuidle_disable_device(struct cpuidle_device *dev); | 137 | extern void cpuidle_disable_device(struct cpuidle_device *dev); |
154 | extern int cpuidle_wrap_enter(struct cpuidle_device *dev, | ||
155 | struct cpuidle_driver *drv, int index, | ||
156 | int (*enter)(struct cpuidle_device *dev, | ||
157 | struct cpuidle_driver *drv, int index)); | ||
158 | extern int cpuidle_play_dead(void); | ||
159 | |||
160 | extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev); | ||
161 | extern int cpuidle_register_cpu_driver(struct cpuidle_driver *drv, int cpu); | ||
162 | extern void cpuidle_unregister_cpu_driver(struct cpuidle_driver *drv, int cpu); | ||
163 | 138 | ||
164 | #else | 139 | #else |
165 | static inline void disable_cpuidle(void) { } | 140 | static inline void disable_cpuidle(void) { } |
166 | static inline int cpuidle_idle_call(void) { return -ENODEV; } | 141 | static inline int cpuidle_idle_call(void) { return -ENODEV; } |
142 | |||
167 | static inline int cpuidle_register_driver(struct cpuidle_driver *drv) | 143 | static inline int cpuidle_register_driver(struct cpuidle_driver *drv) |
168 | {return -ENODEV; } | 144 | {return -ENODEV; } |
169 | static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; } | 145 | static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; } |
170 | static inline struct cpuidle_driver *cpuidle_driver_ref(void) {return NULL; } | ||
171 | static inline void cpuidle_driver_unref(void) {} | ||
172 | static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { } | 146 | static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { } |
173 | static inline int cpuidle_register_device(struct cpuidle_device *dev) | 147 | static inline int cpuidle_register_device(struct cpuidle_device *dev) |
174 | {return -ENODEV; } | 148 | {return -ENODEV; } |
@@ -176,25 +150,10 @@ static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { } | |||
176 | 150 | ||
177 | static inline void cpuidle_pause_and_lock(void) { } | 151 | static inline void cpuidle_pause_and_lock(void) { } |
178 | static inline void cpuidle_resume_and_unlock(void) { } | 152 | static inline void cpuidle_resume_and_unlock(void) { } |
179 | static inline void cpuidle_pause(void) { } | ||
180 | static inline void cpuidle_resume(void) { } | ||
181 | static inline int cpuidle_enable_device(struct cpuidle_device *dev) | 153 | static inline int cpuidle_enable_device(struct cpuidle_device *dev) |
182 | {return -ENODEV; } | 154 | {return -ENODEV; } |
183 | static inline void cpuidle_disable_device(struct cpuidle_device *dev) { } | 155 | static inline void cpuidle_disable_device(struct cpuidle_device *dev) { } |
184 | static inline int cpuidle_wrap_enter(struct cpuidle_device *dev, | ||
185 | struct cpuidle_driver *drv, int index, | ||
186 | int (*enter)(struct cpuidle_device *dev, | ||
187 | struct cpuidle_driver *drv, int index)) | ||
188 | { return -ENODEV; } | ||
189 | static inline int cpuidle_play_dead(void) {return -ENODEV; } | ||
190 | #endif | ||
191 | 156 | ||
192 | #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED | ||
193 | void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a); | ||
194 | #else | ||
195 | static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a) | ||
196 | { | ||
197 | } | ||
198 | #endif | 157 | #endif |
199 | 158 | ||
200 | /****************************** | 159 | /****************************** |
@@ -206,14 +165,11 @@ struct cpuidle_governor { | |||
206 | struct list_head governor_list; | 165 | struct list_head governor_list; |
207 | unsigned int rating; | 166 | unsigned int rating; |
208 | 167 | ||
209 | int (*enable) (struct cpuidle_driver *drv, | 168 | int (*enable) (struct cpuidle_device *dev); |
210 | struct cpuidle_device *dev); | 169 | void (*disable) (struct cpuidle_device *dev); |
211 | void (*disable) (struct cpuidle_driver *drv, | ||
212 | struct cpuidle_device *dev); | ||
213 | 170 | ||
214 | int (*select) (struct cpuidle_driver *drv, | 171 | int (*select) (struct cpuidle_device *dev); |
215 | struct cpuidle_device *dev); | 172 | void (*reflect) (struct cpuidle_device *dev); |
216 | void (*reflect) (struct cpuidle_device *dev, int index); | ||
217 | 173 | ||
218 | struct module *owner; | 174 | struct module *owner; |
219 | }; | 175 | }; |