18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Keystone SOC SMP platform code 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2013 Texas Instruments, Inc. 68c2ecf20Sopenharmony_ci * Cyril Chemparathy <cyril@ti.com> 78c2ecf20Sopenharmony_ci * Santosh Shilimkar <santosh.shillimkar@ti.com> 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Based on platsmp.c, Copyright (C) 2002 ARM Ltd. 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/init.h> 138c2ecf20Sopenharmony_ci#include <linux/smp.h> 148c2ecf20Sopenharmony_ci#include <linux/io.h> 158c2ecf20Sopenharmony_ci#include <linux/pgtable.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <asm/smp_plat.h> 188c2ecf20Sopenharmony_ci#include <asm/prom.h> 198c2ecf20Sopenharmony_ci#include <asm/tlbflush.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#include "keystone.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistatic int keystone_smp_boot_secondary(unsigned int cpu, 248c2ecf20Sopenharmony_ci struct task_struct *idle) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci unsigned long start = virt_to_idmap(&secondary_startup); 278c2ecf20Sopenharmony_ci int error; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci pr_debug("keystone-smp: booting cpu %d, vector %08lx\n", 308c2ecf20Sopenharmony_ci cpu, start); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci error = keystone_cpu_smc(KEYSTONE_MON_CPU_UP_IDX, cpu, start); 338c2ecf20Sopenharmony_ci if (error) 348c2ecf20Sopenharmony_ci pr_err("CPU %d bringup failed with %d\n", cpu, error); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci return error; 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ciconst struct smp_operations keystone_smp_ops __initconst = { 408c2ecf20Sopenharmony_ci .smp_boot_secondary = keystone_smp_boot_secondary, 418c2ecf20Sopenharmony_ci}; 42