arm64: kernel: remove ARM64_CPU_SUSPEND config option
authorLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Mon, 26 Jan 2015 18:33:44 +0000 (18:33 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 27 Jan 2015 11:35:33 +0000 (11:35 +0000)
ARM64_CPU_SUSPEND config option was introduced to make code providing
context save/restore selectable only on platforms requiring power
management capabilities.

Currently ARM64_CPU_SUSPEND depends on the PM_SLEEP config option which
in turn is set by the SUSPEND config option.

The introduction of CPU_IDLE for arm64 requires that code configured
by ARM64_CPU_SUSPEND (context save/restore) should be compiled in
in order to enable the CPU idle driver to rely on CPU operations
carrying out context save/restore.

The ARM64_CPUIDLE config option (ARM64 generic idle driver) is therefore
forced to select ARM64_CPU_SUSPEND, even if there may be (ie PM_SLEEP)
failed dependencies, which is not a clean way of handling the kernel
configuration option.

For these reasons, this patch removes the ARM64_CPU_SUSPEND config option
and makes the context save/restore dependent on CPU_PM, which is selected
whenever either SUSPEND or CPU_IDLE are configured, cleaning up dependencies
in the process.

This way, code previously configured through ARM64_CPU_SUSPEND is
compiled in whenever a power management subsystem requires it to be
present in the kernel (SUSPEND || CPU_IDLE), which is the behaviour
expected on ARM64 kernels.

The cpu_suspend and cpu_init_idle CPU operations are added only if
CPU_IDLE is selected, since they are CPU_IDLE specific methods and
should be grouped and defined accordingly.

PSCI CPU operations are updated to reflect the introduced changes.

Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
13 files changed:
arch/arm64/Kconfig
arch/arm64/include/asm/cpu_ops.h
arch/arm64/include/asm/cpuidle.h
arch/arm64/include/asm/suspend.h
arch/arm64/kernel/Makefile
arch/arm64/kernel/asm-offsets.c
arch/arm64/kernel/cpuidle.c
arch/arm64/kernel/hw_breakpoint.c
arch/arm64/kernel/psci.c
arch/arm64/kernel/suspend.c
arch/arm64/mm/proc.S
drivers/cpuidle/Kconfig.arm64
drivers/cpuidle/cpuidle-arm64.c

index 21a59bf37145e75dbcc851f60d0a4e2da0686a16..d3f7e49412316fb7fe8d1e9bde6ac10a0a599202 100644 (file)
@@ -642,9 +642,6 @@ source "kernel/power/Kconfig"
 config ARCH_SUSPEND_POSSIBLE
        def_bool y
 
-config ARM64_CPU_SUSPEND
-       def_bool PM_SLEEP
-
 endmenu
 
 menu "CPU Power Management"
index 6f8e2ef9094a78929f21cf098d7ae6930c3222b9..da301ee7395c85a11329d246867a008bbb3bc7c2 100644 (file)
@@ -28,8 +28,6 @@ struct device_node;
  *             enable-method property.
  * @cpu_init:  Reads any data necessary for a specific enable-method from the
  *             devicetree, for a given cpu node and proposed logical id.
- * @cpu_init_idle: Reads any data necessary to initialize CPU idle states from
- *             devicetree, for a given cpu node and proposed logical id.
  * @cpu_prepare: Early one-time preparation step for a cpu. If there is a
  *             mechanism for doing so, tests whether it is possible to boot
  *             the given CPU.
@@ -42,6 +40,8 @@ struct device_node;
  * @cpu_die:   Makes a cpu leave the kernel. Must not fail. Called from the
  *             cpu being killed.
  * @cpu_kill:  Ensures a cpu has left the kernel. Called from another cpu.
+ * @cpu_init_idle: Reads any data necessary to initialize CPU idle states from
+ *             devicetree, for a given cpu node and proposed logical id.
  * @cpu_suspend: Suspends a cpu and saves the required context. May fail owing
  *               to wrong parameters or error conditions. Called from the
  *               CPU being suspended. Must be called with IRQs disabled.
@@ -49,7 +49,6 @@ struct device_node;
 struct cpu_operations {
        const char      *name;
        int             (*cpu_init)(struct device_node *, unsigned int);
-       int             (*cpu_init_idle)(struct device_node *, unsigned int);
        int             (*cpu_prepare)(unsigned int);
        int             (*cpu_boot)(unsigned int);
        void            (*cpu_postboot)(void);
@@ -58,7 +57,8 @@ struct cpu_operations {
        void            (*cpu_die)(unsigned int cpu);
        int             (*cpu_kill)(unsigned int cpu);
 #endif
-#ifdef CONFIG_ARM64_CPU_SUSPEND
+#ifdef CONFIG_CPU_IDLE
+       int             (*cpu_init_idle)(struct device_node *, unsigned int);
        int             (*cpu_suspend)(unsigned long);
 #endif
 };
index b52a9932e2b1face66440bd754acdcb1e568a15c..0710654631e789121f7b0d2247b485ebf585685a 100644 (file)
@@ -3,11 +3,17 @@
 
 #ifdef CONFIG_CPU_IDLE
 extern int cpu_init_idle(unsigned int cpu);
+extern int cpu_suspend(unsigned long arg);
 #else
 static inline int cpu_init_idle(unsigned int cpu)
 {
        return -EOPNOTSUPP;
 }
+
+static inline int cpu_suspend(unsigned long arg)
+{
+       return -EOPNOTSUPP;
+}
 #endif
 
 #endif
index 456d67c1f0fac270cb0438d62fd35a48bc70e1c8..003802f58963369e86c666ad9f5546bdee9ff100 100644 (file)
@@ -23,6 +23,4 @@ struct sleep_save_sp {
 
 extern int __cpu_suspend(unsigned long arg, int (*fn)(unsigned long));
 extern void cpu_resume(void);
-extern int cpu_suspend(unsigned long);
-
 #endif
index 3b3b1cd3e7f0181b2a41372aa4da805fe5de354d..bef04afd603190135972256e52981b0889b047bf 100644 (file)
@@ -27,7 +27,7 @@ arm64-obj-$(CONFIG_SMP)                       += smp.o smp_spin_table.o topology.o
 arm64-obj-$(CONFIG_PERF_EVENTS)                += perf_regs.o
 arm64-obj-$(CONFIG_HW_PERF_EVENTS)     += perf_event.o
 arm64-obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
-arm64-obj-$(CONFIG_ARM64_CPU_SUSPEND)  += sleep.o suspend.o
+arm64-obj-$(CONFIG_CPU_PM)             += sleep.o suspend.o
 arm64-obj-$(CONFIG_CPU_IDLE)           += cpuidle.o
 arm64-obj-$(CONFIG_JUMP_LABEL)         += jump_label.o
 arm64-obj-$(CONFIG_KGDB)               += kgdb.o
index 9a9fce090d58fd1fd8741bfabbc84672066ea448..a2ae19403abb0566c5902bb1ece74794a32c115b 100644 (file)
@@ -152,7 +152,7 @@ int main(void)
   DEFINE(KVM_VTTBR,            offsetof(struct kvm, arch.vttbr));
   DEFINE(KVM_VGIC_VCTRL,       offsetof(struct kvm, arch.vgic.vctrl_base));
 #endif
-#ifdef CONFIG_ARM64_CPU_SUSPEND
+#ifdef CONFIG_CPU_PM
   DEFINE(CPU_SUSPEND_SZ,       sizeof(struct cpu_suspend_ctx));
   DEFINE(CPU_CTX_SP,           offsetof(struct cpu_suspend_ctx, sp));
   DEFINE(MPIDR_HASH_MASK,      offsetof(struct mpidr_hash, mask));
index 19d17f51db37a798c797b125795844b7a5d99e92..5c0896647fd14e83e3d410e450e7085894c24484 100644 (file)
@@ -29,3 +29,23 @@ int cpu_init_idle(unsigned int cpu)
        of_node_put(cpu_node);
        return ret;
 }
+
+/**
+ * cpu_suspend() - function to enter a low-power idle state
+ * @arg: argument to pass to CPU suspend operations
+ *
+ * Return: 0 on success, -EOPNOTSUPP if CPU suspend hook not initialized, CPU
+ * operations back-end error code otherwise.
+ */
+int cpu_suspend(unsigned long arg)
+{
+       int cpu = smp_processor_id();
+
+       /*
+        * If cpu_ops have not been registered or suspend
+        * has not been initialized, cpu_suspend call fails early.
+        */
+       if (!cpu_ops[cpu] || !cpu_ops[cpu]->cpu_suspend)
+               return -EOPNOTSUPP;
+       return cpu_ops[cpu]->cpu_suspend(arg);
+}
index df1cf15377b44cbc2647ceaafdd4745a47206f9c..98bbe06e469c91faf72218b95a52d3d429b0502a 100644 (file)
@@ -894,7 +894,7 @@ static struct notifier_block hw_breakpoint_reset_nb = {
        .notifier_call = hw_breakpoint_reset_notify,
 };
 
-#ifdef CONFIG_ARM64_CPU_SUSPEND
+#ifdef CONFIG_CPU_PM
 extern void cpu_suspend_set_dbg_restorer(void (*hw_bp_restore)(void *));
 #else
 static inline void cpu_suspend_set_dbg_restorer(void (*hw_bp_restore)(void *))
index f1dbca7d5c96cd886d27a0f3e690bb2386766aa9..3425f311c49ed99588998d3a9b42e035bf592d84 100644 (file)
@@ -540,8 +540,6 @@ const struct cpu_operations cpu_psci_ops = {
        .name           = "psci",
 #ifdef CONFIG_CPU_IDLE
        .cpu_init_idle  = cpu_psci_cpu_init_idle,
-#endif
-#ifdef CONFIG_ARM64_CPU_SUSPEND
        .cpu_suspend    = cpu_psci_cpu_suspend,
 #endif
 #ifdef CONFIG_SMP
index 2d6b6065fe7f4ea7ceaf9e728066edb23dae5a0b..d7daf45ae7a25307f8c8007c7b8240d9405352fc 100644 (file)
@@ -1,7 +1,6 @@
 #include <linux/percpu.h>
 #include <linux/slab.h>
 #include <asm/cacheflush.h>
-#include <asm/cpu_ops.h>
 #include <asm/debug-monitors.h>
 #include <asm/pgtable.h>
 #include <asm/memory.h>
@@ -51,26 +50,6 @@ void __init cpu_suspend_set_dbg_restorer(void (*hw_bp_restore)(void *))
        hw_breakpoint_restore = hw_bp_restore;
 }
 
-/**
- * cpu_suspend() - function to enter a low-power state
- * @arg: argument to pass to CPU suspend operations
- *
- * Return: 0 on success, -EOPNOTSUPP if CPU suspend hook not initialized, CPU
- * operations back-end error code otherwise.
- */
-int cpu_suspend(unsigned long arg)
-{
-       int cpu = smp_processor_id();
-
-       /*
-        * If cpu_ops have not been registered or suspend
-        * has not been initialized, cpu_suspend call fails early.
-        */
-       if (!cpu_ops[cpu] || !cpu_ops[cpu]->cpu_suspend)
-               return -EOPNOTSUPP;
-       return cpu_ops[cpu]->cpu_suspend(arg);
-}
-
 /*
  * __cpu_suspend
  *
index b98fc8ce6a161be899a9c7a09842efdef1c0c75c..28eebfb6af763db14be54594fb0ec39f7a747142 100644 (file)
@@ -102,7 +102,7 @@ ENTRY(cpu_do_idle)
        ret
 ENDPROC(cpu_do_idle)
 
-#ifdef CONFIG_ARM64_CPU_SUSPEND
+#ifdef CONFIG_CPU_PM
 /**
  * cpu_do_suspend - save CPU registers context
  *
index d0a08ed1b2ee62823e3f457a1ebf4905a41332f4..6effb3656735b94fae6ec322fecbfee242241883 100644 (file)
@@ -4,7 +4,6 @@
 
 config ARM64_CPUIDLE
        bool "Generic ARM64 CPU idle Driver"
-       select ARM64_CPU_SUSPEND
        select DT_IDLE_STATES
        help
          Select this to enable generic cpuidle driver for ARM64.
index 80704b931ba48e42ec2de9aa9175298c2e2b007d..39a2c62716c3b486b55d117eaae6d3188dd478b9 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/of.h>
 
 #include <asm/cpuidle.h>
-#include <asm/suspend.h>
 
 #include "dt_idle_states.h"