1 // SPDX-License-Identifier: GPL-2.0
3 * SMP support for R-Mobile / SH-Mobile - sh73a0 portion
5 * Copyright (C) 2010 Magnus Damm
6 * Copyright (C) 2010 Takashi Yoshii
8 #include <linux/kernel.h>
9 #include <linux/init.h>
10 #include <linux/smp.h>
12 #include <linux/delay.h>
14 #include <asm/smp_plat.h>
19 #define WUPCR IOMEM(0xe6151010)
20 #define SRESCR IOMEM(0xe6151018)
21 #define PSTR IOMEM(0xe6151040)
22 #define SBAR IOMEM(0xe6180020)
23 #define APARMBAREA IOMEM(0xe6f10020)
25 #define SH73A0_SCU_BASE 0xf0000000
27 static int sh73a0_boot_secondary(unsigned int cpu
, struct task_struct
*idle
)
29 unsigned int lcpu
= cpu_logical_map(cpu
);
31 if (((__raw_readl(PSTR
) >> (4 * lcpu
)) & 3) == 3)
32 __raw_writel(1 << lcpu
, WUPCR
); /* wake up */
34 __raw_writel(1 << lcpu
, SRESCR
); /* reset */
39 static void __init
sh73a0_smp_prepare_cpus(unsigned int max_cpus
)
41 /* Map the reset vector (in headsmp.S) */
42 __raw_writel(0, APARMBAREA
); /* 4k */
43 __raw_writel(__pa(shmobile_boot_vector
), SBAR
);
45 /* setup sh73a0 specific SCU bits */
46 shmobile_smp_scu_prepare_cpus(SH73A0_SCU_BASE
, max_cpus
);
49 const struct smp_operations sh73a0_smp_ops __initconst
= {
50 .smp_prepare_cpus
= sh73a0_smp_prepare_cpus
,
51 .smp_boot_secondary
= sh73a0_boot_secondary
,
52 #ifdef CONFIG_HOTPLUG_CPU
53 .cpu_can_disable
= shmobile_smp_cpu_can_disable
,
54 .cpu_die
= shmobile_smp_scu_cpu_die
,
55 .cpu_kill
= shmobile_smp_scu_cpu_kill
,