x86, apic: untangle the send_IPI_*() jungle
[linux-2.6-block.git] / arch / x86 / include / asm / mach-default / mach_ipi.h
1 #ifndef _ASM_X86_MACH_DEFAULT_MACH_IPI_H
2 #define _ASM_X86_MACH_DEFAULT_MACH_IPI_H
3
4 /* Avoid include hell */
5 #define NMI_VECTOR 0x02
6
7 void default_send_IPI_mask_bitmask(const struct cpumask *mask, int vector);
8 void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
9 void __default_send_IPI_shortcut(unsigned int shortcut, int vector);
10
11 extern int no_broadcast;
12
13 #ifdef CONFIG_X86_64
14 #include <asm/genapic.h>
15 #else
16 static inline void default_send_IPI_mask(const struct cpumask *mask, int vector)
17 {
18         default_send_IPI_mask_bitmask(mask, vector);
19 }
20 void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
21 #endif
22
23 static inline void __default_local_send_IPI_allbutself(int vector)
24 {
25         if (no_broadcast || vector == NMI_VECTOR)
26                 apic->send_IPI_mask_allbutself(cpu_online_mask, vector);
27         else
28                 __default_send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
29 }
30
31 static inline void __default_local_send_IPI_all(int vector)
32 {
33         if (no_broadcast || vector == NMI_VECTOR)
34                 apic->send_IPI_mask(cpu_online_mask, vector);
35         else
36                 __default_send_IPI_shortcut(APIC_DEST_ALLINC, vector);
37 }
38
39 #ifdef CONFIG_X86_32
40 static inline void default_send_IPI_allbutself(int vector)
41 {
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
49         __default_local_send_IPI_allbutself(vector);
50 }
51
52 static inline void default_send_IPI_all(int vector)
53 {
54         __default_local_send_IPI_all(vector);
55 }
56 #endif
57
58 #endif /* _ASM_X86_MACH_DEFAULT_MACH_IPI_H */