Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
processor.h
Go to the documentation of this file.
1 #ifndef __ACPI_PROCESSOR_H
2 #define __ACPI_PROCESSOR_H
3 
4 #include <linux/kernel.h>
5 #include <linux/cpu.h>
6 #include <linux/thermal.h>
7 #include <asm/acpi.h>
8 
9 #define ACPI_PROCESSOR_BUSY_METRIC 10
10 
11 #define ACPI_PROCESSOR_MAX_POWER 8
12 #define ACPI_PROCESSOR_MAX_C2_LATENCY 100
13 #define ACPI_PROCESSOR_MAX_C3_LATENCY 1000
14 
15 #define ACPI_PROCESSOR_MAX_THROTTLING 16
16 #define ACPI_PROCESSOR_MAX_THROTTLE 250 /* 25% */
17 #define ACPI_PROCESSOR_MAX_DUTY_WIDTH 4
18 
19 #define ACPI_PDC_REVISION_ID 0x1
20 
21 #define ACPI_PSD_REV0_REVISION 0 /* Support for _PSD as in ACPI 3.0 */
22 #define ACPI_PSD_REV0_ENTRIES 5
23 
24 #define ACPI_TSD_REV0_REVISION 0 /* Support for _PSD as in ACPI 3.0 */
25 #define ACPI_TSD_REV0_ENTRIES 5
26 /*
27  * Types of coordination defined in ACPI 3.0. Same macros can be used across
28  * P, C and T states
29  */
30 #define DOMAIN_COORD_TYPE_SW_ALL 0xfc
31 #define DOMAIN_COORD_TYPE_SW_ANY 0xfd
32 #define DOMAIN_COORD_TYPE_HW_ALL 0xfe
33 
34 #define ACPI_CSTATE_SYSTEMIO 0
35 #define ACPI_CSTATE_FFH 1
36 #define ACPI_CSTATE_HALT 2
37 
38 #define ACPI_CX_DESC_LEN 32
39 
40 /* Power Management */
41 
42 struct acpi_processor_cx;
43 
52 } __attribute__ ((packed));
53 
63 };
64 
67  unsigned long bm_check_timestamp;
69  int count;
72 };
73 
74 /* Performance Management */
75 
82 } __attribute__ ((packed));
83 
92 } __attribute__ ((packed));
93 
95  u64 core_frequency; /* megahertz */
96  u64 power; /* milliWatts */
97  u64 transition_latency; /* microseconds */
98  u64 bus_master_latency; /* microseconds */
99  u64 control; /* control value */
100  u64 status; /* success indicator */
101 };
102 
104  unsigned int state;
105  unsigned int platform_limit;
108  unsigned int state_count;
112  unsigned int shared_type;
113 };
114 
115 /* Throttling Control */
116 
123 } __attribute__ ((packed));
124 
133 } __attribute__ ((packed));
134 
137  u64 power; /* milliWatts */
138  u64 transition_latency; /* microseconds */
139  u64 control; /* control value */
140  u64 status; /* success indicator */
141 };
145 };
146 
147 struct acpi_processor;
149  unsigned int state;
150  unsigned int platform_limit;
153  unsigned int state_count;
159  int state, bool force);
160 
165  unsigned int shared_type;
167 };
168 
169 /* Limit Interface */
170 
172  int px; /* performance state */
173  int tx; /* throttle level */
174 };
175 
177  struct acpi_processor_lx state; /* current limit */
178  struct acpi_processor_lx thermal; /* thermal limit */
179  struct acpi_processor_lx user; /* user limit */
180 };
181 
193 };
194 
202  /* 0 - states 0..n-th state available */
203 
210 };
211 
214  struct {
216  u8 fdma:1;
219  } piix4;
220 };
221 
222 extern void acpi_processor_load_module(struct acpi_processor *pr);
225  __percpu *performance);
226 
228  *performance, unsigned int cpu);
229 extern void acpi_processor_unregister_performance(struct
231  *performance,
232  unsigned int cpu);
233 
234 /* note: this locks both the calling module and the processor module
235  if a _PPC object exists, rmmod is disallowed then */
236 int acpi_processor_notify_smm(struct module *calling_module);
237 
238 /* for communication between multiple parts of the processor kernel module */
239 DECLARE_PER_CPU(struct acpi_processor *, processors);
240 extern struct acpi_processor_errata errata;
241 
242 #ifdef ARCH_HAS_POWER_INIT
244  unsigned int cpu);
245 int acpi_processor_ffh_cstate_probe(unsigned int cpu,
246  struct acpi_processor_cx *cx,
247  struct acpi_power_register *reg);
249 #else
250 static inline void acpi_processor_power_init_bm_check(struct
252  *flags, unsigned int cpu)
253 {
254  flags->bm_check = 1;
255  return;
256 }
257 static inline int acpi_processor_ffh_cstate_probe(unsigned int cpu,
258  struct acpi_processor_cx *cx,
259  struct acpi_power_register
260  *reg)
261 {
262  return -1;
263 }
264 static inline void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx
265  *cstate)
266 {
267  return;
268 }
269 #endif
270 
271 /* in processor_perflib.c */
272 
273 #ifdef CONFIG_CPU_FREQ
274 void acpi_processor_ppc_init(void);
275 void acpi_processor_ppc_exit(void);
276 int acpi_processor_ppc_has_changed(struct acpi_processor *pr, int event_flag);
277 extern int acpi_processor_get_bios_limit(int cpu, unsigned int *limit);
278 #else
279 static inline void acpi_processor_ppc_init(void)
280 {
281  return;
282 }
283 static inline void acpi_processor_ppc_exit(void)
284 {
285  return;
286 }
287 static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr,
288  int event_flag)
289 {
290  static unsigned int printout = 1;
291  if (printout) {
293  "Warning: Processor Platform Limit event detected, but not handled.\n");
295  "Consider compiling CPUfreq support into your kernel.\n");
296  printout = 0;
297  }
298  return 0;
299 }
300 static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit)
301 {
302  return -ENODEV;
303 }
304 
305 #endif /* CONFIG_CPU_FREQ */
306 
307 /* in processor_core.c */
309 int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id);
310 
311 /* in processor_throttling.c */
314 extern int acpi_processor_set_throttling(struct acpi_processor *pr,
315  int state, bool force);
316 /*
317  * Reevaluate whether the T-state is invalid after one cpu is
318  * onlined/offlined. In such case the flags.throttling will be updated.
319  */
320 extern void acpi_processor_reevaluate_tstate(struct acpi_processor *pr,
321  unsigned long action);
323 extern void acpi_processor_throttling_init(void);
324 /* in processor_idle.c */
328 int acpi_processor_hotplug(struct acpi_processor *pr);
329 int acpi_processor_suspend(struct device *dev);
330 int acpi_processor_resume(struct device *dev);
331 extern struct cpuidle_driver acpi_idle_driver;
332 
333 /* in processor_thermal.c */
336 #ifdef CONFIG_CPU_FREQ
337 void acpi_thermal_cpufreq_init(void);
338 void acpi_thermal_cpufreq_exit(void);
339 #else
340 static inline void acpi_thermal_cpufreq_init(void)
341 {
342  return;
343 }
344 static inline void acpi_thermal_cpufreq_exit(void)
345 {
346  return;
347 }
348 #endif
349 
350 #endif