diff options
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 43 | ||||
-rw-r--r-- | arch/x86/kernel/io_apic_32.c | 10 | ||||
-rw-r--r-- | arch/x86/kernel/io_apic_64.c | 10 | ||||
-rw-r--r-- | include/asm-x86/genapic_32.h | 1 | ||||
-rw-r--r-- | include/asm-x86/genapic_64.h | 2 |
5 files changed, 60 insertions, 6 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 5c0107602b62..e1f01394b681 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -1373,8 +1373,6 @@ static void __init acpi_process_madt(void) | |||
1373 | return; | 1373 | return; |
1374 | } | 1374 | } |
1375 | 1375 | ||
1376 | #ifdef __i386__ | ||
1377 | |||
1378 | static int __init disable_acpi_irq(const struct dmi_system_id *d) | 1376 | static int __init disable_acpi_irq(const struct dmi_system_id *d) |
1379 | { | 1377 | { |
1380 | if (!acpi_force) { | 1378 | if (!acpi_force) { |
@@ -1436,6 +1434,17 @@ dmi_disable_irq0_through_ioapic(const struct dmi_system_id *d) | |||
1436 | } | 1434 | } |
1437 | 1435 | ||
1438 | /* | 1436 | /* |
1437 | * Force ignoring BIOS IRQ0 pin2 override | ||
1438 | */ | ||
1439 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) | ||
1440 | { | ||
1441 | pr_notice("%s detected: Ignoring BIOS IRQ0 pin2 override\n", d->ident); | ||
1442 | acpi_skip_timer_override = 1; | ||
1443 | force_mask_ioapic_irq_2(); | ||
1444 | return 0; | ||
1445 | } | ||
1446 | |||
1447 | /* | ||
1439 | * If your system is blacklisted here, but you find that acpi=force | 1448 | * If your system is blacklisted here, but you find that acpi=force |
1440 | * works for you, please contact acpi-devel@sourceforge.net | 1449 | * works for you, please contact acpi-devel@sourceforge.net |
1441 | */ | 1450 | */ |
@@ -1628,11 +1637,35 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { | |||
1628 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"), | 1637 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"), |
1629 | }, | 1638 | }, |
1630 | }, | 1639 | }, |
1640 | /* | ||
1641 | * HP laptops which use a DSDT reporting as HP/SB400/10000, | ||
1642 | * which includes some code which overrides all temperature | ||
1643 | * trip points to 16C if the INTIN2 input of the I/O APIC | ||
1644 | * is enabled. This input is incorrectly designated the | ||
1645 | * ISA IRQ 0 via an interrupt source override even though | ||
1646 | * it is wired to the output of the master 8259A and INTIN0 | ||
1647 | * is not connected at all. Force ignoring BIOS IRQ0 pin2 | ||
1648 | * override in that cases. | ||
1649 | */ | ||
1650 | { | ||
1651 | .callback = dmi_ignore_irq0_timer_override, | ||
1652 | .ident = "HP NX6125 laptop", | ||
1653 | .matches = { | ||
1654 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
1655 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6125"), | ||
1656 | }, | ||
1657 | }, | ||
1658 | { | ||
1659 | .callback = dmi_ignore_irq0_timer_override, | ||
1660 | .ident = "HP NX6325 laptop", | ||
1661 | .matches = { | ||
1662 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
1663 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"), | ||
1664 | }, | ||
1665 | }, | ||
1631 | {} | 1666 | {} |
1632 | }; | 1667 | }; |
1633 | 1668 | ||
1634 | #endif /* __i386__ */ | ||
1635 | |||
1636 | /* | 1669 | /* |
1637 | * acpi_boot_table_init() and acpi_boot_init() | 1670 | * acpi_boot_table_init() and acpi_boot_init() |
1638 | * called from setup_arch(), always. | 1671 | * called from setup_arch(), always. |
@@ -1660,9 +1693,7 @@ int __init acpi_boot_table_init(void) | |||
1660 | { | 1693 | { |
1661 | int error; | 1694 | int error; |
1662 | 1695 | ||
1663 | #ifdef __i386__ | ||
1664 | dmi_check_system(acpi_dmi_table); | 1696 | dmi_check_system(acpi_dmi_table); |
1665 | #endif | ||
1666 | 1697 | ||
1667 | /* | 1698 | /* |
1668 | * If acpi_disabled, bail out | 1699 | * If acpi_disabled, bail out |
diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c index 337ec3438a8f..6b220b9dcbb3 100644 --- a/arch/x86/kernel/io_apic_32.c +++ b/arch/x86/kernel/io_apic_32.c | |||
@@ -59,6 +59,13 @@ static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; | |||
59 | static DEFINE_SPINLOCK(ioapic_lock); | 59 | static DEFINE_SPINLOCK(ioapic_lock); |
60 | static DEFINE_SPINLOCK(vector_lock); | 60 | static DEFINE_SPINLOCK(vector_lock); |
61 | 61 | ||
62 | static bool mask_ioapic_irq_2 __initdata; | ||
63 | |||
64 | void __init force_mask_ioapic_irq_2(void) | ||
65 | { | ||
66 | mask_ioapic_irq_2 = true; | ||
67 | } | ||
68 | |||
62 | int timer_through_8259 __initdata; | 69 | int timer_through_8259 __initdata; |
63 | 70 | ||
64 | /* | 71 | /* |
@@ -2172,6 +2179,9 @@ static inline void __init check_timer(void) | |||
2172 | printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n", | 2179 | printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n", |
2173 | vector, apic1, pin1, apic2, pin2); | 2180 | vector, apic1, pin1, apic2, pin2); |
2174 | 2181 | ||
2182 | if (mask_ioapic_irq_2) | ||
2183 | mask_IO_APIC_irq(2); | ||
2184 | |||
2175 | /* | 2185 | /* |
2176 | * Some BIOS writers are clueless and report the ExtINTA | 2186 | * Some BIOS writers are clueless and report the ExtINTA |
2177 | * I/O APIC input from the cascaded 8259A as the timer | 2187 | * I/O APIC input from the cascaded 8259A as the timer |
diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c index 2b4c40bc12c9..0494cdb270c5 100644 --- a/arch/x86/kernel/io_apic_64.c +++ b/arch/x86/kernel/io_apic_64.c | |||
@@ -94,6 +94,13 @@ static int no_timer_check; | |||
94 | 94 | ||
95 | static int disable_timer_pin_1 __initdata; | 95 | static int disable_timer_pin_1 __initdata; |
96 | 96 | ||
97 | static bool mask_ioapic_irq_2 __initdata; | ||
98 | |||
99 | void __init force_mask_ioapic_irq_2(void) | ||
100 | { | ||
101 | mask_ioapic_irq_2 = true; | ||
102 | } | ||
103 | |||
97 | int timer_through_8259 __initdata; | 104 | int timer_through_8259 __initdata; |
98 | 105 | ||
99 | /* Where if anywhere is the i8259 connect in external int mode */ | 106 | /* Where if anywhere is the i8259 connect in external int mode */ |
@@ -1698,6 +1705,9 @@ static inline void __init check_timer(void) | |||
1698 | apic_printk(APIC_VERBOSE,KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n", | 1705 | apic_printk(APIC_VERBOSE,KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n", |
1699 | cfg->vector, apic1, pin1, apic2, pin2); | 1706 | cfg->vector, apic1, pin1, apic2, pin2); |
1700 | 1707 | ||
1708 | if (mask_ioapic_irq_2) | ||
1709 | mask_IO_APIC_irq(2); | ||
1710 | |||
1701 | /* | 1711 | /* |
1702 | * Some BIOS writers are clueless and report the ExtINTA | 1712 | * Some BIOS writers are clueless and report the ExtINTA |
1703 | * I/O APIC input from the cascaded 8259A as the timer | 1713 | * I/O APIC input from the cascaded 8259A as the timer |
diff --git a/include/asm-x86/genapic_32.h b/include/asm-x86/genapic_32.h index b02ea6e17de8..8d4c8bdb9065 100644 --- a/include/asm-x86/genapic_32.h +++ b/include/asm-x86/genapic_32.h | |||
@@ -119,5 +119,6 @@ enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC}; | |||
119 | #define is_uv_system() 0 | 119 | #define is_uv_system() 0 |
120 | #define uv_wakeup_secondary(a, b) 1 | 120 | #define uv_wakeup_secondary(a, b) 1 |
121 | 121 | ||
122 | extern void force_mask_ioapic_irq_2(void); | ||
122 | 123 | ||
123 | #endif | 124 | #endif |
diff --git a/include/asm-x86/genapic_64.h b/include/asm-x86/genapic_64.h index 0f8504627c41..082ad020e412 100644 --- a/include/asm-x86/genapic_64.h +++ b/include/asm-x86/genapic_64.h | |||
@@ -46,4 +46,6 @@ extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip); | |||
46 | 46 | ||
47 | extern void setup_apic_routing(void); | 47 | extern void setup_apic_routing(void); |
48 | 48 | ||
49 | extern void force_mask_ioapic_irq_2(void); | ||
50 | |||
49 | #endif | 51 | #endif |