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>
This commit is contained in:
parent
04e1ba8521
commit
1c69524c2e
@ -774,6 +774,13 @@ void __cpuinit setup_local_APIC(void)
|
||||
value = APIC_DM_NMI | APIC_LVT_MASKED;
|
||||
apic_write(APIC_LVT1, value);
|
||||
|
||||
/*
|
||||
* Now enable IO-APICs, actually call clear_IO_APIC
|
||||
* We need clear_IO_APIC before enabling vector on BP
|
||||
*/
|
||||
if (!smp_processor_id() && !skip_ioapic_setup && nr_ioapics)
|
||||
enable_IO_APIC();
|
||||
|
||||
{
|
||||
unsigned oldvalue;
|
||||
maxlvt = lapic_get_maxlvt();
|
||||
|
@ -1172,7 +1172,7 @@ void __apicdebuginit print_PIC(void)
|
||||
|
||||
#endif /* 0 */
|
||||
|
||||
static void __init enable_IO_APIC(void)
|
||||
void __init enable_IO_APIC(void)
|
||||
{
|
||||
union IO_APIC_reg_01 reg_01;
|
||||
int i8259_apic, i8259_pin;
|
||||
@ -1789,7 +1789,10 @@ __setup("no_timer_check", notimercheck);
|
||||
|
||||
void __init setup_IO_APIC(void)
|
||||
{
|
||||
enable_IO_APIC();
|
||||
|
||||
/*
|
||||
* calling enable_IO_APIC() is moved to setup_local_APIC for BP
|
||||
*/
|
||||
|
||||
if (acpi_ioapic)
|
||||
io_apic_irqs = ~0; /* all IRQs go through IOAPIC */
|
||||
|
@ -135,6 +135,7 @@ extern void init_8259A(int aeoi);
|
||||
extern void send_IPI_self(int vector);
|
||||
extern void init_VISWS_APIC_irqs(void);
|
||||
extern void setup_IO_APIC(void);
|
||||
extern void enable_IO_APIC(void);
|
||||
extern void disable_IO_APIC(void);
|
||||
extern void print_IO_APIC(void);
|
||||
extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
|
||||
|
Loading…
Reference in New Issue
Block a user