2005-04-16 15:20:36 -07:00
/*
2012-07-20 11:15:04 +02:00
* Copyright IBM Corp . 1999 , 2012
2009-12-07 12:52:07 +01:00
* Author ( s ) : Denis Joseph Barrow ,
* Martin Schwidefsky < schwidefsky @ de . ibm . com > ,
* Heiko Carstens < heiko . carstens @ de . ibm . com > ,
2005-04-16 15:20:36 -07:00
*/
# ifndef __ASM_SMP_H
# define __ASM_SMP_H
2014-04-04 11:23:03 +02:00
# include <asm/sigp.h>
2009-12-07 12:52:07 +01:00
# ifdef CONFIG_SMP
2005-04-16 15:20:36 -07:00
2012-03-28 18:30:02 +01:00
# include <asm/lowcore.h>
2007-02-05 21:16:47 +01:00
2009-03-26 15:24:42 +01:00
# define raw_smp_processor_id() (S390_lowcore.cpu_nr)
2005-04-16 15:20:36 -07:00
2008-04-17 07:46:12 +02:00
extern struct mutex smp_cpu_state_mutex ;
2012-03-11 11:59:26 -04:00
2012-04-20 13:05:42 +00:00
extern int __cpu_up ( unsigned int cpu , struct task_struct * tidle ) ;
2008-04-17 07:46:12 +02:00
2008-12-25 13:38:39 +01:00
extern void arch_send_call_function_single_ipi ( int cpu ) ;
2009-09-24 09:34:45 -06:00
extern void arch_send_call_function_ipi_mask ( const struct cpumask * mask ) ;
2008-12-25 13:38:39 +01:00
2012-03-11 11:59:26 -04:00
extern void smp_call_online_cpu ( void ( * func ) ( void * ) , void * ) ;
extern void smp_call_ipl_cpu ( void ( * func ) ( void * ) , void * ) ;
2010-02-26 22:37:34 +01:00
2012-03-11 11:59:26 -04:00
extern int smp_find_processor_id ( u16 address ) ;
extern int smp_store_status ( int cpu ) ;
extern int smp_vcpu_scheduled ( int cpu ) ;
extern void smp_yield_cpu ( int cpu ) ;
2012-09-04 17:36:16 +02:00
extern void smp_cpu_set_polarization ( int cpu , int val ) ;
extern int smp_cpu_get_polarization ( int cpu ) ;
2013-12-16 14:31:26 +01:00
extern void smp_fill_possible_mask ( void ) ;
2010-02-26 22:37:40 +01:00
2010-02-26 22:37:34 +01:00
# else /* CONFIG_SMP */
2012-03-11 11:59:26 -04:00
static inline void smp_call_ipl_cpu ( void ( * func ) ( void * ) , void * data )
2010-02-26 22:37:34 +01:00
{
func ( data ) ;
}
2012-03-11 11:59:26 -04:00
static inline void smp_call_online_cpu ( void ( * func ) ( void * ) , void * data )
2011-10-30 15:16:38 +01:00
{
2012-03-11 11:59:26 -04:00
func ( data ) ;
2011-10-30 15:16:38 +01:00
}
2012-08-27 15:38:19 +02:00
static inline int smp_find_processor_id ( u16 address ) { return 0 ; }
2012-08-27 15:18:45 +02:00
static inline int smp_store_status ( int cpu ) { return 0 ; }
2012-03-11 11:59:26 -04:00
static inline int smp_vcpu_scheduled ( int cpu ) { return 1 ; }
static inline void smp_yield_cpu ( int cpu ) { }
2013-12-16 14:31:26 +01:00
static inline void smp_fill_possible_mask ( void ) { }
2010-02-26 22:37:40 +01:00
2014-04-15 11:25:28 +02:00
# endif /* CONFIG_SMP */
2014-04-04 11:23:03 +02:00
static inline void smp_stop_cpu ( void )
{
u16 pcpu = stap ( ) ;
for ( ; ; ) {
__pcpu_sigp ( pcpu , SIGP_STOP , 0 , NULL ) ;
cpu_relax ( ) ;
}
}
2008-04-30 13:38:37 +02:00
# ifdef CONFIG_HOTPLUG_CPU
extern int smp_rescan_cpus ( void ) ;
2011-01-05 12:48:09 +01:00
extern void __noreturn cpu_die ( void ) ;
2012-03-11 11:59:26 -04:00
extern void __cpu_die ( unsigned int cpu ) ;
extern int __cpu_disable ( void ) ;
2008-04-30 13:38:37 +02:00
# else
static inline int smp_rescan_cpus ( void ) { return 0 ; }
2011-01-05 12:48:09 +01:00
static inline void cpu_die ( void ) { }
2008-04-30 13:38:37 +02:00
# endif
2009-12-07 12:52:07 +01:00
# endif /* __ASM_SMP_H */