1/* 2 * Copyright (C) 2000, 2001, 2002, 2003 Broadcom Corporation 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 2 7 * of the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 */ 18 19#include <linux/init.h> 20#include <linux/sched.h> 21#include <linux/smp.h> 22#include <asm/processor.h> 23 24#include "cfe_api.h" 25#include "cfe_error.h" 26 27/* 28 * Use CFE to find out how many CPUs are available, setting up 29 * phys_cpu_present_map and the logical/physical mappings. 30 * XXXKW will the boot CPU ever not be physical 0? 31 * 32 * Common setup before any secondaries are started 33 */ 34void __init plat_smp_setup(void) 35{ 36 int i, num; 37 38 cpus_clear(phys_cpu_present_map); 39 cpu_set(0, phys_cpu_present_map); 40 __cpu_number_map[0] = 0; 41 __cpu_logical_map[0] = 0; 42 43 for (i = 1, num = 0; i < NR_CPUS; i++) { 44 if (cfe_cpu_stop(i) == 0) { 45 cpu_set(i, phys_cpu_present_map); 46 __cpu_number_map[i] = ++num; 47 __cpu_logical_map[num] = i; 48 } 49 } 50 printk(KERN_INFO "Detected %i available secondary CPU(s)\n", num); 51} 52 53void __init plat_prepare_cpus(unsigned int max_cpus) 54{ 55} 56 57/* 58 * Setup the PC, SP, and GP of a secondary processor and start it 59 * running! 60 */ 61void prom_boot_secondary(int cpu, struct task_struct *idle) 62{ 63 int retval; 64 65 retval = cfe_cpu_start(cpu_logical_map(cpu), &smp_bootstrap, 66 __KSTK_TOS(idle), 67 (unsigned long)task_thread_info(idle), 0); 68 if (retval != 0) 69 printk("cfe_start_cpu(%i) returned %i\n" , cpu, retval); 70} 71 72/* 73 * Code to run on secondary just after probing the CPU 74 */ 75void prom_init_secondary(void) 76{ 77#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) 78 extern void bcm1480_smp_init(void); 79 bcm1480_smp_init(); 80#elif defined(CONFIG_SIBYTE_SB1250) 81 extern void sb1250_smp_init(void); 82 sb1250_smp_init(); 83#else 84#error invalid SMP configuration 85#endif 86} 87 88/* 89 * Do any tidying up before marking online and running the idle 90 * loop 91 */ 92void prom_smp_finish(void) 93{ 94#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) 95 extern void bcm1480_smp_finish(void); 96 bcm1480_smp_finish(); 97#elif defined(CONFIG_SIBYTE_SB1250) 98 extern void sb1250_smp_finish(void); 99 sb1250_smp_finish(); 100#else 101#error invalid SMP configuration 102#endif 103} 104 105/* 106 * Final cleanup after all secondaries booted 107 */ 108void prom_cpus_done(void) 109{ 110} 111