Blame view

include/linux/cpufreq.h 12.4 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  /*
   *  linux/include/linux/cpufreq.h
   *
   *  Copyright (C) 2001 Russell King
   *            (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
6
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
11
12
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  #ifndef _LINUX_CPUFREQ_H
  #define _LINUX_CPUFREQ_H
83933af47   Arjan van de Ven   [CPUFREQ] convert...
13
  #include <linux/mutex.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
19
20
21
  #include <linux/notifier.h>
  #include <linux/threads.h>
  #include <linux/device.h>
  #include <linux/kobject.h>
  #include <linux/sysfs.h>
  #include <linux/completion.h>
  #include <linux/workqueue.h>
  #include <linux/cpumask.h>
4e57b6817   Tim Schmielau   [PATCH] fix missi...
22
  #include <asm/div64.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
28
29
  
  #define CPUFREQ_NAME_LEN 16
  
  
  /*********************************************************************
   *                     CPUFREQ NOTIFIER INTERFACE                    *
   *********************************************************************/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
  #define CPUFREQ_TRANSITION_NOTIFIER	(0)
  #define CPUFREQ_POLICY_NOTIFIER		(1)
6070b5de5   Satyam Sharma   [CPUFREQ] impleme...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  #ifdef CONFIG_CPU_FREQ
  int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list);
  int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);
  #else		/* CONFIG_CPU_FREQ */
  static inline int cpufreq_register_notifier(struct notifier_block *nb,
  						unsigned int list)
  {
  	return 0;
  }
  static inline int cpufreq_unregister_notifier(struct notifier_block *nb,
  						unsigned int list)
  {
  	return 0;
  }
  #endif		/* CONFIG_CPU_FREQ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
49
50
51
52
53
54
  
  /* if (cpufreq_driver->target) exists, the ->governor decides what frequency
   * within the limits is used. If (cpufreq_driver->setpolicy> exists, these
   * two generic policies are available:
   */
  
  #define CPUFREQ_POLICY_POWERSAVE	(1)
  #define CPUFREQ_POLICY_PERFORMANCE	(2)
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
55
56
57
  /* Frequency values here are CPU kHz so that hardware which doesn't run
   * with some frequencies can complain without having to guess what per
   * cent / per mille means.
b53cc6ead   Dave Jones   [CPUFREQ] fix up ...
58
   * Maximum transition latency is in nanoseconds - if it's unknown,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
62
   * CPUFREQ_ETERNAL shall be used.
   */
  
  struct cpufreq_governor;
8aa84ad8d   Thomas Renninger   [CPUFREQ] Introdu...
63
64
  /* /sys/devices/system/cpu/cpufreq: entry point for global variables */
  extern struct kobject *cpufreq_global_kobject;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
67
68
  #define CPUFREQ_ETERNAL			(-1)
  struct cpufreq_cpuinfo {
  	unsigned int		max_freq;
  	unsigned int		min_freq;
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
69
70
71
  
  	/* in 10^(-9) s = nanoseconds */
  	unsigned int		transition_latency;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
73
74
75
76
  };
  
  struct cpufreq_real_policy {
  	unsigned int		min;    /* in kHz */
  	unsigned int		max;    /* in kHz */
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
77
  	unsigned int		policy; /* see above */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
  	struct cpufreq_governor	*governor; /* see below */
  };
  
  struct cpufreq_policy {
835481d9b   Rusty Russell   cpumask: convert ...
82
83
  	cpumask_var_t		cpus;	/* CPUs requiring sw coordination */
  	cpumask_var_t		related_cpus; /* CPUs with any coordination */
3b2d99429   Venkatesh Pallipadi   P-state software ...
84
85
  	unsigned int		shared_type; /* ANY or ALL affected CPUs
  						should set cpufreq */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
88
89
90
91
92
  	unsigned int		cpu;    /* cpu nr of registered CPU */
  	struct cpufreq_cpuinfo	cpuinfo;/* see above */
  
  	unsigned int		min;    /* in kHz */
  	unsigned int		max;    /* in kHz */
  	unsigned int		cur;    /* in kHz, only needed if cpufreq
  					 * governors are used */
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
93
  	unsigned int		policy; /* see above */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
  	struct cpufreq_governor	*governor; /* see below */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
97
98
99
100
101
102
103
104
105
106
  	struct work_struct	update; /* if update_policy() needs to be
  					 * called, but you're in IRQ context */
  
  	struct cpufreq_real_policy	user_policy;
  
  	struct kobject		kobj;
  	struct completion	kobj_unregister;
  };
  
  #define CPUFREQ_ADJUST		(0)
  #define CPUFREQ_INCOMPATIBLE	(1)
  #define CPUFREQ_NOTIFY		(2)
