|
@@ -647,29 +647,30 @@ static void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void xics_teardown_cpu(void)
|
|
|
|
|
|
+void xics_teardown_cpu(int secondary)
|
|
{
|
|
{
|
|
int cpu = smp_processor_id();
|
|
int cpu = smp_processor_id();
|
|
- int status;
|
|
|
|
|
|
|
|
ops->cppr_info(cpu, 0x00);
|
|
ops->cppr_info(cpu, 0x00);
|
|
iosync();
|
|
iosync();
|
|
|
|
|
|
/*
|
|
/*
|
|
- * we need to EOI the IPI if we got here from kexec down IPI
|
|
|
|
- *
|
|
|
|
- * xics doesn't care if we duplicate an EOI as long as we
|
|
|
|
- * don't EOI and raise priority.
|
|
|
|
- *
|
|
|
|
- * probably need to check all the other interrupts too
|
|
|
|
- * should we be flagging idle loop instead?
|
|
|
|
- * or creating some task to be scheduled?
|
|
|
|
|
|
+ * Some machines need to have at least one cpu in the GIQ,
|
|
|
|
+ * so leave the master cpu in the group.
|
|
*/
|
|
*/
|
|
- ops->xirr_info_set(cpu, XICS_IPI);
|
|
|
|
-
|
|
|
|
- status = rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE,
|
|
|
|
- (1UL << interrupt_server_size) - 1 - default_distrib_server, 0);
|
|
|
|
- WARN_ON(status != 0);
|
|
|
|
|
|
+ if (secondary) {
|
|
|
|
+ /*
|
|
|
|
+ * we need to EOI the IPI if we got here from kexec down IPI
|
|
|
|
+ *
|
|
|
|
+ * probably need to check all the other interrupts too
|
|
|
|
+ * should we be flagging idle loop instead?
|
|
|
|
+ * or creating some task to be scheduled?
|
|
|
|
+ */
|
|
|
|
+ ops->xirr_info_set(cpu, XICS_IPI);
|
|
|
|
+ rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE,
|
|
|
|
+ (1UL << interrupt_server_size) - 1 -
|
|
|
|
+ default_distrib_server, 0);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
#ifdef CONFIG_HOTPLUG_CPU
|