diff options
author | Will Deacon <will.deacon@arm.com> | 2012-12-13 13:10:40 +0000 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2013-02-02 15:05:33 +0000 |
commit | 4de3abb348d7a5bd6ddbfc26c34e0ee549874249 (patch) | |
tree | 9c59ed42967e4cc9a87fa44357558ccd1256b0ef /arch/arm/mach-virt | |
parent | 2a0ba7388092b07732dc772c042273a3b40d90de (diff) | |
download | blackbird-obmc-linux-4de3abb348d7a5bd6ddbfc26c34e0ee549874249.tar.gz blackbird-obmc-linux-4de3abb348d7a5bd6ddbfc26c34e0ee549874249.zip |
ARM: mach-virt: add SMP support using PSCI
This patch adds support for SMP to mach-virt using the PSCI
infrastructure.
Acked-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm/mach-virt')
-rw-r--r-- | arch/arm/mach-virt/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-virt/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-virt/platsmp.c | 58 | ||||
-rw-r--r-- | arch/arm/mach-virt/virt.c | 4 |
4 files changed, 64 insertions, 0 deletions
diff --git a/arch/arm/mach-virt/Kconfig b/arch/arm/mach-virt/Kconfig index a568a2a5bb90..8958f0d896bc 100644 --- a/arch/arm/mach-virt/Kconfig +++ b/arch/arm/mach-virt/Kconfig @@ -3,6 +3,7 @@ config ARCH_VIRT select ARCH_WANT_OPTIONAL_GPIOLIB select ARM_GIC select ARM_ARCH_TIMER + select ARM_PSCI select HAVE_SMP select CPU_V7 select SPARSE_IRQ diff --git a/arch/arm/mach-virt/Makefile b/arch/arm/mach-virt/Makefile index 7ddbfa60227f..042afc1f8c44 100644 --- a/arch/arm/mach-virt/Makefile +++ b/arch/arm/mach-virt/Makefile @@ -3,3 +3,4 @@ # obj-y := virt.o +obj-$(CONFIG_SMP) += platsmp.o diff --git a/arch/arm/mach-virt/platsmp.c b/arch/arm/mach-virt/platsmp.c new file mode 100644 index 000000000000..8badaabe70a1 --- /dev/null +++ b/arch/arm/mach-virt/platsmp.c @@ -0,0 +1,58 @@ +/* + * Dummy Virtual Machine - does what it says on the tin. + * + * Copyright (C) 2012 ARM Ltd + * Author: Will Deacon <will.deacon@arm.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/init.h> +#include <linux/smp.h> +#include <linux/of.h> + +#include <linux/irqchip/arm-gic.h> + +#include <asm/psci.h> +#include <asm/smp_plat.h> + +extern void secondary_startup(void); + +static void __init virt_smp_init_cpus(void) +{ +} + +static void __init virt_smp_prepare_cpus(unsigned int max_cpus) +{ +} + +static int __cpuinit virt_boot_secondary(unsigned int cpu, + struct task_struct *idle) +{ + if (psci_ops.cpu_on) + return psci_ops.cpu_on(cpu_logical_map(cpu), + __pa(secondary_startup)); + return -ENODEV; +} + +static void __cpuinit virt_secondary_init(unsigned int cpu) +{ + gic_secondary_init(0); +} + +struct smp_operations __initdata virt_smp_ops = { + .smp_init_cpus = virt_smp_init_cpus, + .smp_prepare_cpus = virt_smp_prepare_cpus, + .smp_secondary_init = virt_secondary_init, + .smp_boot_secondary = virt_boot_secondary, +}; diff --git a/arch/arm/mach-virt/virt.c b/arch/arm/mach-virt/virt.c index d8a84b53fe0c..f6ed9cfeb287 100644 --- a/arch/arm/mach-virt/virt.c +++ b/arch/arm/mach-virt/virt.c @@ -21,6 +21,7 @@ #include <linux/irqchip.h> #include <linux/of_irq.h> #include <linux/of_platform.h> +#include <linux/smp.h> #include <asm/arch_timer.h> #include <asm/mach/arch.h> @@ -46,9 +47,12 @@ static struct sys_timer virt_timer = { .init = virt_timer_init, }; +extern struct smp_operations virt_smp_ops; + DT_MACHINE_START(VIRT, "Dummy Virtual Machine") .init_irq = irqchip_init, .timer = &virt_timer, .init_machine = virt_init, + .smp = smp_ops(virt_smp_ops), .dt_compat = virt_dt_match, MACHINE_END |