143afdf508386342d714f6911c1976f934b520cb0Richard Kuo/* 243afdf508386342d714f6911c1976f934b520cb0Richard Kuo * SMP support for Hexagon 343afdf508386342d714f6911c1976f934b520cb0Richard Kuo * 4e1858b2a21cd84a855945a4747fb2db41b250c22Richard Kuo * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. 543afdf508386342d714f6911c1976f934b520cb0Richard Kuo * 643afdf508386342d714f6911c1976f934b520cb0Richard Kuo * This program is free software; you can redistribute it and/or modify 743afdf508386342d714f6911c1976f934b520cb0Richard Kuo * it under the terms of the GNU General Public License version 2 and 843afdf508386342d714f6911c1976f934b520cb0Richard Kuo * only version 2 as published by the Free Software Foundation. 943afdf508386342d714f6911c1976f934b520cb0Richard Kuo * 1043afdf508386342d714f6911c1976f934b520cb0Richard Kuo * This program is distributed in the hope that it will be useful, 1143afdf508386342d714f6911c1976f934b520cb0Richard Kuo * but WITHOUT ANY WARRANTY; without even the implied warranty of 1243afdf508386342d714f6911c1976f934b520cb0Richard Kuo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1343afdf508386342d714f6911c1976f934b520cb0Richard Kuo * GNU General Public License for more details. 1443afdf508386342d714f6911c1976f934b520cb0Richard Kuo * 1543afdf508386342d714f6911c1976f934b520cb0Richard Kuo * You should have received a copy of the GNU General Public License 1643afdf508386342d714f6911c1976f934b520cb0Richard Kuo * along with this program; if not, write to the Free Software 1743afdf508386342d714f6911c1976f934b520cb0Richard Kuo * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 1843afdf508386342d714f6911c1976f934b520cb0Richard Kuo * 02110-1301, USA. 1943afdf508386342d714f6911c1976f934b520cb0Richard Kuo */ 2043afdf508386342d714f6911c1976f934b520cb0Richard Kuo 2143afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/err.h> 2243afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/errno.h> 2343afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/kernel.h> 2443afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/init.h> 2543afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/interrupt.h> 2643afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/module.h> 2743afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/percpu.h> 2843afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/sched.h> 2943afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/smp.h> 3043afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <linux/spinlock.h> 31e00574b7f3181c5277df819e960d5af205e0e87aRichard Kuo#include <linux/cpu.h> 3243afdf508386342d714f6911c1976f934b520cb0Richard Kuo 3343afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <asm/time.h> /* timer_interrupt */ 3443afdf508386342d714f6911c1976f934b520cb0Richard Kuo#include <asm/hexagon_vm.h> 3543afdf508386342d714f6911c1976f934b520cb0Richard Kuo 3643afdf508386342d714f6911c1976f934b520cb0Richard Kuo#define BASE_IPI_IRQ 26 3743afdf508386342d714f6911c1976f934b520cb0Richard Kuo 3843afdf508386342d714f6911c1976f934b520cb0Richard Kuo/* 390b5f9c005def154f9c21f9be0223b65b50d54368Rusty Russell * cpu_possible_mask needs to be filled out prior to setup_per_cpu_areas 4043afdf508386342d714f6911c1976f934b520cb0Richard Kuo * (which is prior to any of our smp_prepare_cpu crap), in order to set 4143afdf508386342d714f6911c1976f934b520cb0Richard Kuo * up the... per_cpu areas. 4243afdf508386342d714f6911c1976f934b520cb0Richard Kuo */ 4343afdf508386342d714f6911c1976f934b520cb0Richard Kuo 4443afdf508386342d714f6911c1976f934b520cb0Richard Kuostruct ipi_data { 4543afdf508386342d714f6911c1976f934b520cb0Richard Kuo unsigned long bits; 4643afdf508386342d714f6911c1976f934b520cb0Richard Kuo}; 4743afdf508386342d714f6911c1976f934b520cb0Richard Kuo 4843afdf508386342d714f6911c1976f934b520cb0Richard Kuostatic DEFINE_PER_CPU(struct ipi_data, ipi_data); 4943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 5043afdf508386342d714f6911c1976f934b520cb0Richard Kuostatic inline void __handle_ipi(unsigned long *ops, struct ipi_data *ipi, 5143afdf508386342d714f6911c1976f934b520cb0Richard Kuo int cpu) 5243afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 5343afdf508386342d714f6911c1976f934b520cb0Richard Kuo unsigned long msg = 0; 5443afdf508386342d714f6911c1976f934b520cb0Richard Kuo do { 5543afdf508386342d714f6911c1976f934b520cb0Richard Kuo msg = find_next_bit(ops, BITS_PER_LONG, msg+1); 5643afdf508386342d714f6911c1976f934b520cb0Richard Kuo 5743afdf508386342d714f6911c1976f934b520cb0Richard Kuo switch (msg) { 5843afdf508386342d714f6911c1976f934b520cb0Richard Kuo 5943afdf508386342d714f6911c1976f934b520cb0Richard Kuo case IPI_TIMER: 6043afdf508386342d714f6911c1976f934b520cb0Richard Kuo ipi_timer(); 6143afdf508386342d714f6911c1976f934b520cb0Richard Kuo break; 6243afdf508386342d714f6911c1976f934b520cb0Richard Kuo 6343afdf508386342d714f6911c1976f934b520cb0Richard Kuo case IPI_CALL_FUNC: 6443afdf508386342d714f6911c1976f934b520cb0Richard Kuo generic_smp_call_function_interrupt(); 6543afdf508386342d714f6911c1976f934b520cb0Richard Kuo break; 6643afdf508386342d714f6911c1976f934b520cb0Richard Kuo 6743afdf508386342d714f6911c1976f934b520cb0Richard Kuo case IPI_CPU_STOP: 6843afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* 6943afdf508386342d714f6911c1976f934b520cb0Richard Kuo * call vmstop() 7043afdf508386342d714f6911c1976f934b520cb0Richard Kuo */ 7143afdf508386342d714f6911c1976f934b520cb0Richard Kuo __vmstop(); 7243afdf508386342d714f6911c1976f934b520cb0Richard Kuo break; 7343afdf508386342d714f6911c1976f934b520cb0Richard Kuo 7443afdf508386342d714f6911c1976f934b520cb0Richard Kuo case IPI_RESCHEDULE: 7543afdf508386342d714f6911c1976f934b520cb0Richard Kuo scheduler_ipi(); 7643afdf508386342d714f6911c1976f934b520cb0Richard Kuo break; 7743afdf508386342d714f6911c1976f934b520cb0Richard Kuo } 7843afdf508386342d714f6911c1976f934b520cb0Richard Kuo } while (msg < BITS_PER_LONG); 7943afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 8043afdf508386342d714f6911c1976f934b520cb0Richard Kuo 8143afdf508386342d714f6911c1976f934b520cb0Richard Kuo/* Used for IPI call from other CPU's to unmask int */ 8243afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid smp_vm_unmask_irq(void *info) 8343afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 8443afdf508386342d714f6911c1976f934b520cb0Richard Kuo __vmintop_locen((long) info); 8543afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 8643afdf508386342d714f6911c1976f934b520cb0Richard Kuo 8743afdf508386342d714f6911c1976f934b520cb0Richard Kuo 8843afdf508386342d714f6911c1976f934b520cb0Richard Kuo/* 8943afdf508386342d714f6911c1976f934b520cb0Richard Kuo * This is based on Alpha's IPI stuff. 9043afdf508386342d714f6911c1976f934b520cb0Richard Kuo * Supposed to take (int, void*) as args now. 9143afdf508386342d714f6911c1976f934b520cb0Richard Kuo * Specifically, first arg is irq, second is the irq_desc. 9243afdf508386342d714f6911c1976f934b520cb0Richard Kuo */ 9343afdf508386342d714f6911c1976f934b520cb0Richard Kuo 9443afdf508386342d714f6911c1976f934b520cb0Richard Kuoirqreturn_t handle_ipi(int irq, void *desc) 9543afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 9643afdf508386342d714f6911c1976f934b520cb0Richard Kuo int cpu = smp_processor_id(); 9743afdf508386342d714f6911c1976f934b520cb0Richard Kuo struct ipi_data *ipi = &per_cpu(ipi_data, cpu); 9843afdf508386342d714f6911c1976f934b520cb0Richard Kuo unsigned long ops; 9943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 10043afdf508386342d714f6911c1976f934b520cb0Richard Kuo while ((ops = xchg(&ipi->bits, 0)) != 0) 10143afdf508386342d714f6911c1976f934b520cb0Richard Kuo __handle_ipi(&ops, ipi, cpu); 10243afdf508386342d714f6911c1976f934b520cb0Richard Kuo return IRQ_HANDLED; 10343afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 10443afdf508386342d714f6911c1976f934b520cb0Richard Kuo 10543afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid send_ipi(const struct cpumask *cpumask, enum ipi_message_type msg) 10643afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 10743afdf508386342d714f6911c1976f934b520cb0Richard Kuo unsigned long flags; 10843afdf508386342d714f6911c1976f934b520cb0Richard Kuo unsigned long cpu; 10943afdf508386342d714f6911c1976f934b520cb0Richard Kuo unsigned long retval; 11043afdf508386342d714f6911c1976f934b520cb0Richard Kuo 11143afdf508386342d714f6911c1976f934b520cb0Richard Kuo local_irq_save(flags); 11243afdf508386342d714f6911c1976f934b520cb0Richard Kuo 11343afdf508386342d714f6911c1976f934b520cb0Richard Kuo for_each_cpu(cpu, cpumask) { 11443afdf508386342d714f6911c1976f934b520cb0Richard Kuo struct ipi_data *ipi = &per_cpu(ipi_data, cpu); 11543afdf508386342d714f6911c1976f934b520cb0Richard Kuo 11643afdf508386342d714f6911c1976f934b520cb0Richard Kuo set_bit(msg, &ipi->bits); 11743afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* Possible barrier here */ 11843afdf508386342d714f6911c1976f934b520cb0Richard Kuo retval = __vmintop_post(BASE_IPI_IRQ+cpu); 11943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 12043afdf508386342d714f6911c1976f934b520cb0Richard Kuo if (retval != 0) { 12143afdf508386342d714f6911c1976f934b520cb0Richard Kuo printk(KERN_ERR "interrupt %ld not configured?\n", 12243afdf508386342d714f6911c1976f934b520cb0Richard Kuo BASE_IPI_IRQ+cpu); 12343afdf508386342d714f6911c1976f934b520cb0Richard Kuo } 12443afdf508386342d714f6911c1976f934b520cb0Richard Kuo } 12543afdf508386342d714f6911c1976f934b520cb0Richard Kuo 12643afdf508386342d714f6911c1976f934b520cb0Richard Kuo local_irq_restore(flags); 12743afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 12843afdf508386342d714f6911c1976f934b520cb0Richard Kuo 12943afdf508386342d714f6911c1976f934b520cb0Richard Kuostatic struct irqaction ipi_intdesc = { 13043afdf508386342d714f6911c1976f934b520cb0Richard Kuo .handler = handle_ipi, 13143afdf508386342d714f6911c1976f934b520cb0Richard Kuo .flags = IRQF_TRIGGER_RISING, 13243afdf508386342d714f6911c1976f934b520cb0Richard Kuo .name = "ipi_handler" 13343afdf508386342d714f6911c1976f934b520cb0Richard Kuo}; 13443afdf508386342d714f6911c1976f934b520cb0Richard Kuo 13543afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid __init smp_prepare_boot_cpu(void) 13643afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 13743afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 13843afdf508386342d714f6911c1976f934b520cb0Richard Kuo 13943afdf508386342d714f6911c1976f934b520cb0Richard Kuo/* 14043afdf508386342d714f6911c1976f934b520cb0Richard Kuo * interrupts should already be disabled from the VM 14143afdf508386342d714f6911c1976f934b520cb0Richard Kuo * SP should already be correct; need to set THREADINFO_REG 14243afdf508386342d714f6911c1976f934b520cb0Richard Kuo * to point to current thread info 14343afdf508386342d714f6911c1976f934b520cb0Richard Kuo */ 14443afdf508386342d714f6911c1976f934b520cb0Richard Kuo 1457ddc839977cf4aa2c643a2f0405aa79daa72dc07Paul Gortmakervoid start_secondary(void) 14643afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 14743afdf508386342d714f6911c1976f934b520cb0Richard Kuo unsigned int cpu; 14843afdf508386342d714f6911c1976f934b520cb0Richard Kuo unsigned long thread_ptr; 14943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 15043afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* Calculate thread_info pointer from stack pointer */ 15143afdf508386342d714f6911c1976f934b520cb0Richard Kuo __asm__ __volatile__( 15243afdf508386342d714f6911c1976f934b520cb0Richard Kuo "%0 = SP;\n" 15343afdf508386342d714f6911c1976f934b520cb0Richard Kuo : "=r" (thread_ptr) 15443afdf508386342d714f6911c1976f934b520cb0Richard Kuo ); 15543afdf508386342d714f6911c1976f934b520cb0Richard Kuo 15643afdf508386342d714f6911c1976f934b520cb0Richard Kuo thread_ptr = thread_ptr & ~(THREAD_SIZE-1); 15743afdf508386342d714f6911c1976f934b520cb0Richard Kuo 15843afdf508386342d714f6911c1976f934b520cb0Richard Kuo __asm__ __volatile__( 15943afdf508386342d714f6911c1976f934b520cb0Richard Kuo QUOTED_THREADINFO_REG " = %0;\n" 16043afdf508386342d714f6911c1976f934b520cb0Richard Kuo : 16143afdf508386342d714f6911c1976f934b520cb0Richard Kuo : "r" (thread_ptr) 16243afdf508386342d714f6911c1976f934b520cb0Richard Kuo ); 16343afdf508386342d714f6911c1976f934b520cb0Richard Kuo 16443afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* Set the memory struct */ 16543afdf508386342d714f6911c1976f934b520cb0Richard Kuo atomic_inc(&init_mm.mm_count); 16643afdf508386342d714f6911c1976f934b520cb0Richard Kuo current->active_mm = &init_mm; 16743afdf508386342d714f6911c1976f934b520cb0Richard Kuo 16843afdf508386342d714f6911c1976f934b520cb0Richard Kuo cpu = smp_processor_id(); 16943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 17043afdf508386342d714f6911c1976f934b520cb0Richard Kuo setup_irq(BASE_IPI_IRQ + cpu, &ipi_intdesc); 17143afdf508386342d714f6911c1976f934b520cb0Richard Kuo 17243afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* Register the clock_event dummy */ 17343afdf508386342d714f6911c1976f934b520cb0Richard Kuo setup_percpu_clockdev(); 17443afdf508386342d714f6911c1976f934b520cb0Richard Kuo 17543afdf508386342d714f6911c1976f934b520cb0Richard Kuo printk(KERN_INFO "%s cpu %d\n", __func__, current_thread_info()->cpu); 17643afdf508386342d714f6911c1976f934b520cb0Richard Kuo 17757f27cca7ab59cec05adc85cef97e9b4f7d28d78Srivatsa S. Bhat notify_cpu_starting(cpu); 17857f27cca7ab59cec05adc85cef97e9b4f7d28d78Srivatsa S. Bhat 17943afdf508386342d714f6911c1976f934b520cb0Richard Kuo set_cpu_online(cpu, true); 18057f27cca7ab59cec05adc85cef97e9b4f7d28d78Srivatsa S. Bhat 18143afdf508386342d714f6911c1976f934b520cb0Richard Kuo local_irq_enable(); 18243afdf508386342d714f6911c1976f934b520cb0Richard Kuo 1834e0fcc567239ef4b3f80bba778c30b0a4b624effThomas Gleixner cpu_startup_entry(CPUHP_ONLINE); 18443afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 18543afdf508386342d714f6911c1976f934b520cb0Richard Kuo 18643afdf508386342d714f6911c1976f934b520cb0Richard Kuo 18743afdf508386342d714f6911c1976f934b520cb0Richard Kuo/* 18843afdf508386342d714f6911c1976f934b520cb0Richard Kuo * called once for each present cpu 18943afdf508386342d714f6911c1976f934b520cb0Richard Kuo * apparently starts up the CPU and then 19043afdf508386342d714f6911c1976f934b520cb0Richard Kuo * maintains control until "cpu_online(cpu)" is set. 19143afdf508386342d714f6911c1976f934b520cb0Richard Kuo */ 19243afdf508386342d714f6911c1976f934b520cb0Richard Kuo 1937ddc839977cf4aa2c643a2f0405aa79daa72dc07Paul Gortmakerint __cpu_up(unsigned int cpu, struct task_struct *idle) 19443afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 1953b0132ce4fff68b30abdfcb74cffc283af711076Thomas Gleixner struct thread_info *thread = (struct thread_info *)idle->stack; 19643afdf508386342d714f6911c1976f934b520cb0Richard Kuo void *stack_start; 19743afdf508386342d714f6911c1976f934b520cb0Richard Kuo 19843afdf508386342d714f6911c1976f934b520cb0Richard Kuo thread->cpu = cpu; 19943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 20043afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* Boot to the head. */ 20143afdf508386342d714f6911c1976f934b520cb0Richard Kuo stack_start = ((void *) thread) + THREAD_SIZE; 20243afdf508386342d714f6911c1976f934b520cb0Richard Kuo __vmstart(start_secondary, stack_start); 20343afdf508386342d714f6911c1976f934b520cb0Richard Kuo 2040b5f9c005def154f9c21f9be0223b65b50d54368Rusty Russell while (!cpu_online(cpu)) 20543afdf508386342d714f6911c1976f934b520cb0Richard Kuo barrier(); 20643afdf508386342d714f6911c1976f934b520cb0Richard Kuo 20743afdf508386342d714f6911c1976f934b520cb0Richard Kuo return 0; 20843afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 20943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 21043afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid __init smp_cpus_done(unsigned int max_cpus) 21143afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 21243afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 21343afdf508386342d714f6911c1976f934b520cb0Richard Kuo 21443afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid __init smp_prepare_cpus(unsigned int max_cpus) 21543afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 21643afdf508386342d714f6911c1976f934b520cb0Richard Kuo int i; 21743afdf508386342d714f6911c1976f934b520cb0Richard Kuo 21843afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* 21943afdf508386342d714f6911c1976f934b520cb0Richard Kuo * should eventually have some sort of machine 22043afdf508386342d714f6911c1976f934b520cb0Richard Kuo * descriptor that has this stuff 22143afdf508386342d714f6911c1976f934b520cb0Richard Kuo */ 22243afdf508386342d714f6911c1976f934b520cb0Richard Kuo 22343afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* Right now, let's just fake it. */ 22443afdf508386342d714f6911c1976f934b520cb0Richard Kuo for (i = 0; i < max_cpus; i++) 2250b5f9c005def154f9c21f9be0223b65b50d54368Rusty Russell set_cpu_present(i, true); 22643afdf508386342d714f6911c1976f934b520cb0Richard Kuo 22743afdf508386342d714f6911c1976f934b520cb0Richard Kuo /* Also need to register the interrupts for IPI */ 22843afdf508386342d714f6911c1976f934b520cb0Richard Kuo if (max_cpus > 1) 22943afdf508386342d714f6911c1976f934b520cb0Richard Kuo setup_irq(BASE_IPI_IRQ, &ipi_intdesc); 23043afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 23143afdf508386342d714f6911c1976f934b520cb0Richard Kuo 23243afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid smp_send_reschedule(int cpu) 23343afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 23443afdf508386342d714f6911c1976f934b520cb0Richard Kuo send_ipi(cpumask_of(cpu), IPI_RESCHEDULE); 23543afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 23643afdf508386342d714f6911c1976f934b520cb0Richard Kuo 23743afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid smp_send_stop(void) 23843afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 23943afdf508386342d714f6911c1976f934b520cb0Richard Kuo struct cpumask targets; 24043afdf508386342d714f6911c1976f934b520cb0Richard Kuo cpumask_copy(&targets, cpu_online_mask); 24143afdf508386342d714f6911c1976f934b520cb0Richard Kuo cpumask_clear_cpu(smp_processor_id(), &targets); 24243afdf508386342d714f6911c1976f934b520cb0Richard Kuo send_ipi(&targets, IPI_CPU_STOP); 24343afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 24443afdf508386342d714f6911c1976f934b520cb0Richard Kuo 24543afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid arch_send_call_function_single_ipi(int cpu) 24643afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 247bd09f6061843d5266b0ae7ebc87255bd2ca95a49Jiang Liu send_ipi(cpumask_of(cpu), IPI_CALL_FUNC); 24843afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 24943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 25043afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid arch_send_call_function_ipi_mask(const struct cpumask *mask) 25143afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 25243afdf508386342d714f6911c1976f934b520cb0Richard Kuo send_ipi(mask, IPI_CALL_FUNC); 25343afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 25443afdf508386342d714f6911c1976f934b520cb0Richard Kuo 25543afdf508386342d714f6911c1976f934b520cb0Richard Kuoint setup_profiling_timer(unsigned int multiplier) 25643afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 25743afdf508386342d714f6911c1976f934b520cb0Richard Kuo return -EINVAL; 25843afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 25943afdf508386342d714f6911c1976f934b520cb0Richard Kuo 26043afdf508386342d714f6911c1976f934b520cb0Richard Kuovoid smp_start_cpus(void) 26143afdf508386342d714f6911c1976f934b520cb0Richard Kuo{ 26243afdf508386342d714f6911c1976f934b520cb0Richard Kuo int i; 26343afdf508386342d714f6911c1976f934b520cb0Richard Kuo 26443afdf508386342d714f6911c1976f934b520cb0Richard Kuo for (i = 0; i < NR_CPUS; i++) 2650b5f9c005def154f9c21f9be0223b65b50d54368Rusty Russell set_cpu_possible(i, true); 26643afdf508386342d714f6911c1976f934b520cb0Richard Kuo} 267