Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
cpufreq.h
Go to the documentation of this file.
1
/*
2
* linux/include/linux/cpufreq.h
3
*
4
* Copyright (C) 2001 Russell King
5
* (C) 2002 - 2003 Dominik Brodowski <
[email protected]
>
6
*
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License version 2 as
9
* published by the Free Software Foundation.
10
*/
11
#ifndef _LINUX_CPUFREQ_H
12
#define _LINUX_CPUFREQ_H
13
14
#include <
linux/mutex.h
>
15
#include <
linux/notifier.h
>
16
#include <
linux/threads.h
>
17
#include <
linux/kobject.h
>
18
#include <
linux/sysfs.h
>
19
#include <
linux/completion.h
>
20
#include <
linux/workqueue.h
>
21
#include <
linux/cpumask.h
>
22
#include <asm/div64.h>
23
24
#define CPUFREQ_NAME_LEN 16
25
26
27
/*********************************************************************
28
* CPUFREQ NOTIFIER INTERFACE *
29
*********************************************************************/
30
31
#define CPUFREQ_TRANSITION_NOTIFIER (0)
32
#define CPUFREQ_POLICY_NOTIFIER (1)
33
34
#ifdef CONFIG_CPU_FREQ
35
int
cpufreq_register_notifier
(
struct
notifier_block
*nb,
unsigned
int
list
);
36
int
cpufreq_unregister_notifier
(
struct
notifier_block
*nb,
unsigned
int
list
);
37
extern
void
disable_cpufreq
(
void
);
38
#else
/* CONFIG_CPU_FREQ */
39
static
inline
int
cpufreq_register_notifier
(
struct
notifier_block
*nb,
40
unsigned
int
list
)
41
{
42
return
0;
43
}
44
static
inline
int
cpufreq_unregister_notifier
(
struct
notifier_block
*nb,
45
unsigned
int
list
)
46
{
47
return
0;
48
}
49
static
inline
void
disable_cpufreq
(
void
) { }
50
#endif
/* CONFIG_CPU_FREQ */
51
52
/* if (cpufreq_driver->target) exists, the ->governor decides what frequency
53
* within the limits is used. If (cpufreq_driver->setpolicy> exists, these
54
* two generic policies are available:
55
*/
56
57
#define CPUFREQ_POLICY_POWERSAVE (1)
58
#define CPUFREQ_POLICY_PERFORMANCE (2)
59
60
/* Frequency values here are CPU kHz so that hardware which doesn't run
61
* with some frequencies can complain without having to guess what per
62
* cent / per mille means.
63
* Maximum transition latency is in nanoseconds - if it's unknown,
64
* CPUFREQ_ETERNAL shall be used.
65
*/
66
67
struct
cpufreq_governor
;
68
69
/* /sys/devices/system/cpu/cpufreq: entry point for global variables */
70
extern
struct
kobject
*
cpufreq_global_kobject
;
71
72
#define CPUFREQ_ETERNAL (-1)
73
struct
cpufreq_cpuinfo
{
74
unsigned
int
max_freq
;
75
unsigned
int
min_freq
;
76
77
/* in 10^(-9) s = nanoseconds */
78
unsigned
int
transition_latency
;
79
};
80
81
struct
cpufreq_real_policy
{
82
unsigned
int
min
;
/* in kHz */
83
unsigned
int
max
;
/* in kHz */
84
unsigned
int
policy
;
/* see above */
85
struct
cpufreq_governor
*
governor
;
/* see below */
86
};
87
88
struct
cpufreq_policy
{
89
cpumask_var_t
cpus
;
/* CPUs requiring sw coordination */
90
cpumask_var_t
related_cpus
;
/* CPUs with any coordination */
91
unsigned
int
shared_type
;
/* ANY or ALL affected CPUs
92
should set cpufreq */
93
unsigned
int
cpu
;
/* cpu nr of registered CPU */
94
struct
cpufreq_cpuinfo
cpuinfo
;
/* see above */
95
96
unsigned
int
min
;
/* in kHz */
97
unsigned
int
max
;
/* in kHz */
98
unsigned
int
cur
;
/* in kHz, only needed if cpufreq
99
* governors are used */
100
unsigned
int
policy
;
/* see above */
101
struct
cpufreq_governor
*
governor
;
/* see below */
102
103
struct
work_struct
update
;
/* if update_policy() needs to be
104
* called, but you're in IRQ context */
105
106
struct
cpufreq_real_policy
user_policy
;
107
108
struct
kobject
kobj
;
109
struct
completion
kobj_unregister
;
110
};
111
112
#define CPUFREQ_ADJUST (0)
113
#define CPUFREQ_INCOMPATIBLE (1)
114
#define CPUFREQ_NOTIFY (2)
115
#define CPUFREQ_START (3)
116
117
#define CPUFREQ_SHARED_TYPE_NONE (0)
/* None */
118
#define CPUFREQ_SHARED_TYPE_HW (1)
/* HW does needed coordination */
119
#define CPUFREQ_SHARED_TYPE_ALL (2)
/* All dependent CPUs should set freq */
120
#define CPUFREQ_SHARED_TYPE_ANY (3)
/* Freq can be set from any dependent CPU*/
121
122
/******************** cpufreq transition notifiers *******************/
123
124
#define CPUFREQ_PRECHANGE (0)
125
#define CPUFREQ_POSTCHANGE (1)
126
#define CPUFREQ_RESUMECHANGE (8)
127
#define CPUFREQ_SUSPENDCHANGE (9)
128
129
struct
cpufreq_freqs
{
130
unsigned
int
cpu
;
/* cpu nr */
131
unsigned
int
old
;
132
unsigned
int
new
;
133
u8
flags
;
/* flags of cpufreq_driver, see below. */
134
};
135
136
146
static
inline
unsigned
long
cpufreq_scale(
unsigned
long
old,
u_int
div
,
u_int
mult
)
147
{
148
#if BITS_PER_LONG == 32
149
150
u64
result
= ((
u64
) old) * ((
u64
) mult);
151
do_div
(result, div);
152
return
(
unsigned
long
)
result
;
153
154
#elif BITS_PER_LONG == 64
155
156
unsigned
long
result = old * ((
u64
) mult);
157
result /=
div
;
158
return
result
;
159
160
#endif
161
};
162
163
/*********************************************************************
164
* CPUFREQ GOVERNORS *
165
*********************************************************************/
166
167
#define CPUFREQ_GOV_START 1
168
#define CPUFREQ_GOV_STOP 2
169
#define CPUFREQ_GOV_LIMITS 3
170
171
struct
cpufreq_governor
{
172
char
name
[
CPUFREQ_NAME_LEN
];
173
int
(*
governor
) (
struct
cpufreq_policy
*
policy
,
174
unsigned
int
event
);
175
ssize_t
(*
show_setspeed
) (
struct
cpufreq_policy
*
policy
,
176
char
*
buf
);
177
int
(*
store_setspeed
) (
struct
cpufreq_policy
*
policy
,
178
unsigned
int
freq
);
179
unsigned
int
max_transition_latency
;
/* HW must be able to switch to
180
next freq faster than this value in nano secs or we
181
will fallback to performance governor */
182
struct
list_head
governor_list
;
183
struct
module
*
owner
;
184
};
185
186
/*
187
* Pass a target to the cpufreq driver.
188
*/
189
extern
int
cpufreq_driver_target
(
struct
cpufreq_policy
*policy,
190
unsigned
int
target_freq,
191
unsigned
int
relation);
192
extern
int
__cpufreq_driver_target
(
struct
cpufreq_policy
*policy,
193
unsigned
int
target_freq,
194
unsigned
int
relation);
195
196
197
extern
int
__cpufreq_driver_getavg
(
struct
cpufreq_policy
*policy,
198
unsigned
int
cpu
);
199
200
int
cpufreq_register_governor
(
struct
cpufreq_governor
*governor);
201
void
cpufreq_unregister_governor
(
struct
cpufreq_governor
*governor);
202
203
204
/*********************************************************************
205
* CPUFREQ DRIVER INTERFACE *
206
*********************************************************************/
207
208
#define CPUFREQ_RELATION_L 0
/* lowest frequency at or above target */
209
#define CPUFREQ_RELATION_H 1
/* highest frequency below or at target */
210
211
struct
freq_attr
;
212
213
struct
cpufreq_driver
{
214
struct
module
*
owner
;
215
char
name
[
CPUFREQ_NAME_LEN
];
216
u8
flags
;
217
218
/* needed by all drivers */
219
int
(*
init
) (
struct
cpufreq_policy
*
policy
);
220
int
(*
verify
) (
struct
cpufreq_policy
*
policy
);
221
222
/* define one out of two */
223
int
(*
setpolicy
) (
struct
cpufreq_policy
*
policy
);
224
int
(*
target
) (
struct
cpufreq_policy
*
policy
,
225
unsigned
int
target_freq,
226
unsigned
int
relation);
227
228
/* should be defined, if possible */
229
unsigned
int
(*
get
) (
unsigned
int
cpu
);
230
231
/* optional */
232
unsigned
int
(*
getavg
) (
struct
cpufreq_policy
*
policy
,
233
unsigned
int
cpu
);
234
int
(*
bios_limit
) (
int
cpu
,
unsigned
int
*
limit
);
235
236
int
(*
exit
) (
struct
cpufreq_policy
*
policy
);
237
int
(*
suspend
) (
struct
cpufreq_policy
*
policy
);
238
int
(*
resume
) (
struct
cpufreq_policy
*
policy
);
239
struct
freq_attr
**
attr
;
240
};
241
242
/* flags */
243
244
#define CPUFREQ_STICKY 0x01
/* the driver isn't removed even if
245
* all ->init() calls failed */
246
#define CPUFREQ_CONST_LOOPS 0x02
/* loops_per_jiffy or other kernel
247
* "constants" aren't affected by
248
* frequency transitions */
249
#define CPUFREQ_PM_NO_WARN 0x04
/* don't warn on suspend/resume speed
250
* mismatches */
251
252
int
cpufreq_register_driver
(
struct
cpufreq_driver
*
driver_data
);
253
int
cpufreq_unregister_driver
(
struct
cpufreq_driver
*
driver_data
);
254
255
256
void
cpufreq_notify_transition
(
struct
cpufreq_freqs
*freqs,
unsigned
int
state
);
257
258
259
static
inline
void
cpufreq_verify_within_limits(
struct
cpufreq_policy
*policy,
unsigned
int
min
,
unsigned
int
max
)
260
{
261
if
(policy->
min
< min)
262
policy->
min
=
min
;
263
if
(policy->
max
< min)
264
policy->
max
=
min
;
265
if
(policy->
min
> max)
266
policy->
min
=
max
;
267
if
(policy->
max
> max)
268
policy->
max
=
max
;
269
if
(policy->
min
> policy->
max
)
270
policy->
min
= policy->
max
;
271
return
;
272
}
273
274
struct
freq_attr
{
275
struct
attribute
attr;
276
ssize_t
(*
show
)(
struct
cpufreq_policy
*,
char
*);
277
ssize_t
(*
store
)(
struct
cpufreq_policy
*,
const
char
*,
size_t
count
);
278
};
279
280
#define cpufreq_freq_attr_ro(_name) \
281
static struct freq_attr _name = \
282
__ATTR(_name, 0444, show_##_name, NULL)
283
284
#define cpufreq_freq_attr_ro_perm(_name, _perm) \
285
static struct freq_attr _name = \
286
__ATTR(_name, _perm, show_##_name, NULL)
287
288
#define cpufreq_freq_attr_rw(_name) \
289
static struct freq_attr _name = \
290
__ATTR(_name, 0644, show_##_name, store_##_name)
291
292
struct
global_attr
{
293
struct
attribute
attr;
294
ssize_t
(*
show
)(
struct
kobject
*kobj,
295
struct
attribute
*
attr
,
char
*
buf
);
296
ssize_t
(*
store
)(
struct
kobject
*
a
,
struct
attribute
*
b
,
297
const
char
*
c
,
size_t
count
);
298
};
299
300
#define define_one_global_ro(_name) \
301
static struct global_attr _name = \
302
__ATTR(_name, 0444, show_##_name, NULL)
303
304
#define define_one_global_rw(_name) \
305
static struct global_attr _name = \
306
__ATTR(_name, 0644, show_##_name, store_##_name)
307
308
309
/*********************************************************************
310
* CPUFREQ 2.6. INTERFACE *
311
*********************************************************************/
312
int
cpufreq_get_policy
(
struct
cpufreq_policy
*policy,
unsigned
int
cpu
);
313
int
cpufreq_update_policy
(
unsigned
int
cpu
);
314
315
#ifdef CONFIG_CPU_FREQ
316
/* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */
317
unsigned
int
cpufreq_get
(
unsigned
int
cpu
);
318
#else
319
static
inline
unsigned
int
cpufreq_get
(
unsigned
int
cpu
)
320
{
321
return
0;
322
}
323
#endif
324
325
/* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */
326
#ifdef CONFIG_CPU_FREQ
327
unsigned
int
cpufreq_quick_get
(
unsigned
int
cpu
);
328
unsigned
int
cpufreq_quick_get_max
(
unsigned
int
cpu
);
329
#else
330
static
inline
unsigned
int
cpufreq_quick_get
(
unsigned
int
cpu
)
331
{
332
return
0;
333
}
334
static
inline
unsigned
int
cpufreq_quick_get_max
(
unsigned
int
cpu
)
335
{
336
return
0;
337
}
338
#endif
339
340
341
/*********************************************************************
342
* CPUFREQ DEFAULT GOVERNOR *
343
*********************************************************************/
344
345
346
/*
347
Performance governor is fallback governor if any other gov failed to
348
auto load due latency restrictions
349
*/
350
#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
351
extern
struct
cpufreq_governor
cpufreq_gov_performance
;
352
#endif
353
#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
354
#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_performance)
355
#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE)
356
extern
struct
cpufreq_governor
cpufreq_gov_powersave;
357
#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_powersave)
358
#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE)
359
extern
struct
cpufreq_governor
cpufreq_gov_userspace;
360
#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_userspace)
361
#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND)
362
extern
struct
cpufreq_governor
cpufreq_gov_ondemand;
363
#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_ondemand)
364
#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE)
365
extern
struct
cpufreq_governor
cpufreq_gov_conservative;
366
#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_conservative)
367
#endif
368
369
370
/*********************************************************************
371
* FREQUENCY TABLE HELPERS *
372
*********************************************************************/
373
374
#define CPUFREQ_ENTRY_INVALID ~0
375
#define CPUFREQ_TABLE_END ~1
376
377
struct
cpufreq_frequency_table
{
378
unsigned
int
index
;
/* any */
379
unsigned
int
frequency
;
/* kHz - doesn't need to be in ascending
380
* order */
381
};
382
383
int
cpufreq_frequency_table_cpuinfo
(
struct
cpufreq_policy
*policy,
384
struct
cpufreq_frequency_table
*
table
);
385
386
int
cpufreq_frequency_table_verify
(
struct
cpufreq_policy
*policy,
387
struct
cpufreq_frequency_table
*
table
);
388
389
int
cpufreq_frequency_table_target
(
struct
cpufreq_policy
*policy,
390
struct
cpufreq_frequency_table
*
table
,
391
unsigned
int
target_freq,
392
unsigned
int
relation,
393
unsigned
int
*
index
);
394
395
/* the following 3 funtions are for cpufreq core use only */
396
struct
cpufreq_frequency_table
*
cpufreq_frequency_get_table
(
unsigned
int
cpu
);
397
struct
cpufreq_policy
*
cpufreq_cpu_get
(
unsigned
int
cpu
);
398
void
cpufreq_cpu_put
(
struct
cpufreq_policy
*
data
);
399
400
/* the following are really really optional */
401
extern
struct
freq_attr
cpufreq_freq_attr_scaling_available_freqs
;
402
403
void
cpufreq_frequency_table_get_attr
(
struct
cpufreq_frequency_table
*
table
,
404
unsigned
int
cpu
);
405
406
void
cpufreq_frequency_table_put_attr
(
unsigned
int
cpu
);
407
408
409
#endif
/* _LINUX_CPUFREQ_H */
Generated on Thu Jan 10 2013 12:58:30 for Linux Kernel by
1.8.2