xref: /openbmc/linux/arch/arm/mach-alpine/platsmp.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*c942fddfSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2e9e06f28STsahee Zidenberg /*
3e9e06f28STsahee Zidenberg  * SMP operations for Alpine platform.
4e9e06f28STsahee Zidenberg  *
5e9e06f28STsahee Zidenberg  * Copyright (C) 2015 Annapurna Labs Ltd.
6e9e06f28STsahee Zidenberg  */
7e9e06f28STsahee Zidenberg 
8e9e06f28STsahee Zidenberg #include <linux/init.h>
9e9e06f28STsahee Zidenberg #include <linux/errno.h>
10e9e06f28STsahee Zidenberg #include <linux/io.h>
11e9e06f28STsahee Zidenberg #include <linux/of.h>
12e9e06f28STsahee Zidenberg 
13e9e06f28STsahee Zidenberg #include <asm/smp_plat.h>
14e9e06f28STsahee Zidenberg 
15e9e06f28STsahee Zidenberg #include "alpine_cpu_pm.h"
16e9e06f28STsahee Zidenberg 
alpine_boot_secondary(unsigned int cpu,struct task_struct * idle)17e9e06f28STsahee Zidenberg static int alpine_boot_secondary(unsigned int cpu, struct task_struct *idle)
18e9e06f28STsahee Zidenberg {
19e9e06f28STsahee Zidenberg 	phys_addr_t addr;
20e9e06f28STsahee Zidenberg 
2164fc2a94SFlorian Fainelli 	addr = __pa_symbol(secondary_startup);
22e9e06f28STsahee Zidenberg 
23e9e06f28STsahee Zidenberg 	if (addr > (phys_addr_t)(uint32_t)(-1)) {
24e9e06f28STsahee Zidenberg 		pr_err("FAIL: resume address over 32bit (%pa)", &addr);
25e9e06f28STsahee Zidenberg 		return -EINVAL;
26e9e06f28STsahee Zidenberg 	}
27e9e06f28STsahee Zidenberg 
28e9e06f28STsahee Zidenberg 	return alpine_cpu_wakeup(cpu_logical_map(cpu), (uint32_t)addr);
29e9e06f28STsahee Zidenberg }
30e9e06f28STsahee Zidenberg 
alpine_smp_prepare_cpus(unsigned int max_cpus)31e9e06f28STsahee Zidenberg static void __init alpine_smp_prepare_cpus(unsigned int max_cpus)
32e9e06f28STsahee Zidenberg {
33e9e06f28STsahee Zidenberg 	alpine_cpu_pm_init();
34e9e06f28STsahee Zidenberg }
35e9e06f28STsahee Zidenberg 
3675305275SMasahiro Yamada static const struct smp_operations alpine_smp_ops __initconst = {
37e9e06f28STsahee Zidenberg 	.smp_prepare_cpus	= alpine_smp_prepare_cpus,
38e9e06f28STsahee Zidenberg 	.smp_boot_secondary	= alpine_boot_secondary,
39e9e06f28STsahee Zidenberg };
40e9e06f28STsahee Zidenberg CPU_METHOD_OF_DECLARE(alpine_smp, "al,alpine-smp", &alpine_smp_ops);
41