aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/acpi/boot.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/acpi/boot.c')
-rw-r--r--arch/x86/kernel/acpi/boot.c491
1 files changed, 457 insertions, 34 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 33c5216fd3e1..eb875cdc7367 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -37,6 +37,7 @@
37#include <asm/pgtable.h> 37#include <asm/pgtable.h>
38#include <asm/io_apic.h> 38#include <asm/io_apic.h>
39#include <asm/apic.h> 39#include <asm/apic.h>
40#include <asm/genapic.h>
40#include <asm/io.h> 41#include <asm/io.h>
41#include <asm/mpspec.h> 42#include <asm/mpspec.h>
42#include <asm/smp.h> 43#include <asm/smp.h>
@@ -57,7 +58,6 @@ EXPORT_SYMBOL(acpi_disabled);
57#ifdef CONFIG_X86_64 58#ifdef CONFIG_X86_64
58 59
59#include <asm/proto.h> 60#include <asm/proto.h>
60#include <asm/genapic.h>
61 61
62#else /* X86 */ 62#else /* X86 */
63 63
@@ -106,21 +106,6 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
106 */ 106 */
107enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC; 107enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC;
108 108
109#ifdef CONFIG_X86_64
110
111/* rely on all ACPI tables being in the direct mapping */
112char *__init __acpi_map_table(unsigned long phys_addr, unsigned long size)
113{
114 if (!phys_addr || !size)
115 return NULL;
116
117 if (phys_addr+size <= (max_pfn_mapped << PAGE_SHIFT) + PAGE_SIZE)
118 return __va(phys_addr);
119
120 return NULL;
121}
122
123#else
124 109
125/* 110/*
126 * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END, 111 * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END,
@@ -139,11 +124,15 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
139 unsigned long base, offset, mapped_size; 124 unsigned long base, offset, mapped_size;
140 int idx; 125 int idx;
141 126
142 if (phys + size < 8 * 1024 * 1024) 127 if (!phys || !size)
128 return NULL;
129
130 if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT))
143 return __va(phys); 131 return __va(phys);
144 132
145 offset = phys & (PAGE_SIZE - 1); 133 offset = phys & (PAGE_SIZE - 1);
146 mapped_size = PAGE_SIZE - offset; 134 mapped_size = PAGE_SIZE - offset;
135 clear_fixmap(FIX_ACPI_END);
147 set_fixmap(FIX_ACPI_END, phys); 136 set_fixmap(FIX_ACPI_END, phys);
148 base = fix_to_virt(FIX_ACPI_END); 137 base = fix_to_virt(FIX_ACPI_END);
149 138
@@ -155,19 +144,29 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
155 if (--idx < FIX_ACPI_BEGIN) 144 if (--idx < FIX_ACPI_BEGIN)
156 return NULL; /* cannot handle this */ 145 return NULL; /* cannot handle this */
157 phys += PAGE_SIZE; 146 phys += PAGE_SIZE;
147 clear_fixmap(idx);
158 set_fixmap(idx, phys); 148 set_fixmap(idx, phys);
159 mapped_size += PAGE_SIZE; 149 mapped_size += PAGE_SIZE;
160 } 150 }
161 151
162 return ((unsigned char *)base + offset); 152 return ((unsigned char *)base + offset);
163} 153}
164#endif
165 154
166#ifdef CONFIG_PCI_MMCONFIG 155#ifdef CONFIG_PCI_MMCONFIG
167/* The physical address of the MMCONFIG aperture. Set from ACPI tables. */ 156/* The physical address of the MMCONFIG aperture. Set from ACPI tables. */
168struct acpi_mcfg_allocation *pci_mmcfg_config; 157struct acpi_mcfg_allocation *pci_mmcfg_config;
169int pci_mmcfg_config_num; 158int pci_mmcfg_config_num;
170 159
160static int acpi_mcfg_64bit_base_addr __initdata = FALSE;
161
162static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg)
163{
164 if (!strcmp(mcfg->header.oem_id, "SGI"))
165 acpi_mcfg_64bit_base_addr = TRUE;
166
167 return 0;
168}
169
171int __init acpi_parse_mcfg(struct acpi_table_header *header) 170int __init acpi_parse_mcfg(struct acpi_table_header *header)
172{ 171{
173 struct acpi_table_mcfg *mcfg; 172 struct acpi_table_mcfg *mcfg;
@@ -200,8 +199,12 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header)
200 } 199 }
201 200
202 memcpy(pci_mmcfg_config, &mcfg[1], config_size); 201 memcpy(pci_mmcfg_config, &mcfg[1], config_size);
202
203 acpi_mcfg_oem_check(mcfg);
204
203 for (i = 0; i < pci_mmcfg_config_num; ++i) { 205 for (i = 0; i < pci_mmcfg_config_num; ++i) {
204 if (pci_mmcfg_config[i].address > 0xFFFFFFFF) { 206 if ((pci_mmcfg_config[i].address > 0xFFFFFFFF) &&
207 !acpi_mcfg_64bit_base_addr) {
205 printk(KERN_ERR PREFIX 208 printk(KERN_ERR PREFIX
206 "MMCONFIG not in low 4GB of memory\n"); 209 "MMCONFIG not in low 4GB of memory\n");
207 kfree(pci_mmcfg_config); 210 kfree(pci_mmcfg_config);
@@ -249,10 +252,8 @@ static void __cpuinit acpi_register_lapic(int id, u8 enabled)
249 return; 252 return;
250 } 253 }
251 254
252#ifdef CONFIG_X86_32
253 if (boot_cpu_physical_apicid != -1U) 255 if (boot_cpu_physical_apicid != -1U)
254 ver = apic_version[boot_cpu_physical_apicid]; 256 ver = apic_version[boot_cpu_physical_apicid];
255#endif
256 257
257 generic_processor_info(id, ver); 258 generic_processor_info(id, ver);
258} 259}
@@ -338,8 +339,6 @@ acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long e
338 339
339#ifdef CONFIG_X86_IO_APIC 340#ifdef CONFIG_X86_IO_APIC
340 341
341struct mp_ioapic_routing mp_ioapic_routing[MAX_IO_APICS];
342
343static int __init 342static int __init
344acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end) 343acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
345{ 344{
@@ -514,8 +513,6 @@ int acpi_register_gsi(u32 gsi, int triggering, int polarity)
514 * Make sure all (legacy) PCI IRQs are set as level-triggered. 513 * Make sure all (legacy) PCI IRQs are set as level-triggered.
515 */ 514 */
516 if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { 515 if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) {
517 extern void eisa_set_level_irq(unsigned int irq);
518
519 if (triggering == ACPI_LEVEL_SENSITIVE) 516 if (triggering == ACPI_LEVEL_SENSITIVE)
520 eisa_set_level_irq(gsi); 517 eisa_set_level_irq(gsi);
521 } 518 }
@@ -775,11 +772,9 @@ static void __init acpi_register_lapic_address(unsigned long address)
775 772
776 set_fixmap_nocache(FIX_APIC_BASE, address); 773 set_fixmap_nocache(FIX_APIC_BASE, address);
777 if (boot_cpu_physical_apicid == -1U) { 774 if (boot_cpu_physical_apicid == -1U) {
778 boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id()); 775 boot_cpu_physical_apicid = read_apic_id();
779#ifdef CONFIG_X86_32
780 apic_version[boot_cpu_physical_apicid] = 776 apic_version[boot_cpu_physical_apicid] =
781 GET_APIC_VERSION(apic_read(APIC_LVR)); 777 GET_APIC_VERSION(apic_read(APIC_LVR));
782#endif
783 } 778 }
784} 779}
785 780
@@ -860,6 +855,364 @@ static int __init acpi_parse_madt_lapic_entries(void)
860#endif /* CONFIG_X86_LOCAL_APIC */ 855#endif /* CONFIG_X86_LOCAL_APIC */
861 856
862#ifdef CONFIG_X86_IO_APIC 857#ifdef CONFIG_X86_IO_APIC
858#define MP_ISA_BUS 0
859
860#ifdef CONFIG_X86_ES7000
861extern int es7000_plat;
862#endif
863
864static struct {
865 int apic_id;
866 int gsi_base;
867 int gsi_end;
868 DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
869} mp_ioapic_routing[MAX_IO_APICS];
870
871static int mp_find_ioapic(int gsi)
872{
873 int i = 0;
874
875 /* Find the IOAPIC that manages this GSI. */
876 for (i = 0; i < nr_ioapics; i++) {
877 if ((gsi >= mp_ioapic_routing[i].gsi_base)
878 && (gsi <= mp_ioapic_routing[i].gsi_end))
879 return i;
880 }
881
882 printk(KERN_ERR "ERROR: Unable to locate IOAPIC for GSI %d\n", gsi);
883 return -1;
884}
885
886static u8 __init uniq_ioapic_id(u8 id)
887{
888#ifdef CONFIG_X86_32
889 if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
890 !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
891 return io_apic_get_unique_id(nr_ioapics, id);
892 else
893 return id;
894#else
895 int i;
896 DECLARE_BITMAP(used, 256);
897 bitmap_zero(used, 256);
898 for (i = 0; i < nr_ioapics; i++) {
899 struct mp_config_ioapic *ia = &mp_ioapics[i];
900 __set_bit(ia->mp_apicid, used);
901 }
902 if (!test_bit(id, used))
903 return id;
904 return find_first_zero_bit(used, 256);
905#endif
906}
907
908static int bad_ioapic(unsigned long address)
909{
910 if (nr_ioapics >= MAX_IO_APICS) {
911 printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
912 "(found %d)\n", MAX_IO_APICS, nr_ioapics);
913 panic("Recompile kernel with bigger MAX_IO_APICS!\n");
914 }
915 if (!address) {
916 printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
917 " found in table, skipping!\n");
918 return 1;
919 }
920 return 0;
921}
922
923void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
924{
925 int idx = 0;
926
927 if (bad_ioapic(address))
928 return;
929
930 idx = nr_ioapics;
931
932 mp_ioapics[idx].mp_type = MP_IOAPIC;
933 mp_ioapics[idx].mp_flags = MPC_APIC_USABLE;
934 mp_ioapics[idx].mp_apicaddr = address;
935
936 set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
937 mp_ioapics[idx].mp_apicid = uniq_ioapic_id(id);
938#ifdef CONFIG_X86_32
939 mp_ioapics[idx].mp_apicver = io_apic_get_version(idx);
940#else
941 mp_ioapics[idx].mp_apicver = 0;
942#endif
943 /*
944 * Build basic GSI lookup table to facilitate gsi->io_apic lookups
945 * and to prevent reprogramming of IOAPIC pins (PCI GSIs).
946 */
947 mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mp_apicid;
948 mp_ioapic_routing[idx].gsi_base = gsi_base;
949 mp_ioapic_routing[idx].gsi_end = gsi_base +
950 io_apic_get_redir_entries(idx);
951
952 printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, "
953 "GSI %d-%d\n", idx, mp_ioapics[idx].mp_apicid,
954 mp_ioapics[idx].mp_apicver, mp_ioapics[idx].mp_apicaddr,
955 mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end);
956
957 nr_ioapics++;
958}
959
960static void assign_to_mp_irq(struct mp_config_intsrc *m,
961 struct mp_config_intsrc *mp_irq)
962{
963 memcpy(mp_irq, m, sizeof(struct mp_config_intsrc));
964}
965
966static int mp_irq_cmp(struct mp_config_intsrc *mp_irq,
967 struct mp_config_intsrc *m)
968{
969 return memcmp(mp_irq, m, sizeof(struct mp_config_intsrc));
970}
971
972static void save_mp_irq(struct mp_config_intsrc *m)
973{
974 int i;
975
976 for (i = 0; i < mp_irq_entries; i++) {
977 if (!mp_irq_cmp(&mp_irqs[i], m))
978 return;
979 }
980
981 assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
982 if (++mp_irq_entries == MAX_IRQ_SOURCES)
983 panic("Max # of irq sources exceeded!!\n");
984}
985
986void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
987{
988 int ioapic;
989 int pin;
990 struct mp_config_intsrc mp_irq;
991
992 /*
993 * Convert 'gsi' to 'ioapic.pin'.
994 */
995 ioapic = mp_find_ioapic(gsi);
996 if (ioapic < 0)
997 return;
998 pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
999
1000 /*
1001 * TBD: This check is for faulty timer entries, where the override
1002 * erroneously sets the trigger to level, resulting in a HUGE
1003 * increase of timer interrupts!
1004 */
1005 if ((bus_irq == 0) && (trigger == 3))
1006 trigger = 1;
1007
1008 mp_irq.mp_type = MP_INTSRC;
1009 mp_irq.mp_irqtype = mp_INT;
1010 mp_irq.mp_irqflag = (trigger << 2) | polarity;
1011 mp_irq.mp_srcbus = MP_ISA_BUS;
1012 mp_irq.mp_srcbusirq = bus_irq; /* IRQ */
1013 mp_irq.mp_dstapic = mp_ioapics[ioapic].mp_apicid; /* APIC ID */
1014 mp_irq.mp_dstirq = pin; /* INTIN# */
1015
1016 save_mp_irq(&mp_irq);
1017}
1018
1019void __init mp_config_acpi_legacy_irqs(void)
1020{
1021 int i;
1022 int ioapic;
1023 unsigned int dstapic;
1024 struct mp_config_intsrc mp_irq;
1025
1026#if defined (CONFIG_MCA) || defined (CONFIG_EISA)
1027 /*
1028 * Fabricate the legacy ISA bus (bus #31).
1029 */
1030 mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA;
1031#endif
1032 set_bit(MP_ISA_BUS, mp_bus_not_pci);
1033 pr_debug("Bus #%d is ISA\n", MP_ISA_BUS);
1034
1035#ifdef CONFIG_X86_ES7000
1036 /*
1037 * Older generations of ES7000 have no legacy identity mappings
1038 */
1039 if (es7000_plat == 1)
1040 return;
1041#endif
1042
1043 /*
1044 * Locate the IOAPIC that manages the ISA IRQs (0-15).
1045 */
1046 ioapic = mp_find_ioapic(0);
1047 if (ioapic < 0)
1048 return;
1049 dstapic = mp_ioapics[ioapic].mp_apicid;
1050
1051 /*
1052 * Use the default configuration for the IRQs 0-15. Unless
1053 * overridden by (MADT) interrupt source override entries.
1054 */
1055 for (i = 0; i < 16; i++) {
1056 int idx;
1057
1058 for (idx = 0; idx < mp_irq_entries; idx++) {
1059 struct mp_config_intsrc *irq = mp_irqs + idx;
1060
1061 /* Do we already have a mapping for this ISA IRQ? */
1062 if (irq->mp_srcbus == MP_ISA_BUS
1063 && irq->mp_srcbusirq == i)
1064 break;
1065
1066 /* Do we already have a mapping for this IOAPIC pin */
1067 if (irq->mp_dstapic == dstapic &&
1068 irq->mp_dstirq == i)
1069 break;
1070 }
1071
1072 if (idx != mp_irq_entries) {
1073 printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i);
1074 continue; /* IRQ already used */
1075 }
1076
1077 mp_irq.mp_type = MP_INTSRC;
1078 mp_irq.mp_irqflag = 0; /* Conforming */
1079 mp_irq.mp_srcbus = MP_ISA_BUS;
1080 mp_irq.mp_dstapic = dstapic;
1081 mp_irq.mp_irqtype = mp_INT;
1082 mp_irq.mp_srcbusirq = i; /* Identity mapped */
1083 mp_irq.mp_dstirq = i;
1084
1085 save_mp_irq(&mp_irq);
1086 }
1087}
1088
1089int mp_register_gsi(u32 gsi, int triggering, int polarity)
1090{
1091 int ioapic;
1092 int ioapic_pin;
1093#ifdef CONFIG_X86_32
1094#define MAX_GSI_NUM 4096
1095#define IRQ_COMPRESSION_START 64
1096
1097 static int pci_irq = IRQ_COMPRESSION_START;
1098 /*
1099 * Mapping between Global System Interrupts, which
1100 * represent all possible interrupts, and IRQs
1101 * assigned to actual devices.
1102 */
1103 static int gsi_to_irq[MAX_GSI_NUM];
1104#else
1105
1106 if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC)
1107 return gsi;
1108#endif
1109
1110 /* Don't set up the ACPI SCI because it's already set up */
1111 if (acpi_gbl_FADT.sci_interrupt == gsi)
1112 return gsi;
1113
1114 ioapic = mp_find_ioapic(gsi);
1115 if (ioapic < 0) {
1116 printk(KERN_WARNING "No IOAPIC for GSI %u\n", gsi);
1117 return gsi;
1118 }
1119
1120 ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
1121
1122#ifdef CONFIG_X86_32
1123 if (ioapic_renumber_irq)
1124 gsi = ioapic_renumber_irq(ioapic, gsi);
1125#endif
1126
1127 /*
1128 * Avoid pin reprogramming. PRTs typically include entries
1129 * with redundant pin->gsi mappings (but unique PCI devices);
1130 * we only program the IOAPIC on the first.
1131 */
1132 if (ioapic_pin > MP_MAX_IOAPIC_PIN) {
1133 printk(KERN_ERR "Invalid reference to IOAPIC pin "
1134 "%d-%d\n", mp_ioapic_routing[ioapic].apic_id,
1135 ioapic_pin);
1136 return gsi;
1137 }
1138 if (test_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed)) {
1139 pr_debug(KERN_DEBUG "Pin %d-%d already programmed\n",
1140 mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
1141#ifdef CONFIG_X86_32
1142 return (gsi < IRQ_COMPRESSION_START ? gsi : gsi_to_irq[gsi]);
1143#else
1144 return gsi;
1145#endif
1146 }
1147
1148 set_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed);
1149#ifdef CONFIG_X86_32
1150 /*
1151 * For GSI >= 64, use IRQ compression
1152 */
1153 if ((gsi >= IRQ_COMPRESSION_START)
1154 && (triggering == ACPI_LEVEL_SENSITIVE)) {
1155 /*
1156 * For PCI devices assign IRQs in order, avoiding gaps
1157 * due to unused I/O APIC pins.
1158 */
1159 int irq = gsi;
1160 if (gsi < MAX_GSI_NUM) {
1161 /*
1162 * Retain the VIA chipset work-around (gsi > 15), but
1163 * avoid a problem where the 8254 timer (IRQ0) is setup
1164 * via an override (so it's not on pin 0 of the ioapic),
1165 * and at the same time, the pin 0 interrupt is a PCI
1166 * type. The gsi > 15 test could cause these two pins
1167 * to be shared as IRQ0, and they are not shareable.
1168 * So test for this condition, and if necessary, avoid
1169 * the pin collision.
1170 */
1171 gsi = pci_irq++;
1172 /*
1173 * Don't assign IRQ used by ACPI SCI
1174 */
1175 if (gsi == acpi_gbl_FADT.sci_interrupt)
1176 gsi = pci_irq++;
1177 gsi_to_irq[irq] = gsi;
1178 } else {
1179 printk(KERN_ERR "GSI %u is too high\n", gsi);
1180 return gsi;
1181 }
1182 }
1183#endif
1184 io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
1185 triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
1186 polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
1187 return gsi;
1188}
1189
1190int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
1191 u32 gsi, int triggering, int polarity)
1192{
1193#ifdef CONFIG_X86_MPPARSE
1194 struct mp_config_intsrc mp_irq;
1195 int ioapic;
1196
1197 if (!acpi_ioapic)
1198 return 0;
1199
1200 /* print the entry should happen on mptable identically */
1201 mp_irq.mp_type = MP_INTSRC;
1202 mp_irq.mp_irqtype = mp_INT;
1203 mp_irq.mp_irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) |
1204 (polarity == ACPI_ACTIVE_HIGH ? 1 : 3);
1205 mp_irq.mp_srcbus = number;
1206 mp_irq.mp_srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3);
1207 ioapic = mp_find_ioapic(gsi);
1208 mp_irq.mp_dstapic = mp_ioapic_routing[ioapic].apic_id;
1209 mp_irq.mp_dstirq = gsi - mp_ioapic_routing[ioapic].gsi_base;
1210
1211 save_mp_irq(&mp_irq);
1212#endif
1213 return 0;
1214}
1215
863/* 1216/*
864 * Parse IOAPIC related entries in MADT 1217 * Parse IOAPIC related entries in MADT
865 * returns 0 on success, < 0 on error 1218 * returns 0 on success, < 0 on error
@@ -993,7 +1346,9 @@ static void __init acpi_process_madt(void)
993 acpi_ioapic = 1; 1346 acpi_ioapic = 1;
994 1347
995 smp_found_config = 1; 1348 smp_found_config = 1;
1349#ifdef CONFIG_X86_32
996 setup_apic_routing(); 1350 setup_apic_routing();
1351#endif
997 } 1352 }
998 } 1353 }
999 if (error == -EINVAL) { 1354 if (error == -EINVAL) {
@@ -1009,8 +1364,6 @@ static void __init acpi_process_madt(void)
1009 return; 1364 return;
1010} 1365}
1011 1366
1012#ifdef __i386__
1013
1014static int __init disable_acpi_irq(const struct dmi_system_id *d) 1367static int __init disable_acpi_irq(const struct dmi_system_id *d)
1015{ 1368{
1016 if (!acpi_force) { 1369 if (!acpi_force) {
@@ -1061,6 +1414,24 @@ static int __init force_acpi_ht(const struct dmi_system_id *d)
1061} 1414}
1062 1415
1063/* 1416/*
1417 * Force ignoring BIOS IRQ0 pin2 override
1418 */
1419static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
1420{
1421 /*
1422 * The ati_ixp4x0_rev() early PCI quirk should have set
1423 * the acpi_skip_timer_override flag already:
1424 */
1425 if (!acpi_skip_timer_override) {
1426 WARN(1, KERN_ERR "ati_ixp4x0 quirk not complete.\n");
1427 pr_notice("%s detected: Ignoring BIOS IRQ0 pin2 override\n",
1428 d->ident);
1429 acpi_skip_timer_override = 1;
1430 }
1431 return 0;
1432}
1433
1434/*
1064 * If your system is blacklisted here, but you find that acpi=force 1435 * If your system is blacklisted here, but you find that acpi=force
1065 * works for you, please contact acpi-devel@sourceforge.net 1436 * works for you, please contact acpi-devel@sourceforge.net
1066 */ 1437 */
@@ -1227,11 +1598,51 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
1227 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), 1598 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
1228 }, 1599 },
1229 }, 1600 },
1601 /*
1602 * HP laptops which use a DSDT reporting as HP/SB400/10000,
1603 * which includes some code which overrides all temperature
1604 * trip points to 16C if the INTIN2 input of the I/O APIC
1605 * is enabled. This input is incorrectly designated the
1606 * ISA IRQ 0 via an interrupt source override even though
1607 * it is wired to the output of the master 8259A and INTIN0
1608 * is not connected at all. Force ignoring BIOS IRQ0 pin2
1609 * override in that cases.
1610 */
1611 {
1612 .callback = dmi_ignore_irq0_timer_override,
1613 .ident = "HP nx6115 laptop",
1614 .matches = {
1615 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1616 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6115"),
1617 },
1618 },
1619 {
1620 .callback = dmi_ignore_irq0_timer_override,
1621 .ident = "HP NX6125 laptop",
1622 .matches = {
1623 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1624 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6125"),
1625 },
1626 },
1627 {
1628 .callback = dmi_ignore_irq0_timer_override,
1629 .ident = "HP NX6325 laptop",
1630 .matches = {
1631 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1632 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"),
1633 },
1634 },
1635 {
1636 .callback = dmi_ignore_irq0_timer_override,
1637 .ident = "HP 6715b laptop",
1638 .matches = {
1639 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1640 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"),
1641 },
1642 },
1230 {} 1643 {}
1231}; 1644};
1232 1645
1233#endif /* __i386__ */
1234
1235/* 1646/*
1236 * acpi_boot_table_init() and acpi_boot_init() 1647 * acpi_boot_table_init() and acpi_boot_init()
1237 * called from setup_arch(), always. 1648 * called from setup_arch(), always.
@@ -1259,9 +1670,7 @@ int __init acpi_boot_table_init(void)
1259{ 1670{
1260 int error; 1671 int error;
1261 1672
1262#ifdef __i386__
1263 dmi_check_system(acpi_dmi_table); 1673 dmi_check_system(acpi_dmi_table);
1264#endif
1265 1674
1266 /* 1675 /*
1267 * If acpi_disabled, bail out 1676 * If acpi_disabled, bail out
@@ -1386,6 +1795,20 @@ static int __init parse_pci(char *arg)
1386} 1795}
1387early_param("pci", parse_pci); 1796early_param("pci", parse_pci);
1388 1797
1798int __init acpi_mps_check(void)
1799{
1800#if defined(CONFIG_X86_LOCAL_APIC) && !defined(CONFIG_X86_MPPARSE)
1801/* mptable code is not built-in*/
1802 if (acpi_disabled || acpi_noirq) {
1803 printk(KERN_WARNING "MPS support code is not built-in.\n"
1804 "Using acpi=off or acpi=noirq or pci=noacpi "
1805 "may have problem\n");
1806 return 1;
1807 }
1808#endif
1809 return 0;
1810}
1811
1389#ifdef CONFIG_X86_IO_APIC 1812#ifdef CONFIG_X86_IO_APIC
1390static int __init parse_acpi_skip_timer_override(char *arg) 1813static int __init parse_acpi_skip_timer_override(char *arg)
1391{ 1814{