diff options
author | Mark Rutland <mark.rutland@arm.com> | 2013-10-24 15:30:14 -0400 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2013-10-25 06:33:19 -0400 |
commit | 00ef54bb97389bfe8894272f48496f4191aae946 (patch) | |
tree | f12fb227f252f52e50f52599c84282ad4fa665bd /arch/arm64 | |
parent | 4fcd6e1416b0424f94ede03cb322a323a640bf4b (diff) |
arm64: unify smp_psci.c and psci.c
The functions in psci.c are only used from smp_psci.c, and smp_psci
cannot function without psci.c. Additionally psci.c is built when !SMP,
where it's expected that cpu_suspend may be useful.
This patch unifies the two files, removing pointless duplication and
paving the way for PSCI support in UP systems.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64')
-rw-r--r-- | arch/arm64/include/asm/psci.h | 19 | ||||
-rw-r--r-- | arch/arm64/kernel/Makefile | 2 | ||||
-rw-r--r-- | arch/arm64/kernel/psci.c | 54 | ||||
-rw-r--r-- | arch/arm64/kernel/smp_psci.c | 53 |
4 files changed, 54 insertions, 74 deletions
diff --git a/arch/arm64/include/asm/psci.h b/arch/arm64/include/asm/psci.h index 0604237ecd99..e5312ea0ec1a 100644 --- a/arch/arm64/include/asm/psci.h +++ b/arch/arm64/include/asm/psci.h | |||
@@ -14,25 +14,6 @@ | |||
14 | #ifndef __ASM_PSCI_H | 14 | #ifndef __ASM_PSCI_H |
15 | #define __ASM_PSCI_H | 15 | #define __ASM_PSCI_H |
16 | 16 | ||
17 | #define PSCI_POWER_STATE_TYPE_STANDBY 0 | ||
18 | #define PSCI_POWER_STATE_TYPE_POWER_DOWN 1 | ||
19 | |||
20 | struct psci_power_state { | ||
21 | u16 id; | ||
22 | u8 type; | ||
23 | u8 affinity_level; | ||
24 | }; | ||
25 | |||
26 | struct psci_operations { | ||
27 | int (*cpu_suspend)(struct psci_power_state state, | ||
28 | unsigned long entry_point); | ||
29 | int (*cpu_off)(struct psci_power_state state); | ||
30 | int (*cpu_on)(unsigned long cpuid, unsigned long entry_point); | ||
31 | int (*migrate)(unsigned long cpuid); | ||
32 | }; | ||
33 | |||
34 | extern struct psci_operations psci_ops; | ||
35 | |||
36 | int psci_init(void); | 17 | int psci_init(void); |
37 | 18 | ||
38 | #endif /* __ASM_PSCI_H */ | 19 | #endif /* __ASM_PSCI_H */ |
diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7b4b564961d4..75a90c15b30b 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile | |||
@@ -14,7 +14,7 @@ arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ | |||
14 | arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ | 14 | arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ |
15 | sys_compat.o | 15 | sys_compat.o |
16 | arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o | 16 | arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o |
17 | arm64-obj-$(CONFIG_SMP) += smp.o smp_spin_table.o smp_psci.o | 17 | arm64-obj-$(CONFIG_SMP) += smp.o smp_spin_table.o |
18 | arm64-obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o | 18 | arm64-obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o |
19 | arm64-obj-$(CONFIG_HAVE_HW_BREAKPOINT)+= hw_breakpoint.o | 19 | arm64-obj-$(CONFIG_HAVE_HW_BREAKPOINT)+= hw_breakpoint.o |
20 | arm64-obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 20 | arm64-obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c index 14f73c445ff5..368b78788cb5 100644 --- a/arch/arm64/kernel/psci.c +++ b/arch/arm64/kernel/psci.c | |||
@@ -17,12 +17,31 @@ | |||
17 | 17 | ||
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/of.h> | 19 | #include <linux/of.h> |
20 | #include <linux/smp.h> | ||
20 | 21 | ||
21 | #include <asm/compiler.h> | 22 | #include <asm/compiler.h> |
22 | #include <asm/errno.h> | 23 | #include <asm/errno.h> |
23 | #include <asm/psci.h> | 24 | #include <asm/psci.h> |
25 | #include <asm/smp_plat.h> | ||
24 | 26 | ||
25 | struct psci_operations psci_ops; | 27 | #define PSCI_POWER_STATE_TYPE_STANDBY 0 |
28 | #define PSCI_POWER_STATE_TYPE_POWER_DOWN 1 | ||
29 | |||
30 | struct psci_power_state { | ||
31 | u16 id; | ||
32 | u8 type; | ||
33 | u8 affinity_level; | ||
34 | }; | ||
35 | |||
36 | struct psci_operations { | ||
37 | int (*cpu_suspend)(struct psci_power_state state, | ||
38 | unsigned long entry_point); | ||
39 | int (*cpu_off)(struct psci_power_state state); | ||
40 | int (*cpu_on)(unsigned long cpuid, unsigned long entry_point); | ||
41 | int (*migrate)(unsigned long cpuid); | ||
42 | }; | ||
43 | |||
44 | static struct psci_operations psci_ops; | ||
26 | 45 | ||
27 | static int (*invoke_psci_fn)(u64, u64, u64, u64); | 46 | static int (*invoke_psci_fn)(u64, u64, u64, u64); |
28 | 47 | ||
@@ -209,3 +228,36 @@ out_put_node: | |||
209 | of_node_put(np); | 228 | of_node_put(np); |
210 | return err; | 229 | return err; |
211 | } | 230 | } |
231 | |||
232 | #ifdef CONFIG_SMP | ||
233 | |||
234 | static int __init smp_psci_init_cpu(struct device_node *dn, int cpu) | ||
235 | { | ||
236 | return 0; | ||
237 | } | ||
238 | |||
239 | static int __init smp_psci_prepare_cpu(int cpu) | ||
240 | { | ||
241 | int err; | ||
242 | |||
243 | if (!psci_ops.cpu_on) { | ||
244 | pr_err("no cpu_on method, not booting CPU%d\n", cpu); | ||
245 | return -ENODEV; | ||
246 | } | ||
247 | |||
248 | err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_holding_pen)); | ||
249 | if (err) { | ||
250 | pr_err("failed to boot CPU%d (%d)\n", cpu, err); | ||
251 | return err; | ||
252 | } | ||
253 | |||
254 | return 0; | ||
255 | } | ||
256 | |||
257 | const struct smp_enable_ops smp_psci_ops __initconst = { | ||
258 | .name = "psci", | ||
259 | .init_cpu = smp_psci_init_cpu, | ||
260 | .prepare_cpu = smp_psci_prepare_cpu, | ||
261 | }; | ||
262 | |||
263 | #endif | ||
diff --git a/arch/arm64/kernel/smp_psci.c b/arch/arm64/kernel/smp_psci.c deleted file mode 100644 index 0c533301be77..000000000000 --- a/arch/arm64/kernel/smp_psci.c +++ /dev/null | |||
@@ -1,53 +0,0 @@ | |||
1 | /* | ||
2 | * PSCI SMP initialisation | ||
3 | * | ||
4 | * Copyright (C) 2013 ARM Ltd. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <linux/init.h> | ||
20 | #include <linux/of.h> | ||
21 | #include <linux/smp.h> | ||
22 | |||
23 | #include <asm/psci.h> | ||
24 | #include <asm/smp_plat.h> | ||
25 | |||
26 | static int __init smp_psci_init_cpu(struct device_node *dn, int cpu) | ||
27 | { | ||
28 | return 0; | ||
29 | } | ||
30 | |||
31 | static int __init smp_psci_prepare_cpu(int cpu) | ||
32 | { | ||
33 | int err; | ||
34 | |||
35 | if (!psci_ops.cpu_on) { | ||
36 | pr_err("psci: no cpu_on method, not booting CPU%d\n", cpu); | ||
37 | return -ENODEV; | ||
38 | } | ||
39 | |||
40 | err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_holding_pen)); | ||
41 | if (err) { | ||
42 | pr_err("psci: failed to boot CPU%d (%d)\n", cpu, err); | ||
43 | return err; | ||
44 | } | ||
45 | |||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | const struct smp_enable_ops smp_psci_ops __initconst = { | ||
50 | .name = "psci", | ||
51 | .init_cpu = smp_psci_init_cpu, | ||
52 | .prepare_cpu = smp_psci_prepare_cpu, | ||
53 | }; | ||