diff options
| author | Jon Medhurst <tixy@linaro.org> | 2013-01-30 04:12:55 -0500 |
|---|---|---|
| committer | Nicolas Pitre <nicolas.pitre@linaro.org> | 2013-05-29 15:50:35 -0400 |
| commit | 033a899c9b06e7e4f6733a637fee34c632ca2d47 (patch) | |
| tree | 00ec6231214f2a68942e592b7737f5ef83335d2f | |
| parent | d41418c0c0c0dc8a367af96b8e547f31477d9aa0 (diff) | |
ARM: vexpress: Select multi-cluster SMP operation if required
Signed-off-by: Jon Medhurst <tixy@linaro.org>
Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: Pawel Moll <pawel.moll@arm.com>
| -rw-r--r-- | arch/arm/mach-vexpress/core.h | 2 | ||||
| -rw-r--r-- | arch/arm/mach-vexpress/platsmp.c | 20 | ||||
| -rw-r--r-- | arch/arm/mach-vexpress/v2m.c | 1 |
3 files changed, 23 insertions, 0 deletions
diff --git a/arch/arm/mach-vexpress/core.h b/arch/arm/mach-vexpress/core.h index f134cd4a85f1..bde4374ab6d5 100644 --- a/arch/arm/mach-vexpress/core.h +++ b/arch/arm/mach-vexpress/core.h | |||
| @@ -6,6 +6,8 @@ | |||
| 6 | 6 | ||
| 7 | void vexpress_dt_smp_map_io(void); | 7 | void vexpress_dt_smp_map_io(void); |
| 8 | 8 | ||
| 9 | bool vexpress_smp_init_ops(void); | ||
| 10 | |||
| 9 | extern struct smp_operations vexpress_smp_ops; | 11 | extern struct smp_operations vexpress_smp_ops; |
| 10 | 12 | ||
| 11 | extern void vexpress_cpu_die(unsigned int cpu); | 13 | extern void vexpress_cpu_die(unsigned int cpu); |
diff --git a/arch/arm/mach-vexpress/platsmp.c b/arch/arm/mach-vexpress/platsmp.c index dc1ace55d557..993c9ae5dc5e 100644 --- a/arch/arm/mach-vexpress/platsmp.c +++ b/arch/arm/mach-vexpress/platsmp.c | |||
| @@ -12,9 +12,11 @@ | |||
| 12 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
| 13 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
| 14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
| 15 | #include <linux/of.h> | ||
| 15 | #include <linux/of_fdt.h> | 16 | #include <linux/of_fdt.h> |
| 16 | #include <linux/vexpress.h> | 17 | #include <linux/vexpress.h> |
| 17 | 18 | ||
| 19 | #include <asm/mcpm.h> | ||
| 18 | #include <asm/smp_scu.h> | 20 | #include <asm/smp_scu.h> |
| 19 | #include <asm/mach/map.h> | 21 | #include <asm/mach/map.h> |
| 20 | 22 | ||
| @@ -203,3 +205,21 @@ struct smp_operations __initdata vexpress_smp_ops = { | |||
| 203 | .cpu_die = vexpress_cpu_die, | 205 | .cpu_die = vexpress_cpu_die, |
| 204 | #endif | 206 | #endif |
| 205 | }; | 207 | }; |
| 208 | |||
| 209 | bool __init vexpress_smp_init_ops(void) | ||
| 210 | { | ||
| 211 | #ifdef CONFIG_MCPM | ||
| 212 | /* | ||
| 213 | * The best way to detect a multi-cluster configuration at the moment | ||
| 214 | * is to look for the presence of a CCI in the system. | ||
| 215 | * Override the default vexpress_smp_ops if so. | ||
| 216 | */ | ||
| 217 | struct device_node *node; | ||
| 218 | node = of_find_compatible_node(NULL, NULL, "arm,cci-400"); | ||
| 219 | if (node && of_device_is_available(node)) { | ||
| 220 | mcpm_smp_set_ops(); | ||
| 221 | return true; | ||
| 222 | } | ||
| 223 | #endif | ||
| 224 | return false; | ||
| 225 | } | ||
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 8802030df98d..b0eccf7e06ec 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c | |||
| @@ -456,6 +456,7 @@ static const char * const v2m_dt_match[] __initconst = { | |||
| 456 | DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express") | 456 | DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express") |
| 457 | .dt_compat = v2m_dt_match, | 457 | .dt_compat = v2m_dt_match, |
| 458 | .smp = smp_ops(vexpress_smp_ops), | 458 | .smp = smp_ops(vexpress_smp_ops), |
| 459 | .smp_init = smp_init_ops(vexpress_smp_init_ops), | ||
| 459 | .map_io = v2m_dt_map_io, | 460 | .map_io = v2m_dt_map_io, |
| 460 | .init_early = v2m_dt_init_early, | 461 | .init_early = v2m_dt_init_early, |
| 461 | .init_irq = irqchip_init, | 462 | .init_irq = irqchip_init, |
