blob: 85dec630c69c3e1e0899aade50c4b41c89e7ce36 [file] [log] [blame]
H. Peter Anvin05e4d312008-10-23 00:01:39 -07001#ifndef _ASM_X86_MACH_DEFAULT_MACH_IPI_H
2#define _ASM_X86_MACH_DEFAULT_MACH_IPI_H
Linus Torvalds1da177e2005-04-16 15:20:36 -07003
Keith Owense77deac2006-06-26 13:59:56 +02004/* Avoid include hell */
5#define NMI_VECTOR 0x02
6
Ingo Molnardac5f412009-01-28 15:42:24 +01007void default_send_IPI_mask_bitmask(const struct cpumask *mask, int vector);
8void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
9void __default_send_IPI_shortcut(unsigned int shortcut, int vector);
Linus Torvalds1da177e2005-04-16 15:20:36 -070010
Ashok Raj67664c82005-06-25 14:54:52 -070011extern int no_broadcast;
12
Glauber Costa5af55732008-03-25 13:28:56 -030013#ifdef CONFIG_X86_64
14#include <asm/genapic.h>
Glauber Costa5af55732008-03-25 13:28:56 -030015#else
Ingo Molnardac5f412009-01-28 15:42:24 +010016static inline void default_send_IPI_mask(const struct cpumask *mask, int vector)
Linus Torvalds1da177e2005-04-16 15:20:36 -070017{
Ingo Molnardac5f412009-01-28 15:42:24 +010018 default_send_IPI_mask_bitmask(mask, vector);
Linus Torvalds1da177e2005-04-16 15:20:36 -070019}
Ingo Molnardac5f412009-01-28 15:42:24 +010020void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
Glauber Costa5af55732008-03-25 13:28:56 -030021#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070022
Ingo Molnardac5f412009-01-28 15:42:24 +010023static inline void __default_local_send_IPI_allbutself(int vector)
Ashok Raj67664c82005-06-25 14:54:52 -070024{
Mike Travise7986732008-12-16 17:33:52 -080025 if (no_broadcast || vector == NMI_VECTOR)
Ingo Molnardac5f412009-01-28 15:42:24 +010026 apic->send_IPI_mask_allbutself(cpu_online_mask, vector);
Mike Travise7986732008-12-16 17:33:52 -080027 else
Ingo Molnardac5f412009-01-28 15:42:24 +010028 __default_send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
Ashok Raj67664c82005-06-25 14:54:52 -070029}
30
Ingo Molnardac5f412009-01-28 15:42:24 +010031static inline void __default_local_send_IPI_all(int vector)
Ashok Raj67664c82005-06-25 14:54:52 -070032{
Keith Owense77deac2006-06-26 13:59:56 +020033 if (no_broadcast || vector == NMI_VECTOR)
Ingo Molnardac5f412009-01-28 15:42:24 +010034 apic->send_IPI_mask(cpu_online_mask, vector);
Ashok Raj67664c82005-06-25 14:54:52 -070035 else
Ingo Molnardac5f412009-01-28 15:42:24 +010036 __default_send_IPI_shortcut(APIC_DEST_ALLINC, vector);
Ashok Raj67664c82005-06-25 14:54:52 -070037}
38
Ingo Molnardac5f412009-01-28 15:42:24 +010039#ifdef CONFIG_X86_32
40static inline void default_send_IPI_allbutself(int vector)
Linus Torvalds1da177e2005-04-16 15:20:36 -070041{
42 /*
43 * if there are no other CPUs in the system then we get an APIC send
44 * error if we try to broadcast, thus avoid sending IPIs in this case.
45 */
46 if (!(num_online_cpus() > 1))
47 return;
48
Ingo Molnardac5f412009-01-28 15:42:24 +010049 __default_local_send_IPI_allbutself(vector);
Linus Torvalds1da177e2005-04-16 15:20:36 -070050}
51
Ingo Molnardac5f412009-01-28 15:42:24 +010052static inline void default_send_IPI_all(int vector)
Linus Torvalds1da177e2005-04-16 15:20:36 -070053{
Ingo Molnardac5f412009-01-28 15:42:24 +010054 __default_local_send_IPI_all(vector);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055}
Glauber Costa5af55732008-03-25 13:28:56 -030056#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
H. Peter Anvin05e4d312008-10-23 00:01:39 -070058#endif /* _ASM_X86_MACH_DEFAULT_MACH_IPI_H */