1
2
3
4
5
6
7
8
9
10
11#ifndef _LINUX_CPUFREQ_H
12#define _LINUX_CPUFREQ_H
13
14#include <linux/cpumask.h>
15#include <linux/completion.h>
16#include <linux/kobject.h>
17#include <linux/notifier.h>
18#include <linux/sysfs.h>
19
20
21
22
23
24
25
26
27
28
29
30#define CPUFREQ_ETERNAL (-1)
31#define CPUFREQ_NAME_LEN 16
32
33#define CPUFREQ_NAME_PLEN (CPUFREQ_NAME_LEN + 1)
34
35struct cpufreq_governor;
36
37struct cpufreq_freqs {
38 unsigned int cpu;
39 unsigned int old;
40 unsigned int new;
41 u8 flags;
42};
43
44struct cpufreq_cpuinfo {
45 unsigned int max_freq;
46 unsigned int min_freq;
47
48
49 unsigned int transition_latency;
50};
51
52struct cpufreq_real_policy {
53 unsigned int min;
54 unsigned int max;
55 unsigned int policy;
56 struct cpufreq_governor *governor;
57};
58
59struct cpufreq_policy {
60
61 cpumask_var_t cpus;
62 cpumask_var_t related_cpus;
63
64 unsigned int shared_type;
65
66 unsigned int cpu;
67 unsigned int last_cpu;
68
69 struct cpufreq_cpuinfo cpuinfo;
70
71 unsigned int min;
72 unsigned int max;
73 unsigned int cur;
74
75 unsigned int policy;
76 struct cpufreq_governor *governor;
77 void *governor_data;
78 bool governor_enabled;
79
80 struct work_struct update;
81
82
83 struct cpufreq_real_policy user_policy;
84
85 struct list_head policy_list;
86 struct kobject kobj;
87 struct completion kobj_unregister;
88
89
90
91
92
93
94
95
96
97
98
99
100
101 struct rw_semaphore rwsem;
102};
103
104
105#define CPUFREQ_SHARED_TYPE_NONE (0)
106#define CPUFREQ_SHARED_TYPE_HW (1)
107#define CPUFREQ_SHARED_TYPE_ALL (2)
108#define CPUFREQ_SHARED_TYPE_ANY (3)
109
110#ifdef CONFIG_CPU_FREQ
111struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu);
112void cpufreq_cpu_put(struct cpufreq_policy *policy);
113#else
114static inline struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
115{
116 return NULL;
117}
118static inline void cpufreq_cpu_put(struct cpufreq_policy *policy) { }
119#endif
120
121static inline bool policy_is_shared(struct cpufreq_policy *policy)
122{
123 return cpumask_weight(policy->cpus) > 1;
124}
125
126
127extern struct kobject *cpufreq_global_kobject;
128int cpufreq_get_global_kobject(void);
129void cpufreq_put_global_kobject(void);
130int cpufreq_sysfs_create_file(const struct attribute *attr);
131void cpufreq_sysfs_remove_file(const struct attribute *attr);
132
133#ifdef CONFIG_CPU_FREQ
134unsigned int cpufreq_get(unsigned int cpu);
135unsigned int cpufreq_quick_get(unsigned int cpu);
136unsigned int cpufreq_quick_get_max(unsigned int cpu);
137void disable_cpufreq(void);
138
139u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy);
140int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
141int cpufreq_update_policy(unsigned int cpu);
142bool have_governor_per_policy(void);
143struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy);
144#else
145static inline unsigned int cpufreq_get(unsigned int cpu)
146{
147 return 0;
148}
149static inline unsigned int cpufreq_quick_get(unsigned int cpu)
150{
151 return 0;
152}
153static inline unsigned int cpufreq_quick_get_max(unsigned int cpu)
154{
155 return 0;
156}
157static inline void disable_cpufreq(void) { }
158#endif
159
160
161
162
163
164#define CPUFREQ_RELATION_L 0
165#define CPUFREQ_RELATION_H 1
166
167struct freq_attr {
168 struct attribute attr;
169 ssize_t (*show)(struct cpufreq_policy *, char *);
170 ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);
171};
172
173#define cpufreq_freq_attr_ro(_name) \
174static struct freq_attr _name = \
175__ATTR(_name, 0444, show_##_name, NULL)
176
177#define cpufreq_freq_attr_ro_perm(_name, _perm) \
178static struct freq_attr _name = \
179__ATTR(_name, _perm, show_##_name, NULL)
180
181#define cpufreq_freq_attr_rw(_name) \
182static struct freq_attr _name = \
183__ATTR(_name, 0644, show_##_name, store_##_name)
184
185struct global_attr {
186 struct attribute attr;
187 ssize_t (*show)(struct kobject *kobj,
188 struct attribute *attr, char *buf);
189 ssize_t (*store)(struct kobject *a, struct attribute *b,
190 const char *c, size_t count);
191};
192
193#define define_one_global_ro(_name) \
194static struct global_attr _name = \
195__ATTR(_name, 0444, show_##_name, NULL)
196
197#define define_one_global_rw(_name) \
198static struct global_attr _name = \
199__ATTR(_name, 0644, show_##_name, store_##_name)
200
201
202struct cpufreq_driver {
203 char name[CPUFREQ_NAME_LEN];
204 u8 flags;
205
206
207 int (*init) (struct cpufreq_policy *policy);
208 int (*verify) (struct cpufreq_policy *policy);
209
210
211 int (*setpolicy) (struct cpufreq_policy *policy);
212 int (*target) (struct cpufreq_policy *policy,
213 unsigned int target_freq,
214 unsigned int relation);
215 int (*target_index) (struct cpufreq_policy *policy,
216 unsigned int index);
217
218
219 unsigned int (*get) (unsigned int cpu);
220
221
222 int (*bios_limit) (int cpu, unsigned int *limit);
223
224 int (*exit) (struct cpufreq_policy *policy);
225 int (*suspend) (struct cpufreq_policy *policy);
226 int (*resume) (struct cpufreq_policy *policy);
227 struct freq_attr **attr;
228};
229
230
231#define CPUFREQ_STICKY (1 << 0)
232
233#define CPUFREQ_CONST_LOOPS (1 << 1)
234
235
236
237#define CPUFREQ_PM_NO_WARN (1 << 2)
238
239
240
241
242
243
244
245
246#define CPUFREQ_HAVE_GOVERNOR_PER_POLICY (1 << 3)
247
248
249
250
251
252
253#define CPUFREQ_ASYNC_NOTIFICATION (1 << 4)
254
255int cpufreq_register_driver(struct cpufreq_driver *driver_data);
256int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
257
258const char *cpufreq_get_current_driver(void);
259
260static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy,
261 unsigned int min, unsigned int max)
262{
263 if (policy->min < min)
264 policy->min = min;
265 if (policy->max < min)
266 policy->max = min;
267 if (policy->min > max)
268 policy->min = max;
269 if (policy->max > max)
270 policy->max = max;
271 if (policy->min > policy->max)
272 policy->min = policy->max;
273 return;
274}
275
276static inline void
277cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy)
278{
279 cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
280 policy->cpuinfo.max_freq);
281}
282
283
284
285
286
287#define CPUFREQ_TRANSITION_NOTIFIER (0)
288#define CPUFREQ_POLICY_NOTIFIER (1)
289
290
291#define CPUFREQ_PRECHANGE (0)
292#define CPUFREQ_POSTCHANGE (1)
293#define CPUFREQ_RESUMECHANGE (8)
294#define CPUFREQ_SUSPENDCHANGE (9)
295
296
297#define CPUFREQ_ADJUST (0)
298#define CPUFREQ_INCOMPATIBLE (1)
299#define CPUFREQ_NOTIFY (2)
300#define CPUFREQ_START (3)
301#define CPUFREQ_UPDATE_POLICY_CPU (4)
302
303#ifdef CONFIG_CPU_FREQ
304int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list);
305int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);
306
307void cpufreq_notify_transition(struct cpufreq_policy *policy,
308 struct cpufreq_freqs *freqs, unsigned int state);
309
310#else
311static inline int cpufreq_register_notifier(struct notifier_block *nb,
312 unsigned int list)
313{
314 return 0;
315}
316static inline int cpufreq_unregister_notifier(struct notifier_block *nb,
317 unsigned int list)
318{
319 return 0;
320}
321#endif
322
323
324
325
326
327
328
329
330
331
332
333static inline unsigned long cpufreq_scale(unsigned long old, u_int div,
334 u_int mult)
335{
336#if BITS_PER_LONG == 32
337 u64 result = ((u64) old) * ((u64) mult);
338 do_div(result, div);
339 return (unsigned long) result;
340
341#elif BITS_PER_LONG == 64
342 unsigned long result = old * ((u64) mult);
343 result /= div;
344 return result;
345#endif
346}
347
348
349
350
351
352
353
354
355
356
357#define CPUFREQ_POLICY_POWERSAVE (1)
358#define CPUFREQ_POLICY_PERFORMANCE (2)
359
360
361#define CPUFREQ_GOV_START 1
362#define CPUFREQ_GOV_STOP 2
363#define CPUFREQ_GOV_LIMITS 3
364#define CPUFREQ_GOV_POLICY_INIT 4
365#define CPUFREQ_GOV_POLICY_EXIT 5
366
367struct cpufreq_governor {
368 char name[CPUFREQ_NAME_LEN];
369 int initialized;
370 int (*governor) (struct cpufreq_policy *policy,
371 unsigned int event);
372 ssize_t (*show_setspeed) (struct cpufreq_policy *policy,
373 char *buf);
374 int (*store_setspeed) (struct cpufreq_policy *policy,
375 unsigned int freq);
376 unsigned int max_transition_latency;
377
378
379 struct list_head governor_list;
380 struct module *owner;
381};
382
383
384int cpufreq_driver_target(struct cpufreq_policy *policy,
385 unsigned int target_freq,
386 unsigned int relation);
387int __cpufreq_driver_target(struct cpufreq_policy *policy,
388 unsigned int target_freq,
389 unsigned int relation);
390int cpufreq_register_governor(struct cpufreq_governor *governor);
391void cpufreq_unregister_governor(struct cpufreq_governor *governor);
392
393
394
395
396
397
398#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
399extern struct cpufreq_governor cpufreq_gov_performance;
400#endif
401#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
402#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_performance)
403#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE)
404extern struct cpufreq_governor cpufreq_gov_powersave;
405#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_powersave)
406#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE)
407extern struct cpufreq_governor cpufreq_gov_userspace;
408#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_userspace)
409#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND)
410extern struct cpufreq_governor cpufreq_gov_ondemand;
411#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_ondemand)
412#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE)
413extern struct cpufreq_governor cpufreq_gov_conservative;
414#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_conservative)
415#endif
416
417
418
419
420
421#define CPUFREQ_ENTRY_INVALID ~0
422#define CPUFREQ_TABLE_END ~1
423
424struct cpufreq_frequency_table {
425 unsigned int driver_data;
426 unsigned int frequency;
427
428};
429
430int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
431 struct cpufreq_frequency_table *table);
432
433int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
434 struct cpufreq_frequency_table *table);
435int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy);
436
437int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
438 struct cpufreq_frequency_table *table,
439 unsigned int target_freq,
440 unsigned int relation,
441 unsigned int *index);
442
443void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
444ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
445
446
447struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
448
449
450extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
451extern struct freq_attr *cpufreq_generic_attr[];
452void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
453 unsigned int cpu);
454void cpufreq_frequency_table_put_attr(unsigned int cpu);
455int cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
456 struct cpufreq_frequency_table *table);
457
458int cpufreq_generic_init(struct cpufreq_policy *policy,
459 struct cpufreq_frequency_table *table,
460 unsigned int transition_latency);
461static inline int cpufreq_generic_exit(struct cpufreq_policy *policy)
462{
463 cpufreq_frequency_table_put_attr(policy->cpu);
464 return 0;
465}
466
467#endif
468