|
@@ -155,6 +155,31 @@ static void icp_native_cause_ipi(int cpu, unsigned long data)
|
|
|
icp_native_set_qirr(cpu, IPI_PRIORITY);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Called when an interrupt is received on an off-line CPU to
|
|
|
+ * clear the interrupt, so that the CPU can go back to nap mode.
|
|
|
+ */
|
|
|
+void icp_native_flush_interrupt(void)
|
|
|
+{
|
|
|
+ unsigned int xirr = icp_native_get_xirr();
|
|
|
+ unsigned int vec = xirr & 0x00ffffff;
|
|
|
+
|
|
|
+ if (vec == XICS_IRQ_SPURIOUS)
|
|
|
+ return;
|
|
|
+ if (vec == XICS_IPI) {
|
|
|
+ /* Clear pending IPI */
|
|
|
+ int cpu = smp_processor_id();
|
|
|
+ kvmppc_set_host_ipi(cpu, 0);
|
|
|
+ icp_native_set_qirr(cpu, 0xff);
|
|
|
+ } else {
|
|
|
+ pr_err("XICS: hw interrupt 0x%x to offline cpu, disabling\n",
|
|
|
+ vec);
|
|
|
+ xics_mask_unknown_vec(vec);
|
|
|
+ }
|
|
|
+ /* EOI the interrupt */
|
|
|
+ icp_native_set_xirr(xirr);
|
|
|
+}
|
|
|
+
|
|
|
void xics_wake_cpu(int cpu)
|
|
|
{
|
|
|
icp_native_set_qirr(cpu, IPI_PRIORITY);
|