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 Gortmakerstatic 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 Zyngierstatic 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