diff options
Diffstat (limited to 'arch/x86/kernel/acpi/boot.c')
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index fa88a1d71290..eb875cdc7367 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -58,7 +58,6 @@ EXPORT_SYMBOL(acpi_disabled); | |||
58 | #ifdef CONFIG_X86_64 | 58 | #ifdef CONFIG_X86_64 |
59 | 59 | ||
60 | #include <asm/proto.h> | 60 | #include <asm/proto.h> |
61 | #include <asm/genapic.h> | ||
62 | 61 | ||
63 | #else /* X86 */ | 62 | #else /* X86 */ |
64 | 63 | ||
@@ -158,6 +157,16 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) | |||
158 | struct acpi_mcfg_allocation *pci_mmcfg_config; | 157 | struct acpi_mcfg_allocation *pci_mmcfg_config; |
159 | int pci_mmcfg_config_num; | 158 | int pci_mmcfg_config_num; |
160 | 159 | ||
160 | static int acpi_mcfg_64bit_base_addr __initdata = FALSE; | ||
161 | |||
162 | static 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 | |||
161 | int __init acpi_parse_mcfg(struct acpi_table_header *header) | 170 | int __init acpi_parse_mcfg(struct acpi_table_header *header) |
162 | { | 171 | { |
163 | struct acpi_table_mcfg *mcfg; | 172 | struct acpi_table_mcfg *mcfg; |
@@ -190,8 +199,12 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header) | |||
190 | } | 199 | } |
191 | 200 | ||
192 | 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 | |||
193 | for (i = 0; i < pci_mmcfg_config_num; ++i) { | 205 | for (i = 0; i < pci_mmcfg_config_num; ++i) { |
194 | if (pci_mmcfg_config[i].address > 0xFFFFFFFF) { | 206 | if ((pci_mmcfg_config[i].address > 0xFFFFFFFF) && |
207 | !acpi_mcfg_64bit_base_addr) { | ||
195 | printk(KERN_ERR PREFIX | 208 | printk(KERN_ERR PREFIX |
196 | "MMCONFIG not in low 4GB of memory\n"); | 209 | "MMCONFIG not in low 4GB of memory\n"); |
197 | kfree(pci_mmcfg_config); | 210 | kfree(pci_mmcfg_config); |
@@ -239,10 +252,8 @@ static void __cpuinit acpi_register_lapic(int id, u8 enabled) | |||
239 | return; | 252 | return; |
240 | } | 253 | } |
241 | 254 | ||
242 | #ifdef CONFIG_X86_32 | ||
243 | if (boot_cpu_physical_apicid != -1U) | 255 | if (boot_cpu_physical_apicid != -1U) |
244 | ver = apic_version[boot_cpu_physical_apicid]; | 256 | ver = apic_version[boot_cpu_physical_apicid]; |
245 | #endif | ||
246 | 257 | ||
247 | generic_processor_info(id, ver); | 258 | generic_processor_info(id, ver); |
248 | } | 259 | } |
@@ -761,11 +772,9 @@ static void __init acpi_register_lapic_address(unsigned long address) | |||
761 | 772 | ||
762 | set_fixmap_nocache(FIX_APIC_BASE, address); | 773 | set_fixmap_nocache(FIX_APIC_BASE, address); |
763 | if (boot_cpu_physical_apicid == -1U) { | 774 | if (boot_cpu_physical_apicid == -1U) { |
764 | boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id()); | 775 | boot_cpu_physical_apicid = read_apic_id(); |
765 | #ifdef CONFIG_X86_32 | ||
766 | apic_version[boot_cpu_physical_apicid] = | 776 | apic_version[boot_cpu_physical_apicid] = |
767 | GET_APIC_VERSION(apic_read(APIC_LVR)); | 777 | GET_APIC_VERSION(apic_read(APIC_LVR)); |
768 | #endif | ||
769 | } | 778 | } |
770 | } | 779 | } |
771 | 780 | ||
@@ -1337,7 +1346,9 @@ static void __init acpi_process_madt(void) | |||
1337 | acpi_ioapic = 1; | 1346 | acpi_ioapic = 1; |
1338 | 1347 | ||
1339 | smp_found_config = 1; | 1348 | smp_found_config = 1; |
1349 | #ifdef CONFIG_X86_32 | ||
1340 | setup_apic_routing(); | 1350 | setup_apic_routing(); |
1351 | #endif | ||
1341 | } | 1352 | } |
1342 | } | 1353 | } |
1343 | if (error == -EINVAL) { | 1354 | if (error == -EINVAL) { |
@@ -1407,8 +1418,16 @@ static int __init force_acpi_ht(const struct dmi_system_id *d) | |||
1407 | */ | 1418 | */ |
1408 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) | 1419 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) |
1409 | { | 1420 | { |
1410 | pr_notice("%s detected: Ignoring BIOS IRQ0 pin2 override\n", d->ident); | 1421 | /* |
1411 | acpi_skip_timer_override = 1; | 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 | } | ||
1412 | return 0; | 1431 | return 0; |
1413 | } | 1432 | } |
1414 | 1433 | ||
@@ -1591,6 +1610,14 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { | |||
1591 | */ | 1610 | */ |
1592 | { | 1611 | { |
1593 | .callback = dmi_ignore_irq0_timer_override, | 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, | ||
1594 | .ident = "HP NX6125 laptop", | 1621 | .ident = "HP NX6125 laptop", |
1595 | .matches = { | 1622 | .matches = { |
1596 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | 1623 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
@@ -1605,6 +1632,14 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { | |||
1605 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"), | 1632 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"), |
1606 | }, | 1633 | }, |
1607 | }, | 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 | }, | ||
1608 | {} | 1643 | {} |
1609 | }; | 1644 | }; |
1610 | 1645 | ||