[ACPI] Avoid BIOS inflicted crashes by evaluating _PDC only once
[linux-2.6.git] / include / acpi / processor.h
1 #ifndef __ACPI_PROCESSOR_H
2 #define __ACPI_PROCESSOR_H
3
4 #include <linux/kernel.h>
5 #include <linux/config.h>
6
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 /* Power Management */
22
23 struct acpi_processor_cx;
24
25 struct acpi_power_register {
26         u8 descriptor;
27         u16 length;
28         u8 space_id;
29         u8 bit_width;
30         u8 bit_offset;
31         u8 reserved;
32         u64 address;
33 } __attribute__ ((packed));
34
35 struct acpi_processor_cx_policy {
36         u32 count;
37         struct acpi_processor_cx *state;
38         struct {
39                 u32 time;
40                 u32 ticks;
41                 u32 count;
42                 u32 bm;
43         } threshold;
44 };
45
46 struct acpi_processor_cx {
47         u8 valid;
48         u8 type;
49         u32 address;
50         u32 latency;
51         u32 latency_ticks;
52         u32 power;
53         u32 usage;
54         struct acpi_processor_cx_policy promotion;
55         struct acpi_processor_cx_policy demotion;
56 };
57
58 struct acpi_processor_power {
59         struct acpi_processor_cx *state;
60         unsigned long bm_check_timestamp;
61         u32 default_state;
62         u32 bm_activity;
63         int count;
64         struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];
65 };
66
67 /* Performance Management */
68
69 struct acpi_pct_register {
70         u8 descriptor;
71         u16 length;
72         u8 space_id;
73         u8 bit_width;
74         u8 bit_offset;
75         u8 reserved;
76         u64 address;
77 } __attribute__ ((packed));
78
79 struct acpi_processor_px {
80         acpi_integer core_frequency;    /* megahertz */
81         acpi_integer power;     /* milliWatts */
82         acpi_integer transition_latency;        /* microseconds */
83         acpi_integer bus_master_latency;        /* microseconds */
84         acpi_integer control;   /* control value */
85         acpi_integer status;    /* success indicator */
86 };
87
88 struct acpi_processor_performance {
89         unsigned int state;
90         unsigned int platform_limit;
91         struct acpi_pct_register control_register;
92         struct acpi_pct_register status_register;
93         unsigned int state_count;
94         struct acpi_processor_px *states;
95
96 };
97
98 /* Throttling Control */
99
100 struct acpi_processor_tx {
101         u16 power;
102         u16 performance;
103 };
104
105 struct acpi_processor_throttling {
106         int state;
107         u32 address;
108         u8 duty_offset;
109         u8 duty_width;
110         int state_count;
111         struct acpi_processor_tx states[ACPI_PROCESSOR_MAX_THROTTLING];
112 };
113
114 /* Limit Interface */
115
116 struct acpi_processor_lx {
117         int px;                 /* performace state */
118         int tx;                 /* throttle level */
119 };
120
121 struct acpi_processor_limit {
122         struct acpi_processor_lx state; /* current limit */
123         struct acpi_processor_lx thermal;       /* thermal limit */
124         struct acpi_processor_lx user;  /* user limit */
125 };
126
127 struct acpi_processor_flags {
128         u8 power:1;
129         u8 performance:1;
130         u8 throttling:1;
131         u8 limit:1;
132         u8 bm_control:1;
133         u8 bm_check:1;
134         u8 has_cst:1;
135         u8 power_setup_done:1;
136 };
137
138 struct acpi_processor {
139         acpi_handle handle;
140         u32 acpi_id;
141         u32 id;
142         u32 pblk;
143         int performance_platform_limit;
144         struct acpi_processor_flags flags;
145         struct acpi_processor_power power;
146         struct acpi_processor_performance *performance;
147         struct acpi_processor_throttling throttling;
148         struct acpi_processor_limit limit;
149
150         /* the _PDC objects for this processor, if any */
151         struct acpi_object_list *pdc;
152 };
153
154 struct acpi_processor_errata {
155         u8 smp;
156         struct {
157                 u8 throttle:1;
158                 u8 fdma:1;
159                 u8 reserved:6;
160                 u32 bmisx;
161         } piix4;
162 };
163
164 extern int acpi_processor_register_performance(struct acpi_processor_performance
165                                                *performance, unsigned int cpu);
166 extern void acpi_processor_unregister_performance(struct
167                                                   acpi_processor_performance
168                                                   *performance,
169                                                   unsigned int cpu);
170
171 /* note: this locks both the calling module and the processor module
172          if a _PPC object exists, rmmod is disallowed then */
173 int acpi_processor_notify_smm(struct module *calling_module);
174
175 /* for communication between multiple parts of the processor kernel module */
176 extern struct acpi_processor *processors[NR_CPUS];
177 extern struct acpi_processor_errata errata;
178
179 void arch_acpi_processor_init_pdc(struct acpi_processor *pr);
180
181 #ifdef ARCH_HAS_POWER_INIT
182 void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags,
183                                         unsigned int cpu);
184 #else
185 static inline void acpi_processor_power_init_bm_check(struct
186                                                       acpi_processor_flags
187                                                       *flags, unsigned int cpu)
188 {
189         flags->bm_check = 1;
190         return;
191 }
192 #endif
193
194 /* in processor_perflib.c */
195
196 #ifdef CONFIG_CPU_FREQ
197 void acpi_processor_ppc_init(void);
198 void acpi_processor_ppc_exit(void);
199 int acpi_processor_ppc_has_changed(struct acpi_processor *pr);
200 #else
201 static inline void acpi_processor_ppc_init(void)
202 {
203         return;
204 }
205 static inline void acpi_processor_ppc_exit(void)
206 {
207         return;
208 }
209 static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr)
210 {
211         static unsigned int printout = 1;
212         if (printout) {
213                 printk(KERN_WARNING
214                        "Warning: Processor Platform Limit event detected, but not handled.\n");
215                 printk(KERN_WARNING
216                        "Consider compiling CPUfreq support into your kernel.\n");
217                 printout = 0;
218         }
219         return 0;
220 }
221 #endif                          /* CONFIG_CPU_FREQ */
222
223 /* in processor_throttling.c */
224 int acpi_processor_get_throttling_info(struct acpi_processor *pr);
225 int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
226 ssize_t acpi_processor_write_throttling(struct file *file,
227                                         const char __user * buffer,
228                                         size_t count, loff_t * data);
229 extern struct file_operations acpi_processor_throttling_fops;
230
231 /* in processor_idle.c */
232 int acpi_processor_power_init(struct acpi_processor *pr,
233                               struct acpi_device *device);
234 int acpi_processor_cst_has_changed(struct acpi_processor *pr);
235 int acpi_processor_power_exit(struct acpi_processor *pr,
236                               struct acpi_device *device);
237
238 /* in processor_thermal.c */
239 int acpi_processor_get_limit_info(struct acpi_processor *pr);
240 ssize_t acpi_processor_write_limit(struct file *file,
241                                    const char __user * buffer,
242                                    size_t count, loff_t * data);
243 extern struct file_operations acpi_processor_limit_fops;
244
245 #ifdef CONFIG_CPU_FREQ
246 void acpi_thermal_cpufreq_init(void);
247 void acpi_thermal_cpufreq_exit(void);
248 #else
249 static inline void acpi_thermal_cpufreq_init(void)
250 {
251         return;
252 }
253 static inline void acpi_thermal_cpufreq_exit(void)
254 {
255         return;
256 }
257 #endif
258
259 #endif