|
@@ -232,6 +232,24 @@ static int modern_apic(void)
|
|
|
return lapic_get_version() >= 0x14;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * bare function to substitute write operation
|
|
|
+ * and it's _that_ fast :)
|
|
|
+ */
|
|
|
+void native_apic_write_dummy(u32 reg, u32 v)
|
|
|
+{
|
|
|
+ WARN_ON_ONCE((cpu_has_apic || !disable_apic));
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * right after this call apic->write doesn't do anything
|
|
|
+ * note that there is no restore operation it works one way
|
|
|
+ */
|
|
|
+void apic_disable(void)
|
|
|
+{
|
|
|
+ apic->write = native_apic_write_dummy;
|
|
|
+}
|
|
|
+
|
|
|
void native_apic_wait_icr_idle(void)
|
|
|
{
|
|
|
while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
|
|
@@ -1582,6 +1600,12 @@ void __init init_apic_mappings(void)
|
|
|
*/
|
|
|
if (boot_cpu_physical_apicid == -1U)
|
|
|
boot_cpu_physical_apicid = read_apic_id();
|
|
|
+
|
|
|
+ /* lets check if we may to NOP'ify apic operations */
|
|
|
+ if (!cpu_has_apic) {
|
|
|
+ pr_info("APIC: disable apic facility\n");
|
|
|
+ apic_disable();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|