From 4de3abb348d7a5bd6ddbfc26c34e0ee549874249 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 13 Dec 2012 13:10:40 +0000 Subject: [PATCH] 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 Reviewed-by: Nicolas Pitre Signed-off-by: Will Deacon --- arch/arm/mach-virt/Kconfig | 1 + arch/arm/mach-virt/Makefile | 1 + arch/arm/mach-virt/platsmp.c | 58 ++++++++++++++++++++++++++++++++++++ arch/arm/mach-virt/virt.c | 4 +++ 4 files changed, 64 insertions(+) create mode 100644 arch/arm/mach-virt/platsmp.c 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 + * + * 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 . + */ + +#include +#include +#include + +#include + +#include +#include + +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 #include #include +#include #include #include @@ -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 -- 2.34.1