Blame view

include/linux/cpufreq.h 11.6 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   *  linux/include/linux/cpufreq.h
   *
   *  Copyright (C) 2001 Russell King
   *            (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
   *            
   *
   * $Id: cpufreq.h,v 1.36 2003/01/20 17:31:48 db Exp $
   *
   * 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...
16
  #include <linux/mutex.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
20
21
22
23
24
  #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...
25
  #include <asm/div64.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
30
31
32
  
  #define CPUFREQ_NAME_LEN 16
  
  
  /*********************************************************************
   *                     CPUFREQ NOTIFIER INTERFACE                    *
   *********************************************************************/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
  #define CPUFREQ_TRANSITION_NOTIFIER	(0)
  #define CPUFREQ_POLICY_NOTIFIER		(1)
6070b5de5   Satyam Sharma   [CPUFREQ] impleme...
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  #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
50
51
52
53
54
55
56
57
58
59
60
61
  
  /* 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)
  
  /* 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 ...
62
   * Maximum transition latency is in nanoseconds - if it's unknown,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
   * CPUFREQ_ETERNAL shall be used.
   */
  
  struct cpufreq_governor;
  
  #define CPUFREQ_ETERNAL			(-1)
  struct cpufreq_cpuinfo {
  	unsigned int		max_freq;
  	unsigned int		min_freq;
  	unsigned int		transition_latency; /* in 10^(-9) s = nanoseconds */
  };
  
  struct cpufreq_real_policy {
  	unsigned int		min;    /* in kHz */
  	unsigned int		max;    /* in kHz */
          unsigned int		policy; /* see above */
  	struct cpufreq_governor	*governor; /* see below */
  };
  
  struct cpufreq_policy {
  	cpumask_t		cpus;	/* affected CPUs */
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
93
94
  	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 */
          unsigned int		policy; /* see above */
  	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)
46f18e3a2   Venkatesh Pallipadi   ACPI: HW P-state ...
107
108
109
110
  #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
111
112
113
114
115
116
  
  /******************** cpufreq transition notifiers *******************/
  
  #define CPUFREQ_PRECHANGE	(0)
  #define CPUFREQ_POSTCHANGE	(1)
  #define CPUFREQ_RESUMECHANGE	(8)
42d4dc3f4   Benjamin Herrenschmidt   [PATCH] Add suspe...
117
  #define CPUFREQ_SUSPENDCHANGE	(9)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
119
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];
  	int 	(*governor)	(struct cpufreq_policy *policy,
  				 unsigned int event);
9e76988e9   Venki Pallipadi   [CPUFREQ] Elimina...
165
166
167
168
  	ssize_t	(*show_setspeed)	(struct cpufreq_policy *policy,
  					 char *buf);
  	int 	(*store_setspeed)	(struct cpufreq_policy *policy,
  					 unsigned int freq);
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
169
170
171
  	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
172
173
174
175
176
177
178
179
180
181
182
183
  	struct list_head	governor_list;
  	struct module		*owner;
  };
  
  /* pass a target to the cpufreq driver 
   */
  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);
5a01f2e8f   Venkatesh Pallipadi   [CPUFREQ] Rewrite...
184
  extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy);
dfde5d62e   Venkatesh Pallipadi   [CPUFREQ][8/8] ac...
185

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
  int cpufreq_register_governor(struct cpufreq_governor *governor);
  void cpufreq_unregister_governor(struct cpufreq_governor *governor);
5a01f2e8f   Venkatesh Pallipadi   [CPUFREQ] Rewrite...
188
189
190
191
  int lock_policy_rwsem_read(int cpu);
  int lock_policy_rwsem_write(int cpu);
  void unlock_policy_rwsem_read(int cpu);
  void unlock_policy_rwsem_write(int cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
  
  /*********************************************************************
   *                      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 */
dfde5d62e   Venkatesh Pallipadi   [CPUFREQ][8/8] ac...
221
  	unsigned int (*getavg)	(unsigned int cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
  	int	(*exit)		(struct cpufreq_policy *policy);
e00d9967e   Bernard Blackham   [PATCH] pm: fix u...
223
  	int	(*suspend)	(struct cpufreq_policy *policy, pm_message_t pmsg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
224
225
226
227
228
229
230
231
232
233
234
  	int	(*resume)	(struct cpufreq_policy *policy);
  	struct freq_attr	**attr;
  };
  
  /* flags */
  
  #define CPUFREQ_STICKY		0x01	/* the driver isn't removed even if 
  					 * all ->init() calls failed */
  #define CPUFREQ_CONST_LOOPS 	0x02	/* loops_per_jiffy or other kernel
  					 * "constants" aren't affected by
  					 * frequency transitions */
42d4dc3f4   Benjamin Herrenschmidt   [PATCH] Add suspe...
235
236
  #define CPUFREQ_PM_NO_WARN	0x04	/* don't warn on suspend/resume speed
  					 * mismatches */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237

221dee285   Linus Torvalds   Revert "[CPUFREQ]...
238
239
  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
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
  
  
  void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state);
  
  
  static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned int min, unsigned int max) 
  {
  	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);
  };
  
  
  /*********************************************************************
   *                        CPUFREQ 2.6. INTERFACE                     *
   *********************************************************************/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
271
  int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
  int cpufreq_update_policy(unsigned int cpu);
ff0ce6845   Linus Torvalds   Revert "[PATCH] x...
272
273
  /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */
  unsigned int cpufreq_get(unsigned int cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274

ff0ce6845   Linus Torvalds   Revert "[PATCH] x...
275
  /* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */
95235ca2c   Venkatesh Pallipadi   [CPUFREQ] CPU fre...
276
277
278
279
280
281
282
283
  #ifdef CONFIG_CPU_FREQ
  unsigned int cpufreq_quick_get(unsigned int cpu);
  #else
  static inline unsigned int cpufreq_quick_get(unsigned int cpu)
  {
  	return 0;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
286
287
  
  /*********************************************************************
   *                       CPUFREQ DEFAULT GOVERNOR                    *
   *********************************************************************/
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
288
289
290
291
  /*
    Performance governor is fallback governor if any other gov failed to
    auto load due latency restrictions
  */
6afde10c3   Thomas Renninger   [CPUFREQ] Only ch...
292
  #ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
  extern struct cpufreq_governor cpufreq_gov_performance;
6afde10c3   Thomas Renninger   [CPUFREQ] Only ch...
294
  #endif
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
295
296
  #ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
  #define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_performance)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
298
  #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE)
  extern struct cpufreq_governor cpufreq_gov_userspace;
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
299
300
301
302
303
304
305
  #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
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
  #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);
  void   cpufreq_cpu_put (struct cpufreq_policy *data);
  
  /* the following are really really optional */
  extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
  
  void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table, 
  				      unsigned int cpu);
  
  void cpufreq_frequency_table_put_attr(unsigned int cpu);
  
  
  /*********************************************************************
   *                     UNIFIED DEBUG HELPERS                         *
   *********************************************************************/
  
  #define CPUFREQ_DEBUG_CORE	1
  #define CPUFREQ_DEBUG_DRIVER	2
  #define CPUFREQ_DEBUG_GOVERNOR	4
  
  #ifdef CONFIG_CPU_FREQ_DEBUG
  
  extern void cpufreq_debug_printk(unsigned int type, const char *prefix, 
  				 const char *fmt, ...);
  
  #else
  
  #define cpufreq_debug_printk(msg...) do { } while(0)
  
  #endif /* CONFIG_CPU_FREQ_DEBUG */
  
  #endif /* _LINUX_CPUFREQ_H */