blob: 089399643dfac99f97b79f119d76e239b03b94a2 [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
Mike Travisbcda0162008-12-16 17:33:59 -08007void send_IPI_mask_bitmask(const struct cpumask *mask, int vector);
8void send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
Linus Torvalds1da177e2005-04-16 15:20:36 -07009void __send_IPI_shortcut(unsigned int shortcut, int vector);
10
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>
Ingo Molnarc8d46cf2009-01-28 00:14:11 +010015#define send_IPI_mask (apic->send_IPI_mask)
16#define send_IPI_mask_allbutself (apic->send_IPI_mask_allbutself)
Glauber Costa5af55732008-03-25 13:28:56 -030017#else
Mike Travisbcda0162008-12-16 17:33:59 -080018static inline void send_IPI_mask(const struct cpumask *mask, int vector)
Linus Torvalds1da177e2005-04-16 15:20:36 -070019{
20 send_IPI_mask_bitmask(mask, vector);
21}
Mike Travisbcda0162008-12-16 17:33:59 -080022void send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
Glauber Costa5af55732008-03-25 13:28:56 -030023#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Ashok Raj67664c82005-06-25 14:54:52 -070025static inline void __local_send_IPI_allbutself(int vector)
26{
Mike Travise7986732008-12-16 17:33:52 -080027 if (no_broadcast || vector == NMI_VECTOR)
Mike Travisbcda0162008-12-16 17:33:59 -080028 send_IPI_mask_allbutself(cpu_online_mask, vector);
Mike Travise7986732008-12-16 17:33:52 -080029 else
Ashok Raj67664c82005-06-25 14:54:52 -070030 __send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
31}
32
33static inline void __local_send_IPI_all(int vector)
34{
Keith Owense77deac2006-06-26 13:59:56 +020035 if (no_broadcast || vector == NMI_VECTOR)
Mike Travisbcda0162008-12-16 17:33:59 -080036 send_IPI_mask(cpu_online_mask, vector);
Ashok Raj67664c82005-06-25 14:54:52 -070037 else
38 __send_IPI_shortcut(APIC_DEST_ALLINC, vector);
39}
40
Glauber Costa5af55732008-03-25 13:28:56 -030041#ifdef CONFIG_X86_64
Ingo Molnarc8d46cf2009-01-28 00:14:11 +010042#define send_IPI_allbutself (apic->send_IPI_allbutself)
43#define send_IPI_all (apic->send_IPI_all)
Glauber Costa5af55732008-03-25 13:28:56 -030044#else
Linus Torvalds1da177e2005-04-16 15:20:36 -070045static inline void send_IPI_allbutself(int vector)
46{
47 /*
48 * if there are no other CPUs in the system then we get an APIC send
49 * error if we try to broadcast, thus avoid sending IPIs in this case.
50 */
51 if (!(num_online_cpus() > 1))
52 return;
53
Ashok Raj67664c82005-06-25 14:54:52 -070054 __local_send_IPI_allbutself(vector);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 return;
56}
57
58static inline void send_IPI_all(int vector)
59{
Ashok Raj67664c82005-06-25 14:54:52 -070060 __local_send_IPI_all(vector);
Linus Torvalds1da177e2005-04-16 15:20:36 -070061}
Glauber Costa5af55732008-03-25 13:28:56 -030062#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
H. Peter Anvin05e4d312008-10-23 00:01:39 -070064#endif /* _ASM_X86_MACH_DEFAULT_MACH_IPI_H */