a1531acd4   Thomas Renninger   cpufreq acpi: onl...
107
  #define CPUFREQ_START		(3)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108

46f18e3a2   Venkatesh Pallipadi   ACPI: HW P-state ...
109
110
111
112
  #define CPUFREQ_SHARED_TYPE_NONE (0) /* None */
  #define CPUFREQ_SHARED_TYPE_HW	 (1) /* HW does needed coordination */
  #define CPUFREQ_SHARED_TYPE_ALL	 (2) /* All dependent CPUs should set freq */
  #define CPUFREQ_SHARED_TYPE_ANY	 (3) /* Freq can be set from any dependent CPU*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
115
116
117
118
  
  /******************** cpufreq transition notifiers *******************/
  
  #define CPUFREQ_PRECHANGE	(0)
  #define CPUFREQ_POSTCHANGE	(1)
  #define CPUFREQ_RESUMECHANGE	(8)
42d4dc3f4   Benjamin Herrenschmidt   [PATCH] Add suspe...
119
  #define CPUFREQ_SUSPENDCHANGE	(9)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
  
  struct cpufreq_freqs {
  	unsigned int cpu;	/* cpu nr */
  	unsigned int old;
  	unsigned int new;
  	u8 flags;		/* flags of cpufreq_driver, see below. */
  };
  
  
  /**
   * cpufreq_scale - "old * mult / div" calculation for large values (32-bit-arch safe)
   * @old:   old value
   * @div:   divisor
   * @mult:  multiplier
   *
   *
   *    new = old * mult / div
   */
  static inline unsigned long cpufreq_scale(unsigned long old, u_int div, u_int mult)
  {
  #if BITS_PER_LONG == 32
  
  	u64 result = ((u64) old) * ((u64) mult);
  	do_div(result, div);
  	return (unsigned long) result;
  
  #elif BITS_PER_LONG == 64
  
  	unsigned long result = old * ((u64) mult);
  	result /= div;
  	return result;
  
  #endif
  };
  
  /*********************************************************************
   *                          CPUFREQ GOVERNORS                        *
   *********************************************************************/
  
  #define CPUFREQ_GOV_START  1
  #define CPUFREQ_GOV_STOP   2
  #define CPUFREQ_GOV_LIMITS 3
  
  struct cpufreq_governor {
  	char	name[CPUFREQ_NAME_LEN];
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
165
  	int	(*governor)	(struct cpufreq_policy *policy,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
  				 unsigned int event);
9e76988e9   Venki Pallipadi   [CPUFREQ] Elimina...
167
168
  	ssize_t	(*show_setspeed)	(struct cpufreq_policy *policy,
  					 char *buf);
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
169
  	int	(*store_setspeed)	(struct cpufreq_policy *policy,
9e76988e9   Venki Pallipadi   [CPUFREQ] Elimina...
170
  					 unsigned int freq);
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
171
172
173
  	unsigned int max_transition_latency; /* HW must be able to switch to
  			next freq faster than this value in nano secs or we
  			will fallback to performance governor */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
  	struct list_head	governor_list;
  	struct module		*owner;
  };
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
177
178
  /*
   * Pass a target to the cpufreq driver.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
183
184
185
   */
  extern int cpufreq_driver_target(struct cpufreq_policy *policy,
  				 unsigned int target_freq,
  				 unsigned int relation);
  extern int __cpufreq_driver_target(struct cpufreq_policy *policy,
  				   unsigned int target_freq,
  				   unsigned int relation);
bf0b90e35   venkatesh.pallipadi@intel.com   [CPUFREQ][1/6] cp...
186
187
  extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy,
  				   unsigned int cpu);
