|
@@ -773,8 +773,6 @@ void __init init_bsp_APIC(void)
|
|
|
if (smp_found_config || !cpu_has_apic)
|
|
|
return;
|
|
|
|
|
|
- value = apic_read(APIC_LVR);
|
|
|
-
|
|
|
/*
|
|
|
* Do not trust the local APIC being empty at bootup.
|
|
|
*/
|
|
@@ -786,7 +784,15 @@ void __init init_bsp_APIC(void)
|
|
|
value = apic_read(APIC_SPIV);
|
|
|
value &= ~APIC_VECTOR_MASK;
|
|
|
value |= APIC_SPIV_APIC_ENABLED;
|
|
|
- value |= APIC_SPIV_FOCUS_DISABLED;
|
|
|
+
|
|
|
+#ifdef CONFIG_X86_32
|
|
|
+ /* This bit is reserved on P4/Xeon and should be cleared */
|
|
|
+ if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
|
|
|
+ (boot_cpu_data.x86 == 15))
|
|
|
+ value &= ~APIC_SPIV_FOCUS_DISABLED;
|
|
|
+ else
|
|
|
+#endif
|
|
|
+ value |= APIC_SPIV_FOCUS_DISABLED;
|
|
|
value |= SPURIOUS_APIC_VECTOR;
|
|
|
apic_write(APIC_SPIV, value);
|
|
|
|
|
@@ -795,6 +801,8 @@ void __init init_bsp_APIC(void)
|
|
|
*/
|
|
|
apic_write(APIC_LVT0, APIC_DM_EXTINT);
|
|
|
value = APIC_DM_NMI;
|
|
|
+ if (!lapic_is_integrated()) /* 82489DX */
|
|
|
+ value |= APIC_LVT_LEVEL_TRIGGER;
|
|
|
apic_write(APIC_LVT1, value);
|
|
|
}
|
|
|
|