162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * mp.c: OpenBoot Prom Multiprocessor support routines. Don't call 462306a36Sopenharmony_ci * these on a UP or else you will halt and catch fire. ;) 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/types.h> 1062306a36Sopenharmony_ci#include <linux/kernel.h> 1162306a36Sopenharmony_ci#include <linux/sched.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <asm/openprom.h> 1462306a36Sopenharmony_ci#include <asm/oplib.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciextern void restore_current(void); 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* Start cpu with prom-tree node 'cpunode' using context described 1962306a36Sopenharmony_ci * by 'ctable_reg' in context 'ctx' at program counter 'pc'. 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * XXX Have to look into what the return values mean. XXX 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ciint 2462306a36Sopenharmony_ciprom_startcpu(int cpunode, struct linux_prom_registers *ctable_reg, int ctx, char *pc) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci int ret; 2762306a36Sopenharmony_ci unsigned long flags; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci spin_lock_irqsave(&prom_lock, flags); 3062306a36Sopenharmony_ci switch(prom_vers) { 3162306a36Sopenharmony_ci case PROM_V0: 3262306a36Sopenharmony_ci case PROM_V2: 3362306a36Sopenharmony_ci default: 3462306a36Sopenharmony_ci ret = -1; 3562306a36Sopenharmony_ci break; 3662306a36Sopenharmony_ci case PROM_V3: 3762306a36Sopenharmony_ci ret = (*(romvec->v3_cpustart))(cpunode, (int) ctable_reg, ctx, pc); 3862306a36Sopenharmony_ci break; 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci restore_current(); 4162306a36Sopenharmony_ci spin_unlock_irqrestore(&prom_lock, flags); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci return ret; 4462306a36Sopenharmony_ci} 45