2005-04-16 15:20:36 -07:00
/*
2008-08-02 10:55:55 +01:00
* arch / arm / include / asm / smp . h
2005-04-16 15:20:36 -07:00
*
* Copyright ( C ) 2004 - 2005 ARM Ltd .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef __ASM_ARM_SMP_H
# define __ASM_ARM_SMP_H
# include <linux/threads.h>
# include <linux/cpumask.h>
# include <linux/thread_info.h>
# ifndef CONFIG_SMP
2008-08-02 10:55:55 +01:00
# error "<asm / smp.h> included in non-SMP build"
2005-04-16 15:20:36 -07:00
# endif
2005-06-21 17:14:34 -07:00
# define raw_smp_processor_id() (current_thread_info()->cpu)
2005-04-16 15:20:36 -07:00
struct seq_file ;
/*
* generate IPI list text
*/
2010-11-15 14:33:51 +00:00
extern void show_ipi_list ( struct seq_file * , int ) ;
2005-04-16 15:20:36 -07:00
2005-11-08 15:35:23 +00:00
/*
* Called from assembly code , this handles an IPI .
*/
2010-11-15 09:42:08 +00:00
asmlinkage void do_IPI ( int ipinr , struct pt_regs * regs ) ;
2005-11-08 15:35:23 +00:00
2011-10-06 15:18:14 +01:00
/*
* Called from C code , this handles an IPI .
*/
void handle_IPI ( int ipinr , struct pt_regs * regs ) ;
2006-02-16 11:08:09 +00:00
/*
2009-05-28 14:16:52 +01:00
* Setup the set of possible CPUs ( via set_cpu_possible )
2006-02-16 11:08:09 +00:00
*/
extern void smp_init_cpus ( void ) ;
2005-04-16 15:20:36 -07:00
/*
2011-04-03 13:01:30 +01:00
* Provide a function to raise an IPI cross call on CPUs in callmap .
2005-04-16 15:20:36 -07:00
*/
2011-04-03 13:01:30 +01:00
extern void set_smp_cross_call ( void ( * ) ( const struct cpumask * , unsigned int ) ) ;
2005-11-08 10:40:10 +00:00
2005-11-08 15:35:23 +00:00
/*
* Called from platform specific assembly code , this is the
* secondary CPU entry point .
*/
asmlinkage void secondary_start_kernel ( void ) ;
2010-12-03 11:09:48 +00:00
2005-06-18 09:33:31 +01:00
/*
* Initial data for bringing up a secondary CPU .
*/
struct secondary_data {
2013-02-22 18:51:30 +00:00
union {
unsigned long mpu_rgn_szr ;
2015-04-04 20:09:46 +01:00
u64 pgdir ;
2013-02-22 18:51:30 +00:00
} ;
2011-05-26 11:22:44 +01:00
unsigned long swapper_pg_dir ;
2005-06-18 09:33:31 +01:00
void * stack ;
} ;
extern struct secondary_data secondary_data ;
2012-06-12 11:16:27 +01:00
extern volatile int pen_release ;
2014-03-16 18:04:54 +01:00
extern void secondary_startup ( void ) ;
2015-05-18 09:06:13 +01:00
extern void secondary_startup_arm ( void ) ;
2005-06-18 09:33:31 +01:00
2005-11-02 22:24:33 +00:00
extern int __cpu_disable ( void ) ;
extern void __cpu_die ( unsigned int cpu ) ;
2008-06-10 20:48:30 +02:00
extern void arch_send_call_function_single_ipi ( int cpu ) ;
2009-05-17 16:20:18 +01:00
extern void arch_send_call_function_ipi_mask ( const struct cpumask * mask ) ;
2012-11-06 03:48:40 +01:00
extern void arch_send_wakeup_ipi_mask ( const struct cpumask * mask ) ;
2008-06-10 20:48:30 +02:00
2012-11-27 21:54:41 -05:00
extern int register_ipi_completion ( struct completion * completion , int cpu ) ;
2011-09-08 09:06:10 +01:00
struct smp_operations {
# ifdef CONFIG_SMP
/*
* Setup the set of possible CPUs ( via set_cpu_possible )
*/
void ( * smp_init_cpus ) ( void ) ;
/*
* Initialize cpu_possible map , and enable coherency
*/
void ( * smp_prepare_cpus ) ( unsigned int max_cpus ) ;
/*
* Perform platform specific initialisation of the specified CPU .
*/
void ( * smp_secondary_init ) ( unsigned int cpu ) ;
/*
* Boot a secondary CPU , and assign it the specified idle task .
* This also gives us the initial stack to use for this CPU .
*/
int ( * smp_boot_secondary ) ( unsigned int cpu , struct task_struct * idle ) ;
# ifdef CONFIG_HOTPLUG_CPU
int ( * cpu_kill ) ( unsigned int cpu ) ;
void ( * cpu_die ) ( unsigned int cpu ) ;
2015-07-29 00:34:48 +01:00
bool ( * cpu_can_disable ) ( unsigned int cpu ) ;
2011-09-08 09:06:10 +01:00
int ( * cpu_disable ) ( unsigned int cpu ) ;
# endif
# endif
} ;
2013-10-30 18:21:09 -07:00
struct of_cpu_method {
const char * method ;
2015-08-26 07:49:12 +01:00
const struct smp_operations * ops ;
2013-10-30 18:21:09 -07:00
} ;
# define CPU_METHOD_OF_DECLARE(name, _method, _ops) \
static const struct of_cpu_method __cpu_method_of_table_ # # name \
__used __section ( __cpu_method_of_table ) \
= { . method = _method , . ops = _ops }
2011-09-08 09:06:10 +01:00
/*
* set platform specific SMP operations
*/
2015-08-26 07:49:11 +01:00
extern void smp_set_ops ( const struct smp_operations * ) ;
2011-09-08 09:06:10 +01:00
2005-04-16 15:20:36 -07:00
# endif /* ifndef __ASM_ARM_SMP_H */