|
@@ -256,11 +256,41 @@ static int cpu_psci_cpu_boot(unsigned int cpu)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+static int cpu_psci_cpu_disable(unsigned int cpu)
|
|
|
+{
|
|
|
+ /* Fail early if we don't have CPU_OFF support */
|
|
|
+ if (!psci_ops.cpu_off)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void cpu_psci_cpu_die(unsigned int cpu)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ /*
|
|
|
+ * There are no known implementations of PSCI actually using the
|
|
|
+ * power state field, pass a sensible default for now.
|
|
|
+ */
|
|
|
+ struct psci_power_state state = {
|
|
|
+ .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
|
|
|
+ };
|
|
|
+
|
|
|
+ ret = psci_ops.cpu_off(state);
|
|
|
+
|
|
|
+ pr_crit("psci: unable to power off CPU%u (%d)\n", cpu, ret);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
const struct cpu_operations cpu_psci_ops = {
|
|
|
.name = "psci",
|
|
|
.cpu_init = cpu_psci_cpu_init,
|
|
|
.cpu_prepare = cpu_psci_cpu_prepare,
|
|
|
.cpu_boot = cpu_psci_cpu_boot,
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+ .cpu_disable = cpu_psci_cpu_disable,
|
|
|
+ .cpu_die = cpu_psci_cpu_die,
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
#endif
|