aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/acpi/boot.c43
-rw-r--r--arch/x86/kernel/io_apic_32.c10
-rw-r--r--arch/x86/kernel/io_apic_64.c10
-rw-r--r--include/asm-x86/genapic_32.h1
-rw-r--r--include/asm-x86/genapic_64.h2
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
1378static int __init disable_acpi_irq(const struct dmi_system_id *d) 1376static 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 */
1439static 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 };
59static DEFINE_SPINLOCK(ioapic_lock); 59static DEFINE_SPINLOCK(ioapic_lock);
60static DEFINE_SPINLOCK(vector_lock); 60static DEFINE_SPINLOCK(vector_lock);
61 61
62static bool mask_ioapic_irq_2 __initdata;
63
64void __init force_mask_ioapic_irq_2(void)
65{
66 mask_ioapic_irq_2 = true;
67}
68
62int timer_through_8259 __initdata; 69int 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
95static int disable_timer_pin_1 __initdata; 95static int disable_timer_pin_1 __initdata;
96 96
97static bool mask_ioapic_irq_2 __initdata;
98
99void __init force_mask_ioapic_irq_2(void)
100{
101 mask_ioapic_irq_2 = true;
102}
103
97int timer_through_8259 __initdata; 104int 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
122extern 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
47extern void setup_apic_routing(void); 47extern void setup_apic_routing(void);
48 48
49extern void force_mask_ioapic_irq_2(void);
50
49#endif 51#endif