/* Tell the hardware to boot TP1 - runs on TP0 */ static void brcmstb_boot_secondary(int cpu, struct task_struct *idle) { brcmstb_smp_boot_sp = __KSTK_TOS(idle); brcmstb_smp_boot_gp = (unsigned long)task_thread_info(idle); mb(); /* * TP1 initial boot sequence: * brcm_reset_nmi_vec @ a000_0000 -> * brcmstb_tp1_entry -> * brcm_upper_tlb_setup (cached function call) -> * start_secondary (cached jump) * * TP1 warm restart sequence: * play_dead WAIT loop -> * brcm_tp1_int_vec @ BRCM_WARM_RESTART_VEC -> * eret to play_dead -> * brcmstb_tp1_reentry -> * start_secondary * * Vector relocation code is in arch/mips/brcmstb/prom.c * Actual boot vectors are in arch/mips/brcmstb/vector.S */ printk(KERN_INFO "SMP: Booting CPU%d...\n", cpu); /* warm restart */ brcmstb_send_ipi_single(1, 0); #if defined(CONFIG_BMIPS4380) set_c0_brcm_cmt_ctrl(0x01); #elif defined(CONFIG_BMIPS5000) write_c0_brcm_action(0x9); #endif }
static void brcmstb_send_ipi_mask(cpumask_t mask, unsigned int action) { unsigned int i; for_each_cpu_mask(i, mask) brcmstb_send_ipi_single(i, action); }
static void brcmstb_send_ipi_mask(const struct cpumask *mask, unsigned int action) { unsigned int i; for_each_cpu(i, mask) brcmstb_send_ipi_single(i, action); }