18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * SMP support for Emma Mobile EV2 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2012 Renesas Solutions Corp. 68c2ecf20Sopenharmony_ci * Copyright (C) 2012 Magnus Damm 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#include <linux/kernel.h> 98c2ecf20Sopenharmony_ci#include <linux/init.h> 108c2ecf20Sopenharmony_ci#include <linux/smp.h> 118c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 128c2ecf20Sopenharmony_ci#include <linux/io.h> 138c2ecf20Sopenharmony_ci#include <linux/delay.h> 148c2ecf20Sopenharmony_ci#include <asm/smp_plat.h> 158c2ecf20Sopenharmony_ci#include <asm/smp_scu.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include "common.h" 188c2ecf20Sopenharmony_ci#include "emev2.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#define EMEV2_SCU_BASE 0x1e000000 218c2ecf20Sopenharmony_ci#define EMEV2_SMU_BASE 0xe0110000 228c2ecf20Sopenharmony_ci#define SMU_GENERAL_REG0 0x7c0 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic int emev2_boot_secondary(unsigned int cpu, struct task_struct *idle) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu))); 278c2ecf20Sopenharmony_ci return 0; 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistatic void __init emev2_smp_prepare_cpus(unsigned int max_cpus) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci void __iomem *smu; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci /* Tell ROM loader about our vector (in headsmp.S) */ 358c2ecf20Sopenharmony_ci smu = ioremap(EMEV2_SMU_BASE, PAGE_SIZE); 368c2ecf20Sopenharmony_ci if (smu) { 378c2ecf20Sopenharmony_ci iowrite32(__pa(shmobile_boot_vector), smu + SMU_GENERAL_REG0); 388c2ecf20Sopenharmony_ci iounmap(smu); 398c2ecf20Sopenharmony_ci } 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci /* setup EMEV2 specific SCU bits */ 428c2ecf20Sopenharmony_ci shmobile_smp_scu_prepare_cpus(EMEV2_SCU_BASE, max_cpus); 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ciconst struct smp_operations emev2_smp_ops __initconst = { 468c2ecf20Sopenharmony_ci .smp_prepare_cpus = emev2_smp_prepare_cpus, 478c2ecf20Sopenharmony_ci .smp_boot_secondary = emev2_boot_secondary, 488c2ecf20Sopenharmony_ci}; 49