aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYinghai Lu <Yinghai.Lu@Sun.COM>2008-01-30 07:30:39 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-30 07:30:39 -0500
commit1c69524c2e5b83e52a098ebdeb4a8b52169f6a03 (patch)
tree36549be4486756386782a3405c6afdad45aaa548
parent04e1ba852132c9ad006affcd5b8c8606295170b0 (diff)
x86: clear IO_APIC before enabing apic error vector.
4 socket quad core, 8 socket quad core will do apic ID lifting for BSP. But io-apic regs for ExtINT still use 0 as dest. so when we enable apic error vector in BSP, we will get one APIC error. CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line) CPU: L2 Cache: 512K (64 bytes/line) CPU 0/4 -> Node 0 CPU: Physical Processor ID: 1 CPU: Processor Core ID: 0 SMP alternatives: switching to UP code ACPI: Core revision 20070126 enabled ExtINT on CPU#0 ESR value after enabling vector: 00000000, after 0000000c APIC error on CPU0: 0c(08) ENABLING IO-APIC IRQs Synchronizing Arb IDs. So move enable_IO_APIC from setup_IO_APIC into setup_local_APIC and call it before enabling the ACPI error vector. [ tglx: arch/x86 adaptation ] Signed-off-by: Yinghai Lu <yinghai.lu@sun.com> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--arch/x86/kernel/apic_64.c7
-rw-r--r--arch/x86/kernel/io_apic_64.c7
-rw-r--r--include/asm-x86/hw_irq_64.h1
3 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c
index 915808bd8a2a..994298bf4921 100644
--- a/arch/x86/kernel/apic_64.c
+++ b/arch/x86/kernel/apic_64.c
@@ -774,6 +774,13 @@ void __cpuinit setup_local_APIC(void)
774 value = APIC_DM_NMI | APIC_LVT_MASKED; 774 value = APIC_DM_NMI | APIC_LVT_MASKED;
775 apic_write(APIC_LVT1, value); 775 apic_write(APIC_LVT1, value);
776 776
777 /*
778 * Now enable IO-APICs, actually call clear_IO_APIC
779 * We need clear_IO_APIC before enabling vector on BP
780 */
781 if (!smp_processor_id() && !skip_ioapic_setup && nr_ioapics)
782 enable_IO_APIC();
783
777 { 784 {
778 unsigned oldvalue; 785 unsigned oldvalue;
779 maxlvt = lapic_get_maxlvt(); 786 maxlvt = lapic_get_maxlvt();
diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c
index 3e471d0fb150..4ef85a3b3f9f 100644
--- a/arch/x86/kernel/io_apic_64.c
+++ b/arch/x86/kernel/io_apic_64.c
@@ -1172,7 +1172,7 @@ void __apicdebuginit print_PIC(void)
1172 1172
1173#endif /* 0 */ 1173#endif /* 0 */
1174 1174
1175static void __init enable_IO_APIC(void) 1175void __init enable_IO_APIC(void)
1176{ 1176{
1177 union IO_APIC_reg_01 reg_01; 1177 union IO_APIC_reg_01 reg_01;
1178 int i8259_apic, i8259_pin; 1178 int i8259_apic, i8259_pin;
@@ -1789,7 +1789,10 @@ __setup("no_timer_check", notimercheck);
1789 1789
1790void __init setup_IO_APIC(void) 1790void __init setup_IO_APIC(void)
1791{ 1791{
1792 enable_IO_APIC(); 1792
1793 /*
1794 * calling enable_IO_APIC() is moved to setup_local_APIC for BP
1795 */
1793 1796
1794 if (acpi_ioapic) 1797 if (acpi_ioapic)
1795 io_apic_irqs = ~0; /* all IRQs go through IOAPIC */ 1798 io_apic_irqs = ~0; /* all IRQs go through IOAPIC */
diff --git a/include/asm-x86/hw_irq_64.h b/include/asm-x86/hw_irq_64.h
index a470d59da678..a346159b6ac3 100644
--- a/include/asm-x86/hw_irq_64.h
+++ b/include/asm-x86/hw_irq_64.h
@@ -135,6 +135,7 @@ extern void init_8259A(int aeoi);
135extern void send_IPI_self(int vector); 135extern void send_IPI_self(int vector);
136extern void init_VISWS_APIC_irqs(void); 136extern void init_VISWS_APIC_irqs(void);
137extern void setup_IO_APIC(void); 137extern void setup_IO_APIC(void);
138extern void enable_IO_APIC(void);
138extern void disable_IO_APIC(void); 139extern void disable_IO_APIC(void);
139extern void print_IO_APIC(void); 140extern void print_IO_APIC(void);
140extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn); 141extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);