dfde5d62e   Venkatesh Pallipadi   [CPUFREQ][8/8] ac...
188

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
  int cpufreq_register_governor(struct cpufreq_governor *governor);
  void cpufreq_unregister_governor(struct cpufreq_governor *governor);
  
  
  /*********************************************************************
   *                      CPUFREQ DRIVER INTERFACE                     *
   *********************************************************************/
  
  #define CPUFREQ_RELATION_L 0  /* lowest frequency at or above target */
  #define CPUFREQ_RELATION_H 1  /* highest frequency below or at target */
  
  struct freq_attr;
  
  struct cpufreq_driver {
  	struct module           *owner;
  	char			name[CPUFREQ_NAME_LEN];
  	u8			flags;
  
  	/* needed by all drivers */
  	int	(*init)		(struct cpufreq_policy *policy);
  	int	(*verify)	(struct cpufreq_policy *policy);
  
  	/* define one out of two */
  	int	(*setpolicy)	(struct cpufreq_policy *policy);
  	int	(*target)	(struct cpufreq_policy *policy,
  				 unsigned int target_freq,
  				 unsigned int relation);
  
  	/* should be defined, if possible */
  	unsigned int	(*get)	(unsigned int cpu);
  
  	/* optional */
bf0b90e35   venkatesh.pallipadi@intel.com   [CPUFREQ][1/6] cp...
221
222
  	unsigned int (*getavg)	(struct cpufreq_policy *policy,
  				 unsigned int cpu);
e2f74f355   Thomas Renninger   [ACPI/CPUFREQ] In...
223
  	int	(*bios_limit)	(int cpu, unsigned int *limit);
bf0b90e35   venkatesh.pallipadi@intel.com   [CPUFREQ][1/6] cp...
224

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
  	int	(*exit)		(struct cpufreq_policy *policy);
7ca64e2d2   Rafael J. Wysocki   [CPUFREQ] Remove ...
226
  	int	(*suspend)	(struct cpufreq_policy *policy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
228
229
230
231
  	int	(*resume)	(struct cpufreq_policy *policy);
  	struct freq_attr	**attr;
  };
  
  /* flags */
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
232
  #define CPUFREQ_STICKY		0x01	/* the driver isn't removed even if
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
  					 * all ->init() calls failed */
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
234
  #define CPUFREQ_CONST_LOOPS	0x02	/* loops_per_jiffy or other kernel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
236
  					 * "constants" aren't affected by
  					 * frequency transitions */
42d4dc3f4   Benjamin Herrenschmidt   [PATCH] Add suspe...
237
238
  #define CPUFREQ_PM_NO_WARN	0x04	/* don't warn on suspend/resume speed
  					 * mismatches */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239

221dee285   Linus Torvalds   Revert "[CPUFREQ]...
240
241
  int cpufreq_register_driver(struct cpufreq_driver *driver_data);
  int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
244
  
  
  void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state);
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
245
  static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned int min, unsigned int max)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
  {
  	if (policy->min < min)
  		policy->min = min;
  	if (policy->max < min)
  		policy->max = min;
  	if (policy->min > max)
  		policy->min = max;
  	if (policy->max > max)
  		policy->max = max;
  	if (policy->min > policy->max)
  		policy->min = policy->max;
  	return;
  }
  
  struct freq_attr {
  	struct attribute attr;
  	ssize_t (*show)(struct cpufreq_policy *, char *);
  	ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);
  };
