2005-04-17 02:20:36 +04:00
# ifndef __ASM_MACH_IPI_H
# define __ASM_MACH_IPI_H
2006-06-26 15:59:56 +04:00
/* Avoid include hell */
# define NMI_VECTOR 0x02
2005-04-17 02:20:36 +04:00
void send_IPI_mask_bitmask ( cpumask_t mask , int vector ) ;
void __send_IPI_shortcut ( unsigned int shortcut , int vector ) ;
2005-06-26 01:54:52 +04:00
extern int no_broadcast ;
2005-04-17 02:20:36 +04:00
static inline void send_IPI_mask ( cpumask_t mask , int vector )
{
send_IPI_mask_bitmask ( mask , vector ) ;
}
2005-06-26 01:54:52 +04:00
static inline void __local_send_IPI_allbutself ( int vector )
{
2006-06-26 15:59:56 +04:00
if ( no_broadcast | | vector = = NMI_VECTOR ) {
2005-06-26 01:54:52 +04:00
cpumask_t mask = cpu_online_map ;
2006-01-12 00:43:09 +03:00
cpu_clear ( smp_processor_id ( ) , mask ) ;
2005-06-26 01:54:52 +04:00
send_IPI_mask ( mask , vector ) ;
} else
__send_IPI_shortcut ( APIC_DEST_ALLBUT , vector ) ;
}
static inline void __local_send_IPI_all ( int vector )
{
2006-06-26 15:59:56 +04:00
if ( no_broadcast | | vector = = NMI_VECTOR )
2005-06-26 01:54:52 +04:00
send_IPI_mask ( cpu_online_map , vector ) ;
else
__send_IPI_shortcut ( APIC_DEST_ALLINC , vector ) ;
}
2005-04-17 02:20:36 +04:00
static inline void send_IPI_allbutself ( int vector )
{
/*
* if there are no other CPUs in the system then we get an APIC send
* error if we try to broadcast , thus avoid sending IPIs in this case .
*/
if ( ! ( num_online_cpus ( ) > 1 ) )
return ;
2005-06-26 01:54:52 +04:00
__local_send_IPI_allbutself ( vector ) ;
2005-04-17 02:20:36 +04:00
return ;
}
static inline void send_IPI_all ( int vector )
{
2005-06-26 01:54:52 +04:00
__local_send_IPI_all ( vector ) ;
2005-04-17 02:20:36 +04:00
}
# endif /* __ASM_MACH_IPI_H */