aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386/kernel/quirks.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/kernel/quirks.c')
-rw-r--r--arch/i386/kernel/quirks.c46
1 files changed, 11 insertions, 35 deletions
diff --git a/arch/i386/kernel/quirks.c b/arch/i386/kernel/quirks.c
index a01320a7b636..9f6ab1789bb0 100644
--- a/arch/i386/kernel/quirks.c
+++ b/arch/i386/kernel/quirks.c
@@ -3,23 +3,10 @@
3 */ 3 */
4#include <linux/pci.h> 4#include <linux/pci.h>
5#include <linux/irq.h> 5#include <linux/irq.h>
6#include <asm/pci-direct.h>
7#include <asm/genapic.h>
8#include <asm/cpu.h>
9 6
10#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SMP) && defined(CONFIG_PCI) 7#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SMP) && defined(CONFIG_PCI)
11static void __devinit verify_quirk_intel_irqbalance(struct pci_dev *dev)
12{
13#ifdef CONFIG_X86_64
14 if (genapic != &apic_flat)
15 panic("APIC mode must be flat on this system\n");
16#elif defined(CONFIG_X86_GENERICARCH)
17 if (genapic != &apic_default)
18 panic("APIC mode must be default(flat) on this system. Use apic=default\n");
19#endif
20}
21 8
22void __init quirk_intel_irqbalance(void) 9static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
23{ 10{
24 u8 config, rev; 11 u8 config, rev;
25 u32 word; 12 u32 word;
@@ -29,18 +16,18 @@ void __init quirk_intel_irqbalance(void)
29 * based platforms. 16 * based platforms.
30 * Disable SW irqbalance/affinity on those platforms. 17 * Disable SW irqbalance/affinity on those platforms.
31 */ 18 */
32 rev = read_pci_config_byte(0, 0, 0, PCI_CLASS_REVISION); 19 pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
33 if (rev > 0x9) 20 if (rev > 0x9)
34 return; 21 return;
35 22
36 printk(KERN_INFO "Intel E7520/7320/7525 detected."); 23 printk(KERN_INFO "Intel E7520/7320/7525 detected.");
37 24
38 /* enable access to config space */ 25 /* enable access to config space*/
39 config = read_pci_config_byte(0, 0, 0, 0xf4); 26 pci_read_config_byte(dev, 0xf4, &config);
40 write_pci_config_byte(0, 0, 0, 0xf4, config|0x2); 27 pci_write_config_byte(dev, 0xf4, config|0x2);
41 28
42 /* read xTPR register */ 29 /* read xTPR register */
43 word = read_pci_config_16(0, 0, 0x40, 0x4c); 30 raw_pci_ops->read(0, 0, 0x40, 0x4c, 2, &word);
44 31
45 if (!(word & (1 << 13))) { 32 if (!(word & (1 << 13))) {
46 printk(KERN_INFO "Disabling irq balancing and affinity\n"); 33 printk(KERN_INFO "Disabling irq balancing and affinity\n");
@@ -51,24 +38,13 @@ void __init quirk_intel_irqbalance(void)
51#ifdef CONFIG_PROC_FS 38#ifdef CONFIG_PROC_FS
52 no_irq_affinity = 1; 39 no_irq_affinity = 1;
53#endif 40#endif
54#ifdef CONFIG_HOTPLUG_CPU
55 printk(KERN_INFO "Disabling cpu hotplug control\n");
56 enable_cpu_hotplug = 0;
57#endif
58#ifdef CONFIG_X86_64
59 /* force the genapic selection to flat mode so that
60 * interrupts can be redirected to more than one CPU.
61 */
62 genapic_force = &apic_flat;
63#endif
64 } 41 }
65 42
66 /* put back the original value for config space */ 43 /* put back the original value for config space*/
67 if (!(config & 0x2)) 44 if (!(config & 0x2))
68 write_pci_config_byte(0, 0, 0, 0xf4, config); 45 pci_write_config_byte(dev, 0xf4, config);
69} 46}
70DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7320_MCH, verify_quirk_intel_irqbalance); 47DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7320_MCH, quirk_intel_irqbalance);
71DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7525_MCH, verify_quirk_intel_irqbalance); 48DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7525_MCH, quirk_intel_irqbalance);
72DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7520_MCH, verify_quirk_intel_irqbalance); 49DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7520_MCH, quirk_intel_irqbalance);
73
74#endif 50#endif