6dad2a296   Borislav Petkov   cpufreq: Unify sy...
265
266
267
268
269
270
271
  #define cpufreq_freq_attr_ro(_name)		\
  static struct freq_attr _name =			\
  __ATTR(_name, 0444, show_##_name, NULL)
  
  #define cpufreq_freq_attr_ro_perm(_name, _perm)	\
  static struct freq_attr _name =			\
  __ATTR(_name, _perm, show_##_name, NULL)
6dad2a296   Borislav Petkov   cpufreq: Unify sy...
272
273
274
  #define cpufreq_freq_attr_rw(_name)		\
  static struct freq_attr _name =			\
  __ATTR(_name, 0644, show_##_name, store_##_name)
8aa84ad8d   Thomas Renninger   [CPUFREQ] Introdu...
275
276
277
278
279
280
281
  struct global_attr {
  	struct attribute attr;
  	ssize_t (*show)(struct kobject *kobj,
  			struct attribute *attr, char *buf);
  	ssize_t (*store)(struct kobject *a, struct attribute *b,
  			 const char *c, size_t count);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282

6dad2a296   Borislav Petkov   cpufreq: Unify sy...
283
284
285
286
287
288
289
  #define define_one_global_ro(_name)		\
  static struct global_attr _name =		\
  __ATTR(_name, 0444, show_##_name, NULL)
  
  #define define_one_global_rw(_name)		\
  static struct global_attr _name =		\
  __ATTR(_name, 0644, show_##_name, store_##_name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
291
292
  /*********************************************************************
   *                        CPUFREQ 2.6. INTERFACE                     *
   *********************************************************************/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
  int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
  int cpufreq_update_policy(unsigned int cpu);
2eca40a8c   Randy Dunlap   cpufreq: add cpuf...
295
  #ifdef CONFIG_CPU_FREQ
ff0ce6845   Linus Torvalds   Revert "[PATCH] x...
296
297
  /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */
  unsigned int cpufreq_get(unsigned int cpu);
2eca40a8c   Randy Dunlap   cpufreq: add cpuf...
298
299
300
301
302
303
  #else
  static inline unsigned int cpufreq_get(unsigned int cpu)
  {
  	return 0;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304

ff0ce6845   Linus Torvalds   Revert "[PATCH] x...
305
  /* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */
95235ca2c   Venkatesh Pallipadi   [CPUFREQ] CPU fre...
306
307
  #ifdef CONFIG_CPU_FREQ
  unsigned int cpufreq_quick_get(unsigned int cpu);
3d7371088   Jesse Barnes   cpufreq: expose a...
308
  unsigned int cpufreq_quick_get_max(unsigned int cpu);
95235ca2c   Venkatesh Pallipadi   [CPUFREQ] CPU fre...
309
310
311
312
313
  #else
  static inline unsigned int cpufreq_quick_get(unsigned int cpu)
  {
  	return 0;
  }
3d7371088   Jesse Barnes   cpufreq: expose a...
314
315
316
317
  static inline unsigned int cpufreq_quick_get_max(unsigned int cpu)
  {
  	return 0;
  }
95235ca2c   Venkatesh Pallipadi   [CPUFREQ] CPU fre...
318
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
320
321
322
  
  /*********************************************************************
   *                       CPUFREQ DEFAULT GOVERNOR                    *
   *********************************************************************/
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
323
324
325
326
  /*
    Performance governor is fallback governor if any other gov failed to
    auto load due latency restrictions
  */
6afde10c3   Thomas Renninger   [CPUFREQ] Only ch...
327
  #ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
328
  extern struct cpufreq_governor cpufreq_gov_performance;
6afde10c3   Thomas Renninger   [CPUFREQ] Only ch...
329
  #endif
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
330
331
  #ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
  #define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_performance)
30d221db4   Alessandro Guido   [CPUFREQ] allow u...
332
333
334
  #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE)
  extern struct cpufreq_governor cpufreq_gov_powersave;
  #define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_powersave)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
336
  #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE)
  extern struct cpufreq_governor cpufreq_gov_userspace;
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
337
338
339
340
341
342
343
  #define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_userspace)
  #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND)
  extern struct cpufreq_governor cpufreq_gov_ondemand;
  #define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_ondemand)
  #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE)
  extern struct cpufreq_governor cpufreq_gov_conservative;
  #define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_conservative)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
  #endif
  
  
  /*********************************************************************
   *                     FREQUENCY TABLE HELPERS                       *
   *********************************************************************/
  
  #define CPUFREQ_ENTRY_INVALID ~0
  #define CPUFREQ_TABLE_END     ~1
  
  struct cpufreq_frequency_table {
  	unsigned int	index;     /* any */
  	unsigned int	frequency; /* kHz - doesn't need to be in ascending
  				    * order */
  };
  
  int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
  				    struct cpufreq_frequency_table *table);
  
  int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
  				   struct cpufreq_frequency_table *table);
  
  int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
  				   struct cpufreq_frequency_table *table,
  				   unsigned int target_freq,
  				   unsigned int relation,
  				   unsigned int *index);
  
  /* the following 3 funtions are for cpufreq core use only */
  struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
  struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu);
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
375
  void   cpufreq_cpu_put(struct cpufreq_policy *data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376
377
378
  
  /* the following are really really optional */
  extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
379
  void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
381
382
  				      unsigned int cpu);
  
  void cpufreq_frequency_table_put_attr(unsigned int cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
  #endif /* _LINUX_CPUFREQ_H */