diff options
Diffstat (limited to 'arch/x86/kernel/acpi/boot.c')
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index bfd10fd211c..8c1f76abae9 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 | ||
@@ -97,8 +96,6 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; | |||
97 | #warning ACPI uses CMPXCHG, i486 and later hardware | 96 | #warning ACPI uses CMPXCHG, i486 and later hardware |
98 | #endif | 97 | #endif |
99 | 98 | ||
100 | static int acpi_mcfg_64bit_base_addr __initdata = FALSE; | ||
101 | |||
102 | /* -------------------------------------------------------------------------- | 99 | /* -------------------------------------------------------------------------- |
103 | Boot-time Configuration | 100 | Boot-time Configuration |
104 | -------------------------------------------------------------------------- */ | 101 | -------------------------------------------------------------------------- */ |
@@ -156,6 +153,9 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) | |||
156 | } | 153 | } |
157 | 154 | ||
158 | #ifdef CONFIG_PCI_MMCONFIG | 155 | #ifdef CONFIG_PCI_MMCONFIG |
156 | |||
157 | static int acpi_mcfg_64bit_base_addr __initdata = FALSE; | ||
158 | |||
159 | /* The physical address of the MMCONFIG aperture. Set from ACPI tables. */ | 159 | /* The physical address of the MMCONFIG aperture. Set from ACPI tables. */ |
160 | struct acpi_mcfg_allocation *pci_mmcfg_config; | 160 | struct acpi_mcfg_allocation *pci_mmcfg_config; |
161 | int pci_mmcfg_config_num; | 161 | int pci_mmcfg_config_num; |
@@ -253,10 +253,8 @@ static void __cpuinit acpi_register_lapic(int id, u8 enabled) | |||
253 | return; | 253 | return; |
254 | } | 254 | } |
255 | 255 | ||
256 | #ifdef CONFIG_X86_32 | ||
257 | if (boot_cpu_physical_apicid != -1U) | 256 | if (boot_cpu_physical_apicid != -1U) |
258 | ver = apic_version[boot_cpu_physical_apicid]; | 257 | ver = apic_version[boot_cpu_physical_apicid]; |
259 | #endif | ||
260 | 258 | ||
261 | generic_processor_info(id, ver); | 259 | generic_processor_info(id, ver); |
262 | } | 260 | } |
@@ -775,11 +773,9 @@ static void __init acpi_register_lapic_address(unsigned long address) | |||
775 | 773 | ||
776 | set_fixmap_nocache(FIX_APIC_BASE, address); | 774 | set_fixmap_nocache(FIX_APIC_BASE, address); |
777 | if (boot_cpu_physical_apicid == -1U) { | 775 | if (boot_cpu_physical_apicid == -1U) { |
778 | boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id()); | 776 | boot_cpu_physical_apicid = read_apic_id(); |
779 | #ifdef CONFIG_X86_32 | ||
780 | apic_version[boot_cpu_physical_apicid] = | 777 | apic_version[boot_cpu_physical_apicid] = |
781 | GET_APIC_VERSION(apic_read(APIC_LVR)); | 778 | GET_APIC_VERSION(apic_read(APIC_LVR)); |
782 | #endif | ||
783 | } | 779 | } |
784 | } | 780 | } |
785 | 781 | ||
@@ -1141,7 +1137,7 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity) | |||
1141 | return gsi; | 1137 | return gsi; |
1142 | } | 1138 | } |
1143 | if (test_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed)) { | 1139 | if (test_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed)) { |
1144 | pr_debug(KERN_DEBUG "Pin %d-%d already programmed\n", | 1140 | pr_debug("Pin %d-%d already programmed\n", |
1145 | mp_ioapic_routing[ioapic].apic_id, ioapic_pin); | 1141 | mp_ioapic_routing[ioapic].apic_id, ioapic_pin); |
1146 | #ifdef CONFIG_X86_32 | 1142 | #ifdef CONFIG_X86_32 |
1147 | return (gsi < IRQ_COMPRESSION_START ? gsi : gsi_to_irq[gsi]); | 1143 | return (gsi < IRQ_COMPRESSION_START ? gsi : gsi_to_irq[gsi]); |
@@ -1261,7 +1257,7 @@ static int __init acpi_parse_madt_ioapic_entries(void) | |||
1261 | 1257 | ||
1262 | count = | 1258 | count = |
1263 | acpi_table_parse_madt(ACPI_MADT_TYPE_INTERRUPT_OVERRIDE, acpi_parse_int_src_ovr, | 1259 | acpi_table_parse_madt(ACPI_MADT_TYPE_INTERRUPT_OVERRIDE, acpi_parse_int_src_ovr, |
1264 | NR_IRQ_VECTORS); | 1260 | nr_irqs); |
1265 | if (count < 0) { | 1261 | if (count < 0) { |
1266 | printk(KERN_ERR PREFIX | 1262 | printk(KERN_ERR PREFIX |
1267 | "Error parsing interrupt source overrides entry\n"); | 1263 | "Error parsing interrupt source overrides entry\n"); |
@@ -1281,7 +1277,7 @@ static int __init acpi_parse_madt_ioapic_entries(void) | |||
1281 | 1277 | ||
1282 | count = | 1278 | count = |
1283 | acpi_table_parse_madt(ACPI_MADT_TYPE_NMI_SOURCE, acpi_parse_nmi_src, | 1279 | acpi_table_parse_madt(ACPI_MADT_TYPE_NMI_SOURCE, acpi_parse_nmi_src, |
1284 | NR_IRQ_VECTORS); | 1280 | nr_irqs); |
1285 | if (count < 0) { | 1281 | if (count < 0) { |
1286 | printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n"); | 1282 | printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n"); |
1287 | /* TBD: Cleanup to allow fallback to MPS */ | 1283 | /* TBD: Cleanup to allow fallback to MPS */ |
@@ -1351,7 +1347,9 @@ static void __init acpi_process_madt(void) | |||
1351 | acpi_ioapic = 1; | 1347 | acpi_ioapic = 1; |
1352 | 1348 | ||
1353 | smp_found_config = 1; | 1349 | smp_found_config = 1; |
1350 | #ifdef CONFIG_X86_32 | ||
1354 | setup_apic_routing(); | 1351 | setup_apic_routing(); |
1352 | #endif | ||
1355 | } | 1353 | } |
1356 | } | 1354 | } |
1357 | if (error == -EINVAL) { | 1355 | if (error == -EINVAL) { |
@@ -1421,8 +1419,16 @@ static int __init force_acpi_ht(const struct dmi_system_id *d) | |||
1421 | */ | 1419 | */ |
1422 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) | 1420 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) |
1423 | { | 1421 | { |
1424 | pr_notice("%s detected: Ignoring BIOS IRQ0 pin2 override\n", d->ident); | 1422 | /* |
1425 | acpi_skip_timer_override = 1; | 1423 | * The ati_ixp4x0_rev() early PCI quirk should have set |
1424 | * the acpi_skip_timer_override flag already: | ||
1425 | */ | ||
1426 | if (!acpi_skip_timer_override) { | ||
1427 | WARN(1, KERN_ERR "ati_ixp4x0 quirk not complete.\n"); | ||
1428 | pr_notice("%s detected: Ignoring BIOS IRQ0 pin2 override\n", | ||
1429 | d->ident); | ||
1430 | acpi_skip_timer_override = 1; | ||
1431 | } | ||
1426 | return 0; | 1432 | return 0; |
1427 | } | 1433 | } |
1428 | 1434 | ||
@@ -1593,6 +1599,11 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { | |||
1593 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), | 1599 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), |
1594 | }, | 1600 | }, |
1595 | }, | 1601 | }, |
1602 | {} | ||
1603 | }; | ||
1604 | |||
1605 | /* second table for DMI checks that should run after early-quirks */ | ||
1606 | static struct dmi_system_id __initdata acpi_dmi_table_late[] = { | ||
1596 | /* | 1607 | /* |
1597 | * HP laptops which use a DSDT reporting as HP/SB400/10000, | 1608 | * HP laptops which use a DSDT reporting as HP/SB400/10000, |
1598 | * which includes some code which overrides all temperature | 1609 | * which includes some code which overrides all temperature |
@@ -1605,6 +1616,14 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { | |||
1605 | */ | 1616 | */ |
1606 | { | 1617 | { |
1607 | .callback = dmi_ignore_irq0_timer_override, | 1618 | .callback = dmi_ignore_irq0_timer_override, |
1619 | .ident = "HP nx6115 laptop", | ||
1620 | .matches = { | ||
1621 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
1622 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6115"), | ||
1623 | }, | ||
1624 | }, | ||
1625 | { | ||
1626 | .callback = dmi_ignore_irq0_timer_override, | ||
1608 | .ident = "HP NX6125 laptop", | 1627 | .ident = "HP NX6125 laptop", |
1609 | .matches = { | 1628 | .matches = { |
1610 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | 1629 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
@@ -1619,6 +1638,14 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { | |||
1619 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"), | 1638 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"), |
1620 | }, | 1639 | }, |
1621 | }, | 1640 | }, |
1641 | { | ||
1642 | .callback = dmi_ignore_irq0_timer_override, | ||
1643 | .ident = "HP 6715b laptop", | ||
1644 | .matches = { | ||
1645 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
1646 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"), | ||
1647 | }, | ||
1648 | }, | ||
1622 | {} | 1649 | {} |
1623 | }; | 1650 | }; |
1624 | 1651 | ||
@@ -1705,6 +1732,9 @@ int __init early_acpi_boot_init(void) | |||
1705 | 1732 | ||
1706 | int __init acpi_boot_init(void) | 1733 | int __init acpi_boot_init(void) |
1707 | { | 1734 | { |
1735 | /* those are executed after early-quirks are executed */ | ||
1736 | dmi_check_system(acpi_dmi_table_late); | ||
1737 | |||
1708 | /* | 1738 | /* |
1709 | * If acpi_disabled, bail out | 1739 | * If acpi_disabled, bail out |
1710 | * One exception: acpi=ht continues far enough to enumerate LAPICs | 1740 | * One exception: acpi=ht continues far enough to enumerate LAPICs |