diff options
author | Yinghai Lu <yhlu.kernel@gmail.com> | 2008-07-11 21:41:54 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-12 02:45:12 -0400 |
commit | c535b6a1a685eb23f96e2c221777d6c1e05080d5 (patch) | |
tree | b21eda3f5693f680a2bed64e731013c011459246 | |
parent | af9d13887f9e3699bbc852c39b076d30bb9dff2f (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.c | 39 | ||||
-rw-r--r-- | include/asm-x86/apic.h | 13 |
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 | ||
148 | void apic_icr_write(u32 low, u32 id) | 148 | void 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 | |||
154 | void 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 | ||
160 | u32 safe_apic_wait_icr_idle(void) | 154 | u32 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 | ||
170 | void 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 | |||
176 | u64 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 | |||
186 | static 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 | |||
196 | struct apic_ops __read_mostly *apic_ops = &xapic_ops; | ||
197 | EXPORT_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 |
99 | extern void apic_wait_icr_idle(void); | ||
100 | extern u32 safe_apic_wait_icr_idle(void); | ||
101 | extern void apic_icr_write(u32 low, u32 id); | ||
102 | #else | ||
103 | extern int x2apic, x2apic_preenabled; | 94 | extern int x2apic, x2apic_preenabled; |
104 | extern void check_x2apic(void); | 95 | extern void check_x2apic(void); |
105 | extern void enable_x2apic(void); | 96 | extern void enable_x2apic(void); |
106 | extern void enable_IR_x2apic(void); | 97 | extern void enable_IR_x2apic(void); |
107 | extern void x2apic_icr_write(u32 low, u32 id); | 98 | extern void x2apic_icr_write(u32 low, u32 id); |
99 | #endif | ||
108 | 100 | ||
109 | struct apic_ops { | 101 | struct 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 | ||
130 | extern int get_physical_broadcast(void); | 121 | extern int get_physical_broadcast(void); |
131 | 122 | ||