aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2009-01-14 07:27:35 -0500
committerIngo Molnar <mingo@elte.hu>2009-01-15 06:04:40 -0500
commitf11826385b63566d98c02d35f592232ee77cd791 (patch)
tree07caf8db36be6c5b56bb7dacd49b95c520fb4db1
parent5cca0cf15a94417f49625ce52e23589eed0a1675 (diff)
x86: fully honor "nolapic"
Impact: widen the effect of the 'nolapic' boot parameter "nolapic" should not only suppress SMP and use of the LAPIC, but it also ought to have the effect of disabling all IO-APIC related activity as well as PCI MSI and HT-IRQs. Signed-off-by: Jan Beulich <jbeulich@novell.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/kernel/apic.c7
-rw-r--r--arch/x86/kernel/io_apic.c6
-rw-r--r--arch/x86/kernel/smpboot.c1
3 files changed, 13 insertions, 1 deletions
diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c
index 0f830e4f5675..c3dd64fabcf3 100644
--- a/arch/x86/kernel/apic.c
+++ b/arch/x86/kernel/apic.c
@@ -1126,6 +1126,11 @@ void __cpuinit setup_local_APIC(void)
1126 unsigned int value; 1126 unsigned int value;
1127 int i, j; 1127 int i, j;
1128 1128
1129 if (disable_apic) {
1130 disable_ioapic_setup();
1131 return;
1132 }
1133
1129#ifdef CONFIG_X86_32 1134#ifdef CONFIG_X86_32
1130 /* Pound the ESR really hard over the head with a big hammer - mbligh */ 1135 /* Pound the ESR really hard over the head with a big hammer - mbligh */
1131 if (lapic_is_integrated() && esr_disable) { 1136 if (lapic_is_integrated() && esr_disable) {
@@ -1566,11 +1571,11 @@ int apic_version[MAX_APICS];
1566 1571
1567int __init APIC_init_uniprocessor(void) 1572int __init APIC_init_uniprocessor(void)
1568{ 1573{
1569#ifdef CONFIG_X86_64
1570 if (disable_apic) { 1574 if (disable_apic) {
1571 pr_info("Apic disabled\n"); 1575 pr_info("Apic disabled\n");
1572 return -1; 1576 return -1;
1573 } 1577 }
1578#ifdef CONFIG_X86_64
1574 if (!cpu_has_apic) { 1579 if (!cpu_has_apic) {
1575 disable_apic = 1; 1580 disable_apic = 1;
1576 pr_info("Apic disabled by BIOS\n"); 1581 pr_info("Apic disabled by BIOS\n");
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c
index 1c4a1302536c..40747e58f305 100644
--- a/arch/x86/kernel/io_apic.c
+++ b/arch/x86/kernel/io_apic.c
@@ -3258,6 +3258,9 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms
3258 int err; 3258 int err;
3259 unsigned dest; 3259 unsigned dest;
3260 3260
3261 if (disable_apic)
3262 return -ENXIO;
3263
3261 cfg = irq_cfg(irq); 3264 cfg = irq_cfg(irq);
3262 err = assign_irq_vector(irq, cfg, TARGET_CPUS); 3265 err = assign_irq_vector(irq, cfg, TARGET_CPUS);
3263 if (err) 3266 if (err)
@@ -3726,6 +3729,9 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
3726 struct irq_cfg *cfg; 3729 struct irq_cfg *cfg;
3727 int err; 3730 int err;
3728 3731
3732 if (disable_apic)
3733 return -ENXIO;
3734
3729 cfg = irq_cfg(irq); 3735 cfg = irq_cfg(irq);
3730 err = assign_irq_vector(irq, cfg, TARGET_CPUS); 3736 err = assign_irq_vector(irq, cfg, TARGET_CPUS);
3731 if (!err) { 3737 if (!err) {
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index bb1a3b1fc87f..31f99ec2e0fd 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1125,6 +1125,7 @@ static int __init smp_sanity_check(unsigned max_cpus)
1125 printk(KERN_ERR "... forcing use of dummy APIC emulation." 1125 printk(KERN_ERR "... forcing use of dummy APIC emulation."
1126 "(tell your hw vendor)\n"); 1126 "(tell your hw vendor)\n");
1127 smpboot_clear_io_apic(); 1127 smpboot_clear_io_apic();
1128 disable_ioapic_setup();
1128 return -1; 1129 return -1;
1129 } 1130 }
1130 1131