|
@@ -237,3 +237,47 @@ void restore_processor_state(void)
|
|
|
#ifdef CONFIG_X86_32
|
|
|
EXPORT_SYMBOL(restore_processor_state);
|
|
|
#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * When bsp_check() is called in hibernate and suspend, cpu hotplug
|
|
|
+ * is disabled already. So it's unnessary to handle race condition between
|
|
|
+ * cpumask query and cpu hotplug.
|
|
|
+ */
|
|
|
+static int bsp_check(void)
|
|
|
+{
|
|
|
+ if (cpumask_first(cpu_online_mask) != 0) {
|
|
|
+ pr_warn("CPU0 is offline.\n");
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int bsp_pm_callback(struct notifier_block *nb, unsigned long action,
|
|
|
+ void *ptr)
|
|
|
+{
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ switch (action) {
|
|
|
+ case PM_SUSPEND_PREPARE:
|
|
|
+ case PM_HIBERNATION_PREPARE:
|
|
|
+ ret = bsp_check();
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return notifier_from_errno(ret);
|
|
|
+}
|
|
|
+
|
|
|
+static int __init bsp_pm_check_init(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Set this bsp_pm_callback as lower priority than
|
|
|
+ * cpu_hotplug_pm_callback. So cpu_hotplug_pm_callback will be called
|
|
|
+ * earlier to disable cpu hotplug before bsp online check.
|
|
|
+ */
|
|
|
+ pm_notifier(bsp_pm_callback, -INT_MAX);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+core_initcall(bsp_pm_check_init);
|