mirror of https://gitee.com/openkylin/linux.git
x86: apic - unify disconnect_bsp_APIC
- just #ifdef added Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
c40aaec686
commit
c177b0bc03
|
@ -1420,6 +1420,7 @@ void __init connect_bsp_APIC(void)
|
|||
*/
|
||||
void disconnect_bsp_APIC(int virt_wire_setup)
|
||||
{
|
||||
#ifdef CONFIG_X86_32
|
||||
if (pic_mode) {
|
||||
/*
|
||||
* Put the board back into PIC mode (has an effect only on
|
||||
|
@ -1431,47 +1432,48 @@ void disconnect_bsp_APIC(int virt_wire_setup)
|
|||
"entering PIC mode.\n");
|
||||
outb(0x70, 0x22);
|
||||
outb(0x00, 0x23);
|
||||
} else {
|
||||
/* Go back to Virtual Wire compatibility mode */
|
||||
unsigned long value;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* For the spurious interrupt use vector F, and enable it */
|
||||
value = apic_read(APIC_SPIV);
|
||||
value &= ~APIC_VECTOR_MASK;
|
||||
value |= APIC_SPIV_APIC_ENABLED;
|
||||
value |= 0xf;
|
||||
apic_write(APIC_SPIV, value);
|
||||
/* Go back to Virtual Wire compatibility mode */
|
||||
unsigned int value;
|
||||
|
||||
if (!virt_wire_setup) {
|
||||
/*
|
||||
* For LVT0 make it edge triggered, active high,
|
||||
* external and enabled
|
||||
*/
|
||||
value = apic_read(APIC_LVT0);
|
||||
value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
|
||||
APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
|
||||
APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
|
||||
value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
|
||||
value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXTINT);
|
||||
apic_write(APIC_LVT0, value);
|
||||
} else {
|
||||
/* Disable LVT0 */
|
||||
apic_write(APIC_LVT0, APIC_LVT_MASKED);
|
||||
}
|
||||
/* For the spurious interrupt use vector F, and enable it */
|
||||
value = apic_read(APIC_SPIV);
|
||||
value &= ~APIC_VECTOR_MASK;
|
||||
value |= APIC_SPIV_APIC_ENABLED;
|
||||
value |= 0xf;
|
||||
apic_write(APIC_SPIV, value);
|
||||
|
||||
if (!virt_wire_setup) {
|
||||
/*
|
||||
* For LVT1 make it edge triggered, active high, nmi and
|
||||
* enabled
|
||||
* For LVT0 make it edge triggered, active high,
|
||||
* external and enabled
|
||||
*/
|
||||
value = apic_read(APIC_LVT1);
|
||||
value &= ~(
|
||||
APIC_MODE_MASK | APIC_SEND_PENDING |
|
||||
value = apic_read(APIC_LVT0);
|
||||
value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
|
||||
APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
|
||||
APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
|
||||
value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
|
||||
value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
|
||||
apic_write(APIC_LVT1, value);
|
||||
value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXTINT);
|
||||
apic_write(APIC_LVT0, value);
|
||||
} else {
|
||||
/* Disable LVT0 */
|
||||
apic_write(APIC_LVT0, APIC_LVT_MASKED);
|
||||
}
|
||||
|
||||
/*
|
||||
* For LVT1 make it edge triggered, active high,
|
||||
* nmi and enabled
|
||||
*/
|
||||
value = apic_read(APIC_LVT1);
|
||||
value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
|
||||
APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
|
||||
APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
|
||||
value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
|
||||
value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
|
||||
apic_write(APIC_LVT1, value);
|
||||
}
|
||||
|
||||
void __cpuinit generic_processor_info(int apicid, int version)
|
||||
|
|
|
@ -1348,8 +1348,24 @@ void __init connect_bsp_APIC(void)
|
|||
*/
|
||||
void disconnect_bsp_APIC(int virt_wire_setup)
|
||||
{
|
||||
#ifdef CONFIG_X86_32
|
||||
if (pic_mode) {
|
||||
/*
|
||||
* Put the board back into PIC mode (has an effect only on
|
||||
* certain older boards). Note that APIC interrupts, including
|
||||
* IPIs, won't work beyond this point! The only exception are
|
||||
* INIT IPIs.
|
||||
*/
|
||||
apic_printk(APIC_VERBOSE, "disabling APIC mode, "
|
||||
"entering PIC mode.\n");
|
||||
outb(0x70, 0x22);
|
||||
outb(0x00, 0x23);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Go back to Virtual Wire compatibility mode */
|
||||
unsigned long value;
|
||||
unsigned int value;
|
||||
|
||||
/* For the spurious interrupt use vector F, and enable it */
|
||||
value = apic_read(APIC_SPIV);
|
||||
|
@ -1375,7 +1391,10 @@ void disconnect_bsp_APIC(int virt_wire_setup)
|
|||
apic_write(APIC_LVT0, APIC_LVT_MASKED);
|
||||
}
|
||||
|
||||
/* For LVT1 make it edge triggered, active high, nmi and enabled */
|
||||
/*
|
||||
* For LVT1 make it edge triggered, active high,
|
||||
* nmi and enabled
|
||||
*/
|
||||
value = apic_read(APIC_LVT1);
|
||||
value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
|
||||
APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
|
||||
|
|
Loading…
Reference in New Issue