Home | History | Annotate | Download | only in asm-arm
      1 /*
      2  *  linux/include/asm-arm/smp.h
      3  *
      4  *  Copyright (C) 2004-2005 ARM Ltd.
      5  *
      6  * This program is free software; you can redistribute it and/or modify
      7  * it under the terms of the GNU General Public License version 2 as
      8  * published by the Free Software Foundation.
      9  */
     10 #ifndef __ASM_ARM_SMP_H
     11 #define __ASM_ARM_SMP_H
     12 
     13 #include <linux/threads.h>
     14 #include <linux/cpumask.h>
     15 #include <linux/thread_info.h>
     16 
     17 #include <asm/arch/smp.h>
     18 
     19 #ifndef CONFIG_SMP
     20 # error "<asm-arm/smp.h> included in non-SMP build"
     21 #endif
     22 
     23 #define raw_smp_processor_id() (current_thread_info()->cpu)
     24 
     25 /*
     26  * at the moment, there's not a big penalty for changing CPUs
     27  * (the >big< penalty is running SMP in the first place)
     28  */
     29 #define PROC_CHANGE_PENALTY		15
     30 
     31 struct seq_file;
     32 
     33 /*
     34  * generate IPI list text
     35  */
     36 extern void show_ipi_list(struct seq_file *p);
     37 
     38 /*
     39  * Called from assembly code, this handles an IPI.
     40  */
     41 asmlinkage void do_IPI(struct pt_regs *regs);
     42 
     43 /*
     44  * Setup the SMP cpu_possible_map
     45  */
     46 extern void smp_init_cpus(void);
     47 
     48 /*
     49  * Move global data into per-processor storage.
     50  */
     51 extern void smp_store_cpu_info(unsigned int cpuid);
     52 
     53 /*
     54  * Raise an IPI cross call on CPUs in callmap.
     55  */
     56 extern void smp_cross_call(cpumask_t callmap);
     57 
     58 /*
     59  * Broadcast a timer interrupt to the other CPUs.
     60  */
     61 extern void smp_send_timer(void);
     62 
     63 /*
     64  * Boot a secondary CPU, and assign it the specified idle task.
     65  * This also gives us the initial stack to use for this CPU.
     66  */
     67 extern int boot_secondary(unsigned int cpu, struct task_struct *);
     68 
     69 /*
     70  * Called from platform specific assembly code, this is the
     71  * secondary CPU entry point.
     72  */
     73 asmlinkage void secondary_start_kernel(void);
     74 
     75 /*
     76  * Perform platform specific initialisation of the specified CPU.
     77  */
     78 extern void platform_secondary_init(unsigned int cpu);
     79 
     80 /*
     81  * Initial data for bringing up a secondary CPU.
     82  */
     83 struct secondary_data {
     84 	unsigned long pgdir;
     85 	void *stack;
     86 };
     87 extern struct secondary_data secondary_data;
     88 
     89 extern int __cpu_disable(void);
     90 extern int mach_cpu_disable(unsigned int cpu);
     91 
     92 extern void __cpu_die(unsigned int cpu);
     93 extern void cpu_die(void);
     94 
     95 extern void platform_cpu_die(unsigned int cpu);
     96 extern int platform_cpu_kill(unsigned int cpu);
     97 extern void platform_cpu_enable(unsigned int cpu);
     98 
     99 #ifdef CONFIG_LOCAL_TIMERS
    100 /*
    101  * Setup a local timer interrupt for a CPU.
    102  */
    103 extern void local_timer_setup(unsigned int cpu);
    104 
    105 /*
    106  * Stop a local timer interrupt.
    107  */
    108 extern void local_timer_stop(unsigned int cpu);
    109 
    110 /*
    111  * Platform provides this to acknowledge a local timer IRQ
    112  */
    113 extern int local_timer_ack(void);
    114 
    115 #else
    116 
    117 static inline void local_timer_setup(unsigned int cpu)
    118 {
    119 }
    120 
    121 static inline void local_timer_stop(unsigned int cpu)
    122 {
    123 }
    124 
    125 #endif
    126 
    127 /*
    128  * show local interrupt info
    129  */
    130 extern void show_local_irqs(struct seq_file *);
    131 
    132 /*
    133  * Called from assembly, this is the local timer IRQ handler
    134  */
    135 asmlinkage void do_local_timer(struct pt_regs *);
    136 
    137 #endif /* ifndef __ASM_ARM_SMP_H */
    138