[CPUFREQ] Fix sparse warning in ondemand
[pandora-kernel.git] / arch / i386 / kernel / acpi / boot.c
1 /*
2  *  boot.c - Architecture-Specific Low-Level ACPI Boot Support
3  *
4  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
5  *  Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com>
6  *
7  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  *
23  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24  */
25
26 #include <linux/init.h>
27 #include <linux/acpi.h>
28 #include <linux/efi.h>
29 #include <linux/module.h>
30 #include <linux/dmi.h>
31 #include <linux/irq.h>
32
33 #include <asm/pgtable.h>
34 #include <asm/io_apic.h>
35 #include <asm/apic.h>
36 #include <asm/io.h>
37 #include <asm/mpspec.h>
38
39 #ifdef  CONFIG_X86_64
40
41 extern void __init clustered_apic_check(void);
42
43 extern int gsi_irq_sharing(int gsi);
44 #include <asm/proto.h>
45
46 static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return 0; }
47
48
49 #else                           /* X86 */
50
51 #ifdef  CONFIG_X86_LOCAL_APIC
52 #include <mach_apic.h>
53 #include <mach_mpparse.h>
54 #endif                          /* CONFIG_X86_LOCAL_APIC */
55
56 static inline int gsi_irq_sharing(int gsi) { return gsi; }
57
58 #endif                          /* X86 */
59
60 #define BAD_MADT_ENTRY(entry, end) (                                        \
61                 (!entry) || (unsigned long)entry + sizeof(*entry) > end ||  \
62                 ((acpi_table_entry_header *)entry)->length != sizeof(*entry))
63
64 #define PREFIX                  "ACPI: "
65
66 int acpi_noirq __initdata;      /* skip ACPI IRQ initialization */
67 int acpi_pci_disabled __initdata;       /* skip ACPI PCI scan and IRQ initialization */
68 int acpi_ht __initdata = 1;     /* enable HT */
69
70 int acpi_lapic;
71 int acpi_ioapic;
72 int acpi_strict;
73 EXPORT_SYMBOL(acpi_strict);
74
75 acpi_interrupt_flags acpi_sci_flags __initdata;
76 int acpi_sci_override_gsi __initdata;
77 int acpi_skip_timer_override __initdata;
78
79 #ifdef CONFIG_X86_LOCAL_APIC
80 static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
81 #endif
82
83 #ifndef __HAVE_ARCH_CMPXCHG
84 #warning ACPI uses CMPXCHG, i486 and later hardware
85 #endif
86
87 #define MAX_MADT_ENTRIES        256
88 u8 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] =
89     {[0 ... MAX_MADT_ENTRIES - 1] = 0xff };
90 EXPORT_SYMBOL(x86_acpiid_to_apicid);
91
92 /* --------------------------------------------------------------------------
93                               Boot-time Configuration
94    -------------------------------------------------------------------------- */
95
96 /*
97  * The default interrupt routing model is PIC (8259).  This gets
98  * overriden if IOAPICs are enumerated (below).
99  */
100 enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC;
101
102 #ifdef  CONFIG_X86_64
103
104 /* rely on all ACPI tables being in the direct mapping */
105 char *__acpi_map_table(unsigned long phys_addr, unsigned long size)
106 {
107         if (!phys_addr || !size)
108                 return NULL;
109
110         if (phys_addr+size <= (end_pfn_map << PAGE_SHIFT) + PAGE_SIZE)
111                 return __va(phys_addr);
112
113         return NULL;
114 }
115
116 #else
117
118 /*
119  * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END,
120  * to map the target physical address. The problem is that set_fixmap()
121  * provides a single page, and it is possible that the page is not
122  * sufficient.
123  * By using this area, we can map up to MAX_IO_APICS pages temporarily,
124  * i.e. until the next __va_range() call.
125  *
126  * Important Safety Note:  The fixed I/O APIC page numbers are *subtracted*
127  * from the fixed base.  That's why we start at FIX_IO_APIC_BASE_END and
128  * count idx down while incrementing the phys address.
129  */
130 char *__acpi_map_table(unsigned long phys, unsigned long size)
131 {
132         unsigned long base, offset, mapped_size;
133         int idx;
134
135         if (phys + size < 8 * 1024 * 1024)
136                 return __va(phys);
137
138         offset = phys & (PAGE_SIZE - 1);
139         mapped_size = PAGE_SIZE - offset;
140         set_fixmap(FIX_ACPI_END, phys);
141         base = fix_to_virt(FIX_ACPI_END);
142
143         /*
144          * Most cases can be covered by the below.
145          */
146         idx = FIX_ACPI_END;
147         while (mapped_size < size) {
148                 if (--idx < FIX_ACPI_BEGIN)
149                         return NULL;    /* cannot handle this */
150                 phys += PAGE_SIZE;
151                 set_fixmap(idx, phys);
152                 mapped_size += PAGE_SIZE;
153         }
154
155         return ((unsigned char *)base + offset);
156 }
157 #endif
158
159 #ifdef CONFIG_PCI_MMCONFIG
160 /* The physical address of the MMCONFIG aperture.  Set from ACPI tables. */
161 struct acpi_table_mcfg_config *pci_mmcfg_config;
162 int pci_mmcfg_config_num;
163
164 int __init acpi_parse_mcfg(unsigned long phys_addr, unsigned long size)
165 {
166         struct acpi_table_mcfg *mcfg;
167         unsigned long i;
168         int config_size;
169
170         if (!phys_addr || !size)
171                 return -EINVAL;
172
173         mcfg = (struct acpi_table_mcfg *)__acpi_map_table(phys_addr, size);
174         if (!mcfg) {
175                 printk(KERN_WARNING PREFIX "Unable to map MCFG\n");
176                 return -ENODEV;
177         }
178
179         /* how many config structures do we have */
180         pci_mmcfg_config_num = 0;
181         i = size - sizeof(struct acpi_table_mcfg);
182         while (i >= sizeof(struct acpi_table_mcfg_config)) {
183                 ++pci_mmcfg_config_num;
184                 i -= sizeof(struct acpi_table_mcfg_config);
185         };
186         if (pci_mmcfg_config_num == 0) {
187                 printk(KERN_ERR PREFIX "MMCONFIG has no entries\n");
188                 return -ENODEV;
189         }
190
191         config_size = pci_mmcfg_config_num * sizeof(*pci_mmcfg_config);
192         pci_mmcfg_config = kmalloc(config_size, GFP_KERNEL);
193         if (!pci_mmcfg_config) {
194                 printk(KERN_WARNING PREFIX
195                        "No memory for MCFG config tables\n");
196                 return -ENOMEM;
197         }
198
199         memcpy(pci_mmcfg_config, &mcfg->config, config_size);
200         for (i = 0; i < pci_mmcfg_config_num; ++i) {
201                 if (mcfg->config[i].base_reserved) {
202                         printk(KERN_ERR PREFIX
203                                "MMCONFIG not in low 4GB of memory\n");
204                         kfree(pci_mmcfg_config);
205                         pci_mmcfg_config_num = 0;
206                         return -ENODEV;
207                 }
208         }
209
210         return 0;
211 }
212 #endif                          /* CONFIG_PCI_MMCONFIG */
213
214 #ifdef CONFIG_X86_LOCAL_APIC
215 static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
216 {
217         struct acpi_table_madt *madt = NULL;
218
219         if (!phys_addr || !size || !cpu_has_apic)
220                 return -EINVAL;
221
222         madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size);
223         if (!madt) {
224                 printk(KERN_WARNING PREFIX "Unable to map MADT\n");
225                 return -ENODEV;
226         }
227
228         if (madt->lapic_address) {
229                 acpi_lapic_addr = (u64) madt->lapic_address;
230
231                 printk(KERN_DEBUG PREFIX "Local APIC address 0x%08x\n",
232                        madt->lapic_address);
233         }
234
235         acpi_madt_oem_check(madt->header.oem_id, madt->header.oem_table_id);
236
237         return 0;
238 }
239
240 static int __init
241 acpi_parse_lapic(acpi_table_entry_header * header, const unsigned long end)
242 {
243         struct acpi_table_lapic *processor = NULL;
244
245         processor = (struct acpi_table_lapic *)header;
246
247         if (BAD_MADT_ENTRY(processor, end))
248                 return -EINVAL;
249
250         acpi_table_print_madt_entry(header);
251
252         /* Record local apic id only when enabled */
253         if (processor->flags.enabled)
254                 x86_acpiid_to_apicid[processor->acpi_id] = processor->id;
255
256         /*
257          * We need to register disabled CPU as well to permit
258          * counting disabled CPUs. This allows us to size
259          * cpus_possible_map more accurately, to permit
260          * to not preallocating memory for all NR_CPUS
261          * when we use CPU hotplug.
262          */
263         mp_register_lapic(processor->id,        /* APIC ID */
264                           processor->flags.enabled);    /* Enabled? */
265
266         return 0;
267 }
268
269 static int __init
270 acpi_parse_lapic_addr_ovr(acpi_table_entry_header * header,
271                           const unsigned long end)
272 {
273         struct acpi_table_lapic_addr_ovr *lapic_addr_ovr = NULL;
274
275         lapic_addr_ovr = (struct acpi_table_lapic_addr_ovr *)header;
276
277         if (BAD_MADT_ENTRY(lapic_addr_ovr, end))
278                 return -EINVAL;
279
280         acpi_lapic_addr = lapic_addr_ovr->address;
281
282         return 0;
283 }
284
285 static int __init
286 acpi_parse_lapic_nmi(acpi_table_entry_header * header, const unsigned long end)
287 {
288         struct acpi_table_lapic_nmi *lapic_nmi = NULL;
289
290         lapic_nmi = (struct acpi_table_lapic_nmi *)header;
291
292         if (BAD_MADT_ENTRY(lapic_nmi, end))
293                 return -EINVAL;
294
295         acpi_table_print_madt_entry(header);
296
297         if (lapic_nmi->lint != 1)
298                 printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
299
300         return 0;
301 }
302
303 #endif                          /*CONFIG_X86_LOCAL_APIC */
304
305 #ifdef CONFIG_X86_IO_APIC
306
307 static int __init
308 acpi_parse_ioapic(acpi_table_entry_header * header, const unsigned long end)
309 {
310         struct acpi_table_ioapic *ioapic = NULL;
311
312         ioapic = (struct acpi_table_ioapic *)header;
313
314         if (BAD_MADT_ENTRY(ioapic, end))
315                 return -EINVAL;
316
317         acpi_table_print_madt_entry(header);
318
319         mp_register_ioapic(ioapic->id,
320                            ioapic->address, ioapic->global_irq_base);
321
322         return 0;
323 }
324
325 /*
326  * Parse Interrupt Source Override for the ACPI SCI
327  */
328 static void acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger)
329 {
330         if (trigger == 0)       /* compatible SCI trigger is level */
331                 trigger = 3;
332
333         if (polarity == 0)      /* compatible SCI polarity is low */
334                 polarity = 3;
335
336         /* Command-line over-ride via acpi_sci= */
337         if (acpi_sci_flags.trigger)
338                 trigger = acpi_sci_flags.trigger;
339
340         if (acpi_sci_flags.polarity)
341                 polarity = acpi_sci_flags.polarity;
342
343         /*
344          * mp_config_acpi_legacy_irqs() already setup IRQs < 16
345          * If GSI is < 16, this will update its flags,
346          * else it will create a new mp_irqs[] entry.
347          */
348         mp_override_legacy_irq(gsi, polarity, trigger, gsi);
349
350         /*
351          * stash over-ride to indicate we've been here
352          * and for later update of acpi_fadt
353          */
354         acpi_sci_override_gsi = gsi;
355         return;
356 }
357
358 static int __init
359 acpi_parse_int_src_ovr(acpi_table_entry_header * header,
360                        const unsigned long end)
361 {
362         struct acpi_table_int_src_ovr *intsrc = NULL;
363
364         intsrc = (struct acpi_table_int_src_ovr *)header;
365
366         if (BAD_MADT_ENTRY(intsrc, end))
367                 return -EINVAL;
368
369         acpi_table_print_madt_entry(header);
370
371         if (intsrc->bus_irq == acpi_fadt.sci_int) {
372                 acpi_sci_ioapic_setup(intsrc->global_irq,
373                                       intsrc->flags.polarity,
374                                       intsrc->flags.trigger);
375                 return 0;
376         }
377
378         if (acpi_skip_timer_override &&
379             intsrc->bus_irq == 0 && intsrc->global_irq == 2) {
380                 printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
381                 return 0;
382         }
383
384         mp_override_legacy_irq(intsrc->bus_irq,
385                                intsrc->flags.polarity,
386                                intsrc->flags.trigger, intsrc->global_irq);
387
388         return 0;
389 }
390
391 static int __init
392 acpi_parse_nmi_src(acpi_table_entry_header * header, const unsigned long end)
393 {
394         struct acpi_table_nmi_src *nmi_src = NULL;
395
396         nmi_src = (struct acpi_table_nmi_src *)header;
397
398         if (BAD_MADT_ENTRY(nmi_src, end))
399                 return -EINVAL;
400
401         acpi_table_print_madt_entry(header);
402
403         /* TBD: Support nimsrc entries? */
404
405         return 0;
406 }
407
408 #endif                          /* CONFIG_X86_IO_APIC */
409
410 /*
411  * acpi_pic_sci_set_trigger()
412  * 
413  * use ELCR to set PIC-mode trigger type for SCI
414  *
415  * If a PIC-mode SCI is not recognized or gives spurious IRQ7's
416  * it may require Edge Trigger -- use "acpi_sci=edge"
417  *
418  * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers
419  * for the 8259 PIC.  bit[n] = 1 means irq[n] is Level, otherwise Edge.
420  * ECLR1 is IRQ's 0-7 (IRQ 0, 1, 2 must be 0)
421  * ECLR2 is IRQ's 8-15 (IRQ 8, 13 must be 0)
422  */
423
424 void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
425 {
426         unsigned int mask = 1 << irq;
427         unsigned int old, new;
428
429         /* Real old ELCR mask */
430         old = inb(0x4d0) | (inb(0x4d1) << 8);
431
432         /*
433          * If we use ACPI to set PCI irq's, then we should clear ELCR
434          * since we will set it correctly as we enable the PCI irq
435          * routing.
436          */
437         new = acpi_noirq ? old : 0;
438
439         /*
440          * Update SCI information in the ELCR, it isn't in the PCI
441          * routing tables..
442          */
443         switch (trigger) {
444         case 1:         /* Edge - clear */
445                 new &= ~mask;
446                 break;
447         case 3:         /* Level - set */
448                 new |= mask;
449                 break;
450         }
451
452         if (old == new)
453                 return;
454
455         printk(PREFIX "setting ELCR to %04x (from %04x)\n", new, old);
456         outb(new, 0x4d0);
457         outb(new >> 8, 0x4d1);
458 }
459
460 int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
461 {
462 #ifdef CONFIG_X86_IO_APIC
463         if (use_pci_vector() && !platform_legacy_irq(gsi))
464                 *irq = IO_APIC_VECTOR(gsi);
465         else
466 #endif
467                 *irq = gsi_irq_sharing(gsi);
468         return 0;
469 }
470
471 /*
472  * success: return IRQ number (>=0)
473  * failure: return < 0
474  */
475 int acpi_register_gsi(u32 gsi, int triggering, int polarity)
476 {
477         unsigned int irq;
478         unsigned int plat_gsi = gsi;
479
480 #ifdef CONFIG_PCI
481         /*
482          * Make sure all (legacy) PCI IRQs are set as level-triggered.
483          */
484         if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) {
485                 extern void eisa_set_level_irq(unsigned int irq);
486
487                 if (triggering == ACPI_LEVEL_SENSITIVE)
488                         eisa_set_level_irq(gsi);
489         }
490 #endif
491
492 #ifdef CONFIG_X86_IO_APIC
493         if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) {
494                 plat_gsi = mp_register_gsi(gsi, triggering, polarity);
495         }
496 #endif
497         acpi_gsi_to_irq(plat_gsi, &irq);
498         return irq;
499 }
500
501 EXPORT_SYMBOL(acpi_register_gsi);
502
503 /*
504  *  ACPI based hotplug support for CPU
505  */
506 #ifdef CONFIG_ACPI_HOTPLUG_CPU
507 int acpi_map_lsapic(acpi_handle handle, int *pcpu)
508 {
509         /* TBD */
510         return -EINVAL;
511 }
512
513 EXPORT_SYMBOL(acpi_map_lsapic);
514
515 int acpi_unmap_lsapic(int cpu)
516 {
517         /* TBD */
518         return -EINVAL;
519 }
520
521 EXPORT_SYMBOL(acpi_unmap_lsapic);
522 #endif                          /* CONFIG_ACPI_HOTPLUG_CPU */
523
524 int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
525 {
526         /* TBD */
527         return -EINVAL;
528 }
529
530 EXPORT_SYMBOL(acpi_register_ioapic);
531
532 int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base)
533 {
534         /* TBD */
535         return -EINVAL;
536 }
537
538 EXPORT_SYMBOL(acpi_unregister_ioapic);
539
540 static unsigned long __init
541 acpi_scan_rsdp(unsigned long start, unsigned long length)
542 {
543         unsigned long offset = 0;
544         unsigned long sig_len = sizeof("RSD PTR ") - 1;
545
546         /*
547          * Scan all 16-byte boundaries of the physical memory region for the
548          * RSDP signature.
549          */
550         for (offset = 0; offset < length; offset += 16) {
551                 if (strncmp((char *)(phys_to_virt(start) + offset), "RSD PTR ", sig_len))
552                         continue;
553                 return (start + offset);
554         }
555
556         return 0;
557 }
558
559 static int __init acpi_parse_sbf(unsigned long phys_addr, unsigned long size)
560 {
561         struct acpi_table_sbf *sb;
562
563         if (!phys_addr || !size)
564                 return -EINVAL;
565
566         sb = (struct acpi_table_sbf *)__acpi_map_table(phys_addr, size);
567         if (!sb) {
568                 printk(KERN_WARNING PREFIX "Unable to map SBF\n");
569                 return -ENODEV;
570         }
571
572         sbf_port = sb->sbf_cmos;        /* Save CMOS port */
573
574         return 0;
575 }
576
577 #ifdef CONFIG_HPET_TIMER
578
579 static int __init acpi_parse_hpet(unsigned long phys, unsigned long size)
580 {
581         struct acpi_table_hpet *hpet_tbl;
582
583         if (!phys || !size)
584                 return -EINVAL;
585
586         hpet_tbl = (struct acpi_table_hpet *)__acpi_map_table(phys, size);
587         if (!hpet_tbl) {
588                 printk(KERN_WARNING PREFIX "Unable to map HPET\n");
589                 return -ENODEV;
590         }
591
592         if (hpet_tbl->addr.space_id != ACPI_SPACE_MEM) {
593                 printk(KERN_WARNING PREFIX "HPET timers must be located in "
594                        "memory.\n");
595                 return -1;
596         }
597 #ifdef  CONFIG_X86_64
598         vxtime.hpet_address = hpet_tbl->addr.addrl |
599             ((long)hpet_tbl->addr.addrh << 32);
600
601         printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
602                hpet_tbl->id, vxtime.hpet_address);
603 #else                           /* X86 */
604         {
605                 extern unsigned long hpet_address;
606
607                 hpet_address = hpet_tbl->addr.addrl;
608                 printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
609                        hpet_tbl->id, hpet_address);
610         }
611 #endif                          /* X86 */
612
613         return 0;
614 }
615 #else
616 #define acpi_parse_hpet NULL
617 #endif
618
619 #ifdef CONFIG_X86_PM_TIMER
620 extern u32 pmtmr_ioport;
621 #endif
622
623 static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
624 {
625         struct fadt_descriptor *fadt = NULL;
626
627         fadt = (struct fadt_descriptor *)__acpi_map_table(phys, size);
628         if (!fadt) {
629                 printk(KERN_WARNING PREFIX "Unable to map FADT\n");
630                 return 0;
631         }
632         /* initialize sci_int early for INT_SRC_OVR MADT parsing */
633         acpi_fadt.sci_int = fadt->sci_int;
634
635         /* initialize rev and apic_phys_dest_mode for x86_64 genapic */
636         acpi_fadt.revision = fadt->revision;
637         acpi_fadt.force_apic_physical_destination_mode =
638             fadt->force_apic_physical_destination_mode;
639
640 #ifdef CONFIG_X86_PM_TIMER
641         /* detect the location of the ACPI PM Timer */
642         if (fadt->revision >= FADT2_REVISION_ID) {
643                 /* FADT rev. 2 */
644                 if (fadt->xpm_tmr_blk.address_space_id !=
645                     ACPI_ADR_SPACE_SYSTEM_IO)
646                         return 0;
647
648                 pmtmr_ioport = fadt->xpm_tmr_blk.address;
649                 /*
650                  * "X" fields are optional extensions to the original V1.0
651                  * fields, so we must selectively expand V1.0 fields if the
652                  * corresponding X field is zero.
653                  */
654                 if (!pmtmr_ioport)
655                         pmtmr_ioport = fadt->V1_pm_tmr_blk;
656         } else {
657                 /* FADT rev. 1 */
658                 pmtmr_ioport = fadt->V1_pm_tmr_blk;
659         }
660         if (pmtmr_ioport)
661                 printk(KERN_INFO PREFIX "PM-Timer IO Port: %#x\n",
662                        pmtmr_ioport);
663 #endif
664         return 0;
665 }
666
667 unsigned long __init acpi_find_rsdp(void)
668 {
669         unsigned long rsdp_phys = 0;
670
671         if (efi_enabled) {
672                 if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
673                         return efi.acpi20;
674                 else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
675                         return efi.acpi;
676         }
677         /*
678          * Scan memory looking for the RSDP signature. First search EBDA (low
679          * memory) paragraphs and then search upper memory (E0000-FFFFF).
680          */
681         rsdp_phys = acpi_scan_rsdp(0, 0x400);
682         if (!rsdp_phys)
683                 rsdp_phys = acpi_scan_rsdp(0xE0000, 0x20000);
684
685         return rsdp_phys;
686 }
687
688 #ifdef  CONFIG_X86_LOCAL_APIC
689 /*
690  * Parse LAPIC entries in MADT
691  * returns 0 on success, < 0 on error
692  */
693 static int __init acpi_parse_madt_lapic_entries(void)
694 {
695         int count;
696
697         if (!cpu_has_apic)
698                 return -ENODEV;
699
700         /* 
701          * Note that the LAPIC address is obtained from the MADT (32-bit value)
702          * and (optionally) overriden by a LAPIC_ADDR_OVR entry (64-bit value).
703          */
704
705         count =
706             acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR,
707                                   acpi_parse_lapic_addr_ovr, 0);
708         if (count < 0) {
709                 printk(KERN_ERR PREFIX
710                        "Error parsing LAPIC address override entry\n");
711                 return count;
712         }
713
714         mp_register_lapic_address(acpi_lapic_addr);
715
716         count = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic,
717                                       MAX_APICS);
718         if (!count) {
719                 printk(KERN_ERR PREFIX "No LAPIC entries present\n");
720                 /* TBD: Cleanup to allow fallback to MPS */
721                 return -ENODEV;
722         } else if (count < 0) {
723                 printk(KERN_ERR PREFIX "Error parsing LAPIC entry\n");
724                 /* TBD: Cleanup to allow fallback to MPS */
725                 return count;
726         }
727
728         count =
729             acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0);
730         if (count < 0) {
731                 printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
732                 /* TBD: Cleanup to allow fallback to MPS */
733                 return count;
734         }
735         return 0;
736 }
737 #endif                          /* CONFIG_X86_LOCAL_APIC */
738
739 #ifdef  CONFIG_X86_IO_APIC
740 /*
741  * Parse IOAPIC related entries in MADT
742  * returns 0 on success, < 0 on error
743  */
744 static int __init acpi_parse_madt_ioapic_entries(void)
745 {
746         int count;
747
748         /*
749          * ACPI interpreter is required to complete interrupt setup,
750          * so if it is off, don't enumerate the io-apics with ACPI.
751          * If MPS is present, it will handle them,
752          * otherwise the system will stay in PIC mode
753          */
754         if (acpi_disabled || acpi_noirq) {
755                 return -ENODEV;
756         }
757
758         if (!cpu_has_apic) 
759                 return -ENODEV;
760
761         /*
762          * if "noapic" boot option, don't look for IO-APICs
763          */
764         if (skip_ioapic_setup) {
765                 printk(KERN_INFO PREFIX "Skipping IOAPIC probe "
766                        "due to 'noapic' option.\n");
767                 return -ENODEV;
768         }
769
770         count =
771             acpi_table_parse_madt(ACPI_MADT_IOAPIC, acpi_parse_ioapic,
772                                   MAX_IO_APICS);
773         if (!count) {
774                 printk(KERN_ERR PREFIX "No IOAPIC entries present\n");
775                 return -ENODEV;
776         } else if (count < 0) {
777                 printk(KERN_ERR PREFIX "Error parsing IOAPIC entry\n");
778                 return count;
779         }
780
781         count =
782             acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr,
783                                   NR_IRQ_VECTORS);
784         if (count < 0) {
785                 printk(KERN_ERR PREFIX
786                        "Error parsing interrupt source overrides entry\n");
787                 /* TBD: Cleanup to allow fallback to MPS */
788                 return count;
789         }
790
791         /*
792          * If BIOS did not supply an INT_SRC_OVR for the SCI
793          * pretend we got one so we can set the SCI flags.
794          */
795         if (!acpi_sci_override_gsi)
796                 acpi_sci_ioapic_setup(acpi_fadt.sci_int, 0, 0);
797
798         /* Fill in identity legacy mapings where no override */
799         mp_config_acpi_legacy_irqs();
800
801         count =
802             acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src,
803                                   NR_IRQ_VECTORS);
804         if (count < 0) {
805                 printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n");
806                 /* TBD: Cleanup to allow fallback to MPS */
807                 return count;
808         }
809
810         return 0;
811 }
812 #else
813 static inline int acpi_parse_madt_ioapic_entries(void)
814 {
815         return -1;
816 }
817 #endif  /* !CONFIG_X86_IO_APIC */
818
819 static void __init acpi_process_madt(void)
820 {
821 #ifdef CONFIG_X86_LOCAL_APIC
822         int count, error;
823
824         count = acpi_table_parse(ACPI_APIC, acpi_parse_madt);
825         if (count >= 1) {
826
827                 /*
828                  * Parse MADT LAPIC entries
829                  */
830                 error = acpi_parse_madt_lapic_entries();
831                 if (!error) {
832                         acpi_lapic = 1;
833
834 #ifdef CONFIG_X86_GENERICARCH
835                         generic_bigsmp_probe();
836 #endif
837                         /*
838                          * Parse MADT IO-APIC entries
839                          */
840                         error = acpi_parse_madt_ioapic_entries();
841                         if (!error) {
842                                 acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
843                                 acpi_irq_balance_set(NULL);
844                                 acpi_ioapic = 1;
845
846                                 smp_found_config = 1;
847                                 clustered_apic_check();
848                         }
849                 }
850                 if (error == -EINVAL) {
851                         /*
852                          * Dell Precision Workstation 410, 610 come here.
853                          */
854                         printk(KERN_ERR PREFIX
855                                "Invalid BIOS MADT, disabling ACPI\n");
856                         disable_acpi();
857                 }
858         }
859 #endif
860         return;
861 }
862
863 extern int acpi_force;
864
865 #ifdef __i386__
866
867 static int __init disable_acpi_irq(struct dmi_system_id *d)
868 {
869         if (!acpi_force) {
870                 printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n",
871                        d->ident);
872                 acpi_noirq_set();
873         }
874         return 0;
875 }
876
877 static int __init disable_acpi_pci(struct dmi_system_id *d)
878 {
879         if (!acpi_force) {
880                 printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n",
881                        d->ident);
882                 acpi_disable_pci();
883         }
884         return 0;
885 }
886
887 static int __init dmi_disable_acpi(struct dmi_system_id *d)
888 {
889         if (!acpi_force) {
890                 printk(KERN_NOTICE "%s detected: acpi off\n", d->ident);
891                 disable_acpi();
892         } else {
893                 printk(KERN_NOTICE
894                        "Warning: DMI blacklist says broken, but acpi forced\n");
895         }
896         return 0;
897 }
898
899 /*
900  * Limit ACPI to CPU enumeration for HT
901  */
902 static int __init force_acpi_ht(struct dmi_system_id *d)
903 {
904         if (!acpi_force) {
905                 printk(KERN_NOTICE "%s detected: force use of acpi=ht\n",
906                        d->ident);
907                 disable_acpi();
908                 acpi_ht = 1;
909         } else {
910                 printk(KERN_NOTICE
911                        "Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
912         }
913         return 0;
914 }
915
916 /*
917  * If your system is blacklisted here, but you find that acpi=force
918  * works for you, please contact acpi-devel@sourceforge.net
919  */
920 static struct dmi_system_id __initdata acpi_dmi_table[] = {
921         /*
922          * Boxes that need ACPI disabled
923          */
924         {
925          .callback = dmi_disable_acpi,
926          .ident = "IBM Thinkpad",
927          .matches = {
928                      DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
929                      DMI_MATCH(DMI_BOARD_NAME, "2629H1G"),
930                      },
931          },
932
933         /*
934          * Boxes that need acpi=ht
935          */
936         {
937          .callback = force_acpi_ht,
938          .ident = "FSC Primergy T850",
939          .matches = {
940                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
941                      DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
942                      },
943          },
944         {
945          .callback = force_acpi_ht,
946          .ident = "DELL GX240",
947          .matches = {
948                      DMI_MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"),
949                      DMI_MATCH(DMI_BOARD_NAME, "OptiPlex GX240"),
950                      },
951          },
952         {
953          .callback = force_acpi_ht,
954          .ident = "HP VISUALIZE NT Workstation",
955          .matches = {
956                      DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
957                      DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
958                      },
959          },
960         {
961          .callback = force_acpi_ht,
962          .ident = "Compaq Workstation W8000",
963          .matches = {
964                      DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
965                      DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
966                      },
967          },
968         {
969          .callback = force_acpi_ht,
970          .ident = "ASUS P4B266",
971          .matches = {
972                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
973                      DMI_MATCH(DMI_BOARD_NAME, "P4B266"),
974                      },
975          },
976         {
977          .callback = force_acpi_ht,
978          .ident = "ASUS P2B-DS",
979          .matches = {
980                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
981                      DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"),
982                      },
983          },
984         {
985          .callback = force_acpi_ht,
986          .ident = "ASUS CUR-DLS",
987          .matches = {
988                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
989                      DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"),
990                      },
991          },
992         {
993          .callback = force_acpi_ht,
994          .ident = "ABIT i440BX-W83977",
995          .matches = {
996                      DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
997                      DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
998                      },
999          },
1000         {
1001          .callback = force_acpi_ht,
1002          .ident = "IBM Bladecenter",
1003          .matches = {
1004                      DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
1005                      DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
1006                      },
1007          },
1008         {
1009          .callback = force_acpi_ht,
1010          .ident = "IBM eServer xSeries 360",
1011          .matches = {
1012                      DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
1013                      DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
1014                      },
1015          },
1016         {
1017          .callback = force_acpi_ht,
1018          .ident = "IBM eserver xSeries 330",
1019          .matches = {
1020                      DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
1021                      DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
1022                      },
1023          },
1024         {
1025          .callback = force_acpi_ht,
1026          .ident = "IBM eserver xSeries 440",
1027          .matches = {
1028                      DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
1029                      DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
1030                      },
1031          },
1032
1033         /*
1034          * Boxes that need ACPI PCI IRQ routing disabled
1035          */
1036         {
1037          .callback = disable_acpi_irq,
1038          .ident = "ASUS A7V",
1039          .matches = {
1040                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
1041                      DMI_MATCH(DMI_BOARD_NAME, "<A7V>"),
1042                      /* newer BIOS, Revision 1011, does work */
1043                      DMI_MATCH(DMI_BIOS_VERSION,
1044                                "ASUS A7V ACPI BIOS Revision 1007"),
1045                      },
1046          },
1047
1048         /*
1049          * Boxes that need ACPI PCI IRQ routing and PCI scan disabled
1050          */
1051         {                       /* _BBN 0 bug */
1052          .callback = disable_acpi_pci,
1053          .ident = "ASUS PR-DLS",
1054          .matches = {
1055                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1056                      DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"),
1057                      DMI_MATCH(DMI_BIOS_VERSION,
1058                                "ASUS PR-DLS ACPI BIOS Revision 1010"),
1059                      DMI_MATCH(DMI_BIOS_DATE, "03/21/2003")
1060                      },
1061          },
1062         {
1063          .callback = disable_acpi_pci,
1064          .ident = "Acer TravelMate 36x Laptop",
1065          .matches = {
1066                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1067                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
1068                      },
1069          },
1070         {}
1071 };
1072
1073 #endif                          /* __i386__ */
1074
1075 /*
1076  * acpi_boot_table_init() and acpi_boot_init()
1077  *  called from setup_arch(), always.
1078  *      1. checksums all tables
1079  *      2. enumerates lapics
1080  *      3. enumerates io-apics
1081  *
1082  * acpi_table_init() is separate to allow reading SRAT without
1083  * other side effects.
1084  *
1085  * side effects of acpi_boot_init:
1086  *      acpi_lapic = 1 if LAPIC found
1087  *      acpi_ioapic = 1 if IOAPIC found
1088  *      if (acpi_lapic && acpi_ioapic) smp_found_config = 1;
1089  *      if acpi_blacklisted() acpi_disabled = 1;
1090  *      acpi_irq_model=...
1091  *      ...
1092  *
1093  * return value: (currently ignored)
1094  *      0: success
1095  *      !0: failure
1096  */
1097
1098 int __init acpi_boot_table_init(void)
1099 {
1100         int error;
1101
1102 #ifdef __i386__
1103         dmi_check_system(acpi_dmi_table);
1104 #endif
1105
1106         /*
1107          * If acpi_disabled, bail out
1108          * One exception: acpi=ht continues far enough to enumerate LAPICs
1109          */
1110         if (acpi_disabled && !acpi_ht)
1111                 return 1;
1112
1113         /* 
1114          * Initialize the ACPI boot-time table parser.
1115          */
1116         error = acpi_table_init();
1117         if (error) {
1118                 disable_acpi();
1119                 return error;
1120         }
1121
1122         acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
1123
1124         /*
1125          * blacklist may disable ACPI entirely
1126          */
1127         error = acpi_blacklisted();
1128         if (error) {
1129                 if (acpi_force) {
1130                         printk(KERN_WARNING PREFIX "acpi=force override\n");
1131                 } else {
1132                         printk(KERN_WARNING PREFIX "Disabling ACPI support\n");
1133                         disable_acpi();
1134                         return error;
1135                 }
1136         }
1137
1138         return 0;
1139 }
1140
1141 int __init acpi_boot_init(void)
1142 {
1143         /*
1144          * If acpi_disabled, bail out
1145          * One exception: acpi=ht continues far enough to enumerate LAPICs
1146          */
1147         if (acpi_disabled && !acpi_ht)
1148                 return 1;
1149
1150         acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
1151
1152         /*
1153          * set sci_int and PM timer address
1154          */
1155         acpi_table_parse(ACPI_FADT, acpi_parse_fadt);
1156
1157         /*
1158          * Process the Multiple APIC Description Table (MADT), if present
1159          */
1160         acpi_process_madt();
1161
1162         acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
1163
1164         return 0;
1165 }