xref: /openbmc/linux/arch/arm/mach-shmobile/smp-emev2.c (revision 3eb66e91a25497065c5322b1268cbc3953642227)
1*c44e182eSWolfram Sang // SPDX-License-Identifier: GPL-2.0
2bd5a875dSMagnus Damm /*
3bd5a875dSMagnus Damm  * SMP support for Emma Mobile EV2
4bd5a875dSMagnus Damm  *
5bd5a875dSMagnus Damm  * Copyright (C) 2012  Renesas Solutions Corp.
6bd5a875dSMagnus Damm  * Copyright (C) 2012  Magnus Damm
7bd5a875dSMagnus Damm  */
8bd5a875dSMagnus Damm #include <linux/kernel.h>
9bd5a875dSMagnus Damm #include <linux/init.h>
10bd5a875dSMagnus Damm #include <linux/smp.h>
11bd5a875dSMagnus Damm #include <linux/spinlock.h>
12bd5a875dSMagnus Damm #include <linux/io.h>
13bd5a875dSMagnus Damm #include <linux/delay.h>
14bd5a875dSMagnus Damm #include <asm/smp_plat.h>
15bd5a875dSMagnus Damm #include <asm/smp_scu.h>
16c58b31aaSGeert Uytterhoeven 
17fd44aa5eSMagnus Damm #include "common.h"
18c58b31aaSGeert Uytterhoeven #include "emev2.h"
19bd5a875dSMagnus Damm 
20bd5a875dSMagnus Damm #define EMEV2_SCU_BASE 0x1e000000
218d7217e5SMagnus Damm #define EMEV2_SMU_BASE 0xe0110000
228d7217e5SMagnus Damm #define SMU_GENERAL_REG0 0x7c0
23bd5a875dSMagnus Damm 
emev2_boot_secondary(unsigned int cpu,struct task_struct * idle)248bd26e3aSPaul Gortmaker static int emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
25bd5a875dSMagnus Damm {
261af4b3faSMagnus Damm 	arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu)));
27bd5a875dSMagnus Damm 	return 0;
28bd5a875dSMagnus Damm }
29bd5a875dSMagnus Damm 
emev2_smp_prepare_cpus(unsigned int max_cpus)30a62580e5SMarc Zyngier static void __init emev2_smp_prepare_cpus(unsigned int max_cpus)
31bd5a875dSMagnus Damm {
328d7217e5SMagnus Damm 	void __iomem *smu;
338d7217e5SMagnus Damm 
340da60225SMagnus Damm 	/* Tell ROM loader about our vector (in headsmp.S) */
358d7217e5SMagnus Damm 	smu = ioremap(EMEV2_SMU_BASE, PAGE_SIZE);
368d7217e5SMagnus Damm 	if (smu) {
378d7217e5SMagnus Damm 		iowrite32(__pa(shmobile_boot_vector), smu + SMU_GENERAL_REG0);
388d7217e5SMagnus Damm 		iounmap(smu);
398d7217e5SMagnus Damm 	}
40da252b8eSMagnus Damm 
410da60225SMagnus Damm 	/* setup EMEV2 specific SCU bits */
428701d808SGeert Uytterhoeven 	shmobile_smp_scu_prepare_cpus(EMEV2_SCU_BASE, max_cpus);
43bd5a875dSMagnus Damm }
44a62580e5SMarc Zyngier 
4575305275SMasahiro Yamada const struct smp_operations emev2_smp_ops __initconst = {
46a62580e5SMarc Zyngier 	.smp_prepare_cpus	= emev2_smp_prepare_cpus,
47a62580e5SMarc Zyngier 	.smp_boot_secondary	= emev2_boot_secondary,
48a62580e5SMarc Zyngier };
49