|
@@ -145,19 +145,13 @@ static int modern_apic(void)
|
|
|
return lapic_get_version() >= 0x14;
|
|
|
}
|
|
|
|
|
|
-void apic_icr_write(u32 low, u32 id)
|
|
|
-{
|
|
|
- apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(id));
|
|
|
- apic_write_around(APIC_ICR, low);
|
|
|
-}
|
|
|
-
|
|
|
-void apic_wait_icr_idle(void)
|
|
|
+void xapic_wait_icr_idle(void)
|
|
|
{
|
|
|
while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
|
|
|
cpu_relax();
|
|
|
}
|
|
|
|
|
|
-u32 safe_apic_wait_icr_idle(void)
|
|
|
+u32 safe_xapic_wait_icr_idle(void)
|
|
|
{
|
|
|
u32 send_status;
|
|
|
int timeout;
|
|
@@ -173,6 +167,35 @@ u32 safe_apic_wait_icr_idle(void)
|
|
|
return send_status;
|
|
|
}
|
|
|
|
|
|
+void xapic_icr_write(u32 low, u32 id)
|
|
|
+{
|
|
|
+ apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(id));
|
|
|
+ apic_write_around(APIC_ICR, low);
|
|
|
+}
|
|
|
+
|
|
|
+u64 xapic_icr_read(void)
|
|
|
+{
|
|
|
+ u32 icr1, icr2;
|
|
|
+
|
|
|
+ icr2 = apic_read(APIC_ICR2);
|
|
|
+ icr1 = apic_read(APIC_ICR);
|
|
|
+
|
|
|
+ return icr1 | ((u64)icr2 << 32);
|
|
|
+}
|
|
|
+
|
|
|
+static struct apic_ops xapic_ops = {
|
|
|
+ .read = native_apic_mem_read,
|
|
|
+ .write = native_apic_mem_write,
|
|
|
+ .write_atomic = native_apic_mem_write_atomic,
|
|
|
+ .icr_read = xapic_icr_read,
|
|
|
+ .icr_write = xapic_icr_write,
|
|
|
+ .wait_icr_idle = xapic_wait_icr_idle,
|
|
|
+ .safe_wait_icr_idle = safe_xapic_wait_icr_idle,
|
|
|
+};
|
|
|
+
|
|
|
+struct apic_ops __read_mostly *apic_ops = &xapic_ops;
|
|
|
+EXPORT_SYMBOL_GPL(apic_ops);
|
|
|
+
|
|
|
/**
|
|
|
* enable_NMI_through_LVT0 - enable NMI through local vector table 0
|
|
|
*/
|