|
@@ -171,6 +171,41 @@ struct apic_ops __read_mostly *apic_ops = &xapic_ops;
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(apic_ops);
|
|
|
|
|
|
+static void x2apic_wait_icr_idle(void)
|
|
|
+{
|
|
|
+ /* no need to wait for icr idle in x2apic */
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+static u32 safe_x2apic_wait_icr_idle(void)
|
|
|
+{
|
|
|
+ /* no need to wait for icr idle in x2apic */
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void x2apic_icr_write(u32 low, u32 id)
|
|
|
+{
|
|
|
+ wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low);
|
|
|
+}
|
|
|
+
|
|
|
+u64 x2apic_icr_read(void)
|
|
|
+{
|
|
|
+ unsigned long val;
|
|
|
+
|
|
|
+ rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val);
|
|
|
+ return val;
|
|
|
+}
|
|
|
+
|
|
|
+static struct apic_ops x2apic_ops = {
|
|
|
+ .read = native_apic_msr_read,
|
|
|
+ .write = native_apic_msr_write,
|
|
|
+ .write_atomic = native_apic_msr_write,
|
|
|
+ .icr_read = x2apic_icr_read,
|
|
|
+ .icr_write = x2apic_icr_write,
|
|
|
+ .wait_icr_idle = x2apic_wait_icr_idle,
|
|
|
+ .safe_wait_icr_idle = safe_x2apic_wait_icr_idle,
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* enable_NMI_through_LVT0 - enable NMI through local vector table 0
|
|
|
*/
|