Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | /* |
2 | * acpi.h - ACPI Interface |
||
3 | * |
||
4 | * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> |
||
5 | * |
||
6 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||
7 | * |
||
8 | * This program is free software; you can redistribute it and/or modify |
||
9 | * it under the terms of the GNU General Public License as published by |
||
10 | * the Free Software Foundation; either version 2 of the License, or |
||
11 | * (at your option) any later version. |
||
12 | * |
||
13 | * This program is distributed in the hope that it will be useful, |
||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
16 | * GNU General Public License for more details. |
||
17 | * |
||
18 | * You should have received a copy of the GNU General Public License |
||
19 | * along with this program; if not, write to the Free Software |
||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
21 | * |
||
22 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||
23 | */ |
||
24 | |||
25 | #ifndef _LINUX_ACPI_H |
||
26 | #define _LINUX_ACPI_H |
||
27 | |||
28 | #ifndef _LINUX |
||
29 | #define _LINUX |
||
30 | #endif |
||
31 | |||
32 | #include <linux/list.h> |
||
33 | |||
34 | #include <acpi/acpi.h> |
||
35 | #include <acpi/acpi_bus.h> |
||
36 | #include <acpi/acpi_drivers.h> |
||
37 | #include <asm/acpi.h> |
||
38 | |||
39 | |||
40 | #ifdef CONFIG_ACPI_BOOT |
||
41 | |||
42 | enum acpi_irq_model_id { |
||
43 | ACPI_IRQ_MODEL_PIC = 0, |
||
44 | ACPI_IRQ_MODEL_IOAPIC, |
||
45 | ACPI_IRQ_MODEL_IOSAPIC, |
||
46 | ACPI_IRQ_MODEL_COUNT |
||
47 | }; |
||
48 | |||
49 | extern enum acpi_irq_model_id acpi_irq_model; |
||
50 | |||
51 | |||
52 | /* Root System Description Pointer (RSDP) */ |
||
53 | |||
54 | struct acpi_table_rsdp { |
||
55 | char signature[8]; |
||
56 | u8 checksum; |
||
57 | char oem_id[6]; |
||
58 | u8 revision; |
||
59 | u32 rsdt_address; |
||
60 | } __attribute__ ((packed)); |
||
61 | |||
62 | struct acpi20_table_rsdp { |
||
63 | char signature[8]; |
||
64 | u8 checksum; |
||
65 | char oem_id[6]; |
||
66 | u8 revision; |
||
67 | u32 rsdt_address; |
||
68 | u32 length; |
||
69 | u64 xsdt_address; |
||
70 | u8 ext_checksum; |
||
71 | u8 reserved[3]; |
||
72 | } __attribute__ ((packed)); |
||
73 | |||
74 | typedef struct { |
||
75 | u8 type; |
||
76 | u8 length; |
||
77 | } __attribute__ ((packed)) acpi_table_entry_header; |
||
78 | |||
79 | /* Root System Description Table (RSDT) */ |
||
80 | |||
81 | struct acpi_table_rsdt { |
||
82 | struct acpi_table_header header; |
||
83 | u32 entry[8]; |
||
84 | } __attribute__ ((packed)); |
||
85 | |||
86 | /* Extended System Description Table (XSDT) */ |
||
87 | |||
88 | struct acpi_table_xsdt { |
||
89 | struct acpi_table_header header; |
||
90 | u64 entry[1]; |
||
91 | } __attribute__ ((packed)); |
||
92 | |||
93 | /* Fixed ACPI Description Table (FADT) */ |
||
94 | |||
95 | struct acpi_table_fadt { |
||
96 | struct acpi_table_header header; |
||
97 | u32 facs_addr; |
||
98 | u32 dsdt_addr; |
||
99 | /* ... */ |
||
100 | } __attribute__ ((packed)); |
||
101 | |||
102 | /* Multiple APIC Description Table (MADT) */ |
||
103 | |||
104 | struct acpi_table_madt { |
||
105 | struct acpi_table_header header; |
||
106 | u32 lapic_address; |
||
107 | struct { |
||
108 | u32 pcat_compat:1; |
||
109 | u32 reserved:31; |
||
110 | } flags; |
||
111 | } __attribute__ ((packed)); |
||
112 | |||
113 | enum acpi_madt_entry_id { |
||
114 | ACPI_MADT_LAPIC = 0, |
||
115 | ACPI_MADT_IOAPIC, |
||
116 | ACPI_MADT_INT_SRC_OVR, |
||
117 | ACPI_MADT_NMI_SRC, |
||
118 | ACPI_MADT_LAPIC_NMI, |
||
119 | ACPI_MADT_LAPIC_ADDR_OVR, |
||
120 | ACPI_MADT_IOSAPIC, |
||
121 | ACPI_MADT_LSAPIC, |
||
122 | ACPI_MADT_PLAT_INT_SRC, |
||
123 | ACPI_MADT_ENTRY_COUNT |
||
124 | }; |
||
125 | |||
126 | typedef struct { |
||
127 | u16 polarity:2; |
||
128 | u16 trigger:2; |
||
129 | u16 reserved:12; |
||
130 | } __attribute__ ((packed)) acpi_interrupt_flags; |
||
131 | |||
132 | struct acpi_table_lapic { |
||
133 | acpi_table_entry_header header; |
||
134 | u8 acpi_id; |
||
135 | u8 id; |
||
136 | struct { |
||
137 | u32 enabled:1; |
||
138 | u32 reserved:31; |
||
139 | } flags; |
||
140 | } __attribute__ ((packed)); |
||
141 | |||
142 | struct acpi_table_ioapic { |
||
143 | acpi_table_entry_header header; |
||
144 | u8 id; |
||
145 | u8 reserved; |
||
146 | u32 address; |
||
147 | u32 global_irq_base; |
||
148 | } __attribute__ ((packed)); |
||
149 | |||
150 | struct acpi_table_int_src_ovr { |
||
151 | acpi_table_entry_header header; |
||
152 | u8 bus; |
||
153 | u8 bus_irq; |
||
154 | u32 global_irq; |
||
155 | acpi_interrupt_flags flags; |
||
156 | } __attribute__ ((packed)); |
||
157 | |||
158 | struct acpi_table_nmi_src { |
||
159 | acpi_table_entry_header header; |
||
160 | acpi_interrupt_flags flags; |
||
161 | u32 global_irq; |
||
162 | } __attribute__ ((packed)); |
||
163 | |||
164 | struct acpi_table_lapic_nmi { |
||
165 | acpi_table_entry_header header; |
||
166 | u8 acpi_id; |
||
167 | acpi_interrupt_flags flags; |
||
168 | u8 lint; |
||
169 | } __attribute__ ((packed)); |
||
170 | |||
171 | struct acpi_table_lapic_addr_ovr { |
||
172 | acpi_table_entry_header header; |
||
173 | u8 reserved[2]; |
||
174 | u64 address; |
||
175 | } __attribute__ ((packed)); |
||
176 | |||
177 | struct acpi_table_iosapic { |
||
178 | acpi_table_entry_header header; |
||
179 | u8 id; |
||
180 | u8 reserved; |
||
181 | u32 global_irq_base; |
||
182 | u64 address; |
||
183 | } __attribute__ ((packed)); |
||
184 | |||
185 | struct acpi_table_lsapic { |
||
186 | acpi_table_entry_header header; |
||
187 | u8 acpi_id; |
||
188 | u8 id; |
||
189 | u8 eid; |
||
190 | u8 reserved[3]; |
||
191 | struct { |
||
192 | u32 enabled:1; |
||
193 | u32 reserved:31; |
||
194 | } flags; |
||
195 | } __attribute__ ((packed)); |
||
196 | |||
197 | struct acpi_table_plat_int_src { |
||
198 | acpi_table_entry_header header; |
||
199 | acpi_interrupt_flags flags; |
||
200 | u8 type; /* See acpi_interrupt_type */ |
||
201 | u8 id; |
||
202 | u8 eid; |
||
203 | u8 iosapic_vector; |
||
204 | u32 global_irq; |
||
205 | u32 reserved; |
||
206 | } __attribute__ ((packed)); |
||
207 | |||
208 | enum acpi_interrupt_id { |
||
209 | ACPI_INTERRUPT_PMI = 1, |
||
210 | ACPI_INTERRUPT_INIT, |
||
211 | ACPI_INTERRUPT_CPEI, |
||
212 | ACPI_INTERRUPT_COUNT |
||
213 | }; |
||
214 | |||
215 | #define ACPI_SPACE_MEM 0 |
||
216 | |||
217 | struct acpi_gen_regaddr { |
||
218 | u8 space_id; |
||
219 | u8 bit_width; |
||
220 | u8 bit_offset; |
||
221 | u8 resv; |
||
222 | u32 addrl; |
||
223 | u32 addrh; |
||
224 | } __attribute__ ((packed)); |
||
225 | |||
226 | struct acpi_table_hpet { |
||
227 | struct acpi_table_header header; |
||
228 | u32 id; |
||
229 | struct acpi_gen_regaddr addr; |
||
230 | u8 number; |
||
231 | u16 min_tick; |
||
232 | u8 page_protect; |
||
233 | } __attribute__ ((packed)); |
||
234 | |||
235 | /* |
||
236 | * System Resource Affinity Table (SRAT) |
||
237 | * see http://www.microsoft.com/hwdev/design/srat.htm |
||
238 | */ |
||
239 | |||
240 | struct acpi_table_srat { |
||
241 | struct acpi_table_header header; |
||
242 | u32 table_revision; |
||
243 | u64 reserved; |
||
244 | } __attribute__ ((packed)); |
||
245 | |||
246 | enum acpi_srat_entry_id { |
||
247 | ACPI_SRAT_PROCESSOR_AFFINITY = 0, |
||
248 | ACPI_SRAT_MEMORY_AFFINITY, |
||
249 | ACPI_SRAT_ENTRY_COUNT |
||
250 | }; |
||
251 | |||
252 | struct acpi_table_processor_affinity { |
||
253 | acpi_table_entry_header header; |
||
254 | u8 proximity_domain; |
||
255 | u8 apic_id; |
||
256 | struct { |
||
257 | u32 enabled:1; |
||
258 | u32 reserved:31; |
||
259 | } flags; |
||
260 | u8 lsapic_eid; |
||
261 | u8 reserved[7]; |
||
262 | } __attribute__ ((packed)); |
||
263 | |||
264 | struct acpi_table_memory_affinity { |
||
265 | acpi_table_entry_header header; |
||
266 | u8 proximity_domain; |
||
267 | u8 reserved1[5]; |
||
268 | u32 base_addr_lo; |
||
269 | u32 base_addr_hi; |
||
270 | u32 length_lo; |
||
271 | u32 length_hi; |
||
272 | u32 memory_type; /* See acpi_address_range_id */ |
||
273 | struct { |
||
274 | u32 enabled:1; |
||
275 | u32 hot_pluggable:1; |
||
276 | u32 reserved:30; |
||
277 | } flags; |
||
278 | u64 reserved2; |
||
279 | } __attribute__ ((packed)); |
||
280 | |||
281 | enum acpi_address_range_id { |
||
282 | ACPI_ADDRESS_RANGE_MEMORY = 1, |
||
283 | ACPI_ADDRESS_RANGE_RESERVED = 2, |
||
284 | ACPI_ADDRESS_RANGE_ACPI = 3, |
||
285 | ACPI_ADDRESS_RANGE_NVS = 4, |
||
286 | ACPI_ADDRESS_RANGE_COUNT |
||
287 | }; |
||
288 | |||
289 | /* |
||
290 | * System Locality Information Table (SLIT) |
||
291 | * see http://devresource.hp.com/devresource/docs/techpapers/ia64/slit.pdf |
||
292 | */ |
||
293 | |||
294 | struct acpi_table_slit { |
||
295 | struct acpi_table_header header; |
||
296 | u64 localities; |
||
297 | u8 entry[1]; /* real size = localities^2 */ |
||
298 | } __attribute__ ((packed)); |
||
299 | |||
300 | /* Smart Battery Description Table (SBST) */ |
||
301 | |||
302 | struct acpi_table_sbst { |
||
303 | struct acpi_table_header header; |
||
304 | u32 warning; /* Warn user */ |
||
305 | u32 low; /* Critical sleep */ |
||
306 | u32 critical; /* Critical shutdown */ |
||
307 | } __attribute__ ((packed)); |
||
308 | |||
309 | /* Embedded Controller Boot Resources Table (ECDT) */ |
||
310 | |||
311 | struct acpi_table_ecdt { |
||
312 | struct acpi_table_header header; |
||
313 | struct acpi_generic_address ec_control; |
||
314 | struct acpi_generic_address ec_data; |
||
315 | u32 uid; |
||
316 | u8 gpe_bit; |
||
317 | char ec_id[0]; |
||
318 | } __attribute__ ((packed)); |
||
319 | |||
320 | /* Table Handlers */ |
||
321 | |||
322 | enum acpi_table_id { |
||
323 | ACPI_TABLE_UNKNOWN = 0, |
||
324 | ACPI_APIC, |
||
325 | ACPI_BOOT, |
||
326 | ACPI_DBGP, |
||
327 | ACPI_DSDT, |
||
328 | ACPI_ECDT, |
||
329 | ACPI_ETDT, |
||
330 | ACPI_FADT, |
||
331 | ACPI_FACS, |
||
332 | ACPI_OEMX, |
||
333 | ACPI_PSDT, |
||
334 | ACPI_SBST, |
||
335 | ACPI_SLIT, |
||
336 | ACPI_SPCR, |
||
337 | ACPI_SRAT, |
||
338 | ACPI_SSDT, |
||
339 | ACPI_SPMI, |
||
340 | ACPI_HPET, |
||
341 | ACPI_TABLE_COUNT |
||
342 | }; |
||
343 | |||
344 | typedef int (*acpi_table_handler) (unsigned long phys_addr, unsigned long size); |
||
345 | |||
346 | extern acpi_table_handler acpi_table_ops[ACPI_TABLE_COUNT]; |
||
347 | |||
348 | typedef int (*acpi_madt_entry_handler) (acpi_table_entry_header *header); |
||
349 | |||
350 | char * __acpi_map_table (unsigned long phys_addr, unsigned long size); |
||
351 | unsigned long acpi_find_rsdp (void); |
||
352 | int acpi_boot_init (void); |
||
353 | int acpi_numa_init (void); |
||
354 | |||
355 | int acpi_table_init (void); |
||
356 | int acpi_table_parse (enum acpi_table_id id, acpi_table_handler handler); |
||
357 | int acpi_get_table_header_early (enum acpi_table_id id, struct acpi_table_header **header); |
||
358 | int acpi_table_parse_madt (enum acpi_madt_entry_id id, acpi_madt_entry_handler handler); |
||
359 | int acpi_table_parse_srat (enum acpi_srat_entry_id id, acpi_madt_entry_handler handler); |
||
360 | void acpi_table_print (struct acpi_table_header *header, unsigned long phys_addr); |
||
361 | void acpi_table_print_madt_entry (acpi_table_entry_header *madt); |
||
362 | void acpi_table_print_srat_entry (acpi_table_entry_header *srat); |
||
363 | |||
364 | /* the following four functions are architecture-dependent */ |
||
365 | void acpi_numa_slit_init (struct acpi_table_slit *slit); |
||
366 | void acpi_numa_processor_affinity_init (struct acpi_table_processor_affinity *pa); |
||
367 | void acpi_numa_memory_affinity_init (struct acpi_table_memory_affinity *ma); |
||
368 | void acpi_numa_arch_fixup(void); |
||
369 | |||
370 | extern int acpi_mp_config; |
||
371 | |||
372 | #else /*!CONFIG_ACPI_BOOT*/ |
||
373 | |||
374 | #define acpi_mp_config 0 |
||
375 | |||
376 | static inline int acpi_boot_init(void) |
||
377 | { |
||
378 | return 0; |
||
379 | } |
||
380 | |||
381 | #endif /*!CONFIG_ACPI_BOOT*/ |
||
382 | |||
383 | |||
384 | #ifdef CONFIG_ACPI_PCI |
||
385 | |||
386 | struct acpi_prt_entry { |
||
387 | struct list_head node; |
||
388 | struct acpi_pci_id id; |
||
389 | u8 pin; |
||
390 | struct { |
||
391 | acpi_handle handle; |
||
392 | u32 index; |
||
393 | } link; |
||
394 | u32 irq; |
||
395 | }; |
||
396 | |||
397 | struct acpi_prt_list { |
||
398 | int count; |
||
399 | struct list_head entries; |
||
400 | }; |
||
401 | |||
402 | extern struct acpi_prt_list acpi_prt; |
||
403 | |||
404 | struct pci_dev; |
||
405 | |||
406 | int acpi_pci_irq_enable (struct pci_dev *dev); |
||
407 | int acpi_pci_irq_init (void); |
||
408 | |||
409 | struct acpi_pci_driver { |
||
410 | struct acpi_pci_driver *next; |
||
411 | int (*add)(acpi_handle handle); |
||
412 | void (*remove)(acpi_handle handle); |
||
413 | }; |
||
414 | |||
415 | int acpi_pci_register_driver(struct acpi_pci_driver *driver); |
||
416 | void acpi_pci_unregister_driver(struct acpi_pci_driver *driver); |
||
417 | |||
418 | #endif /*CONFIG_ACPI_PCI*/ |
||
419 | |||
420 | #ifdef CONFIG_ACPI_EC |
||
421 | |||
422 | int ec_read(u8 addr, u8 *val); |
||
423 | int ec_write(u8 addr, u8 val); |
||
424 | |||
425 | #endif /*CONFIG_ACPI_EC*/ |
||
426 | |||
427 | #ifdef CONFIG_ACPI_INTERPRETER |
||
428 | |||
429 | int acpi_blacklisted(void); |
||
430 | |||
431 | #else /*!CONFIG_ACPI_INTERPRETER*/ |
||
432 | |||
433 | static inline int acpi_blacklisted(void) |
||
434 | { |
||
435 | return 0; |
||
436 | } |
||
437 | |||
438 | #endif /*!CONFIG_ACPI_INTERPRETER*/ |
||
439 | |||
440 | #endif /*_LINUX_ACPI_H*/ |