aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-x86_64
diff options
context:
space:
mode:
authorFernando Luis [** ISO-8859-1 charset **] VázquezCao <fernando@oss.ntt.co.jp>2007-05-02 13:27:18 -0400
committerAndi Kleen <andi@basil.nowhere.org>2007-05-02 13:27:18 -0400
commit9062d888aa448318e38792b6879a795dd10adda4 (patch)
treefacddd433abf2adcc342bdcfb1ff5ddb3704b519 /include/asm-x86_64
parent45ae5e968ea01d8326833ca2863cec5183ce1930 (diff)
[PATCH] x86-64: __send_IPI_dest_field - x86_64
Implement __send_IPI_dest_field which can be used to send IPIs when the "destination shorthand" field of the ICR is set to 00 (destination field). Use it whenever possible. Signed-off-by: Fernando Luis Vazquez Cao <fernando@oss.ntt.co.jp> Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'include/asm-x86_64')
-rw-r--r--include/asm-x86_64/ipi.h54
1 files changed, 32 insertions, 22 deletions
diff --git a/include/asm-x86_64/ipi.h b/include/asm-x86_64/ipi.h
index ffa6f1517f1a..26961e671948 100644
--- a/include/asm-x86_64/ipi.h
+++ b/include/asm-x86_64/ipi.h
@@ -74,10 +74,39 @@ static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, unsign
74 apic_write(APIC_ICR, cfg); 74 apic_write(APIC_ICR, cfg);
75} 75}
76 76
77/*
78 * This is used to send an IPI with no shorthand notation (the destination is
79 * specified in bits 56 to 63 of the ICR).
80 */
81static inline void __send_IPI_dest_field(unsigned int mask, int vector, unsigned int dest)
82{
83 unsigned long cfg;
84
85 /*
86 * Wait for idle.
87 */
88 apic_wait_icr_idle();
89
90 /*
91 * prepare target chip field
92 */
93 cfg = __prepare_ICR2(mask);
94 apic_write(APIC_ICR2, cfg);
95
96 /*
97 * program the ICR
98 */
99 cfg = __prepare_ICR(0, vector, dest);
100
101 /*
102 * Send the IPI. The write to APIC_ICR fires this off.
103 */
104 apic_write(APIC_ICR, cfg);
105}
77 106
78static inline void send_IPI_mask_sequence(cpumask_t mask, int vector) 107static inline void send_IPI_mask_sequence(cpumask_t mask, int vector)
79{ 108{
80 unsigned long cfg, flags; 109 unsigned long flags;
81 unsigned long query_cpu; 110 unsigned long query_cpu;
82 111
83 /* 112 /*
@@ -86,28 +115,9 @@ static inline void send_IPI_mask_sequence(cpumask_t mask, int vector)
86 * - mbligh 115 * - mbligh
87 */ 116 */
88 local_irq_save(flags); 117 local_irq_save(flags);
89
90 for_each_cpu_mask(query_cpu, mask) { 118 for_each_cpu_mask(query_cpu, mask) {
91 /* 119 __send_IPI_dest_field(x86_cpu_to_apicid[query_cpu],
92 * Wait for idle. 120 vector, APIC_DEST_PHYSICAL);
93 */
94 apic_wait_icr_idle();
95
96 /*
97 * prepare target chip field
98 */
99 cfg = __prepare_ICR2(x86_cpu_to_apicid[query_cpu]);
100 apic_write(APIC_ICR2, cfg);
101
102 /*
103 * program the ICR
104 */
105 cfg = __prepare_ICR(0, vector, APIC_DEST_PHYSICAL);
106
107 /*
108 * Send the IPI. The write to APIC_ICR fires this off.
109 */
110 apic_write(APIC_ICR, cfg);
111 } 121 }
112 local_irq_restore(flags); 122 local_irq_restore(flags);
113} 123}