aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYinghai Lu <yhlu.kernel@gmail.com>2008-07-11 21:41:54 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-12 02:45:12 -0400
commitc535b6a1a685eb23f96e2c221777d6c1e05080d5 (patch)
treeb21eda3f5693f680a2bed64e731013c011459246
parentaf9d13887f9e3699bbc852c39b076d30bb9dff2f (diff)
x86: let 32bit use apic_ops too
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> Cc: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/kernel/apic_32.c39
-rw-r--r--include/asm-x86/apic.h13
2 files changed, 33 insertions, 19 deletions
diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c
index 2a83c07bd887..7413354c9ffd 100644
--- a/arch/x86/kernel/apic_32.c
+++ b/arch/x86/kernel/apic_32.c
@@ -145,19 +145,13 @@ static int modern_apic(void)
145 return lapic_get_version() >= 0x14; 145 return lapic_get_version() >= 0x14;
146} 146}
147 147
148void apic_icr_write(u32 low, u32 id) 148void xapic_wait_icr_idle(void)
149{
150 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(id));
151 apic_write_around(APIC_ICR, low);
152}
153
154void apic_wait_icr_idle(void)
155{ 149{
156 while (apic_read(APIC_ICR) & APIC_ICR_BUSY) 150 while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
157 cpu_relax(); 151 cpu_relax();
158} 152}
159 153
160u32 safe_apic_wait_icr_idle(void) 154u32 safe_xapic_wait_icr_idle(void)
161{ 155{
162 u32 send_status; 156 u32 send_status;
163 int timeout; 157 int timeout;
@@ -173,6 +167,35 @@ u32 safe_apic_wait_icr_idle(void)
173 return send_status; 167 return send_status;
174} 168}
175 169
170void xapic_icr_write(u32 low, u32 id)
171{
172 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(id));
173 apic_write_around(APIC_ICR, low);
174}
175
176u64 xapic_icr_read(void)
177{
178 u32 icr1, icr2;
179
180 icr2 = apic_read(APIC_ICR2);
181 icr1 = apic_read(APIC_ICR);
182
183 return icr1 | ((u64)icr2 << 32);
184}
185
186static struct apic_ops xapic_ops = {
187 .read = native_apic_mem_read,
188 .write = native_apic_mem_write,
189 .write_atomic = native_apic_mem_write_atomic,
190 .icr_read = xapic_icr_read,
191 .icr_write = xapic_icr_write,
192 .wait_icr_idle = xapic_wait_icr_idle,
193 .safe_wait_icr_idle = safe_xapic_wait_icr_idle,
194};
195
196struct apic_ops __read_mostly *apic_ops = &xapic_ops;
197EXPORT_SYMBOL_GPL(apic_ops);
198
176/** 199/**
177 * enable_NMI_through_LVT0 - enable NMI through local vector table 0 200 * enable_NMI_through_LVT0 - enable NMI through local vector table 0
178 */ 201 */
diff --git a/include/asm-x86/apic.h b/include/asm-x86/apic.h
index 129752dd2525..fcd2f01277b6 100644
--- a/include/asm-x86/apic.h
+++ b/include/asm-x86/apic.h
@@ -49,11 +49,6 @@ extern int disable_apic;
49#ifdef CONFIG_PARAVIRT 49#ifdef CONFIG_PARAVIRT
50#include <asm/paravirt.h> 50#include <asm/paravirt.h>
51#else 51#else
52#ifndef CONFIG_X86_64
53#define apic_write native_apic_mem_write
54#define apic_write_atomic native_apic_mem_write_atomic
55#define apic_read native_apic_mem_read
56#endif
57#define setup_boot_clock setup_boot_APIC_clock 52#define setup_boot_clock setup_boot_APIC_clock
58#define setup_secondary_clock setup_secondary_APIC_clock 53#define setup_secondary_clock setup_secondary_APIC_clock
59#endif 54#endif
@@ -95,16 +90,13 @@ static inline u32 native_apic_msr_read(u32 reg)
95 return low; 90 return low;
96} 91}
97 92
98#ifdef CONFIG_X86_32 93#ifndef CONFIG_X86_32
99extern void apic_wait_icr_idle(void);
100extern u32 safe_apic_wait_icr_idle(void);
101extern void apic_icr_write(u32 low, u32 id);
102#else
103extern int x2apic, x2apic_preenabled; 94extern int x2apic, x2apic_preenabled;
104extern void check_x2apic(void); 95extern void check_x2apic(void);
105extern void enable_x2apic(void); 96extern void enable_x2apic(void);
106extern void enable_IR_x2apic(void); 97extern void enable_IR_x2apic(void);
107extern void x2apic_icr_write(u32 low, u32 id); 98extern void x2apic_icr_write(u32 low, u32 id);
99#endif
108 100
109struct apic_ops { 101struct apic_ops {
110 u32 (*read)(u32 reg); 102 u32 (*read)(u32 reg);
@@ -125,7 +117,6 @@ extern struct apic_ops *apic_ops;
125#define apic_icr_write (apic_ops->icr_write) 117#define apic_icr_write (apic_ops->icr_write)
126#define apic_wait_icr_idle (apic_ops->wait_icr_idle) 118#define apic_wait_icr_idle (apic_ops->wait_icr_idle)
127#define safe_apic_wait_icr_idle (apic_ops->safe_wait_icr_idle) 119#define safe_apic_wait_icr_idle (apic_ops->safe_wait_icr_idle)
128#endif
129 120
130extern int get_physical_broadcast(void); 121extern int get_physical_broadcast(void);
131 122