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