summaryrefslogtreecommitdiffstats
path: root/include/asm-i386/apic.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-i386/apic.h')
-rw-r--r--include/asm-i386/apic.h33
1 files changed, 21 insertions, 12 deletions
diff --git a/include/asm-i386/apic.h b/include/asm-i386/apic.h
index 3c6e6aa4b..9ee236336 100644
--- a/include/asm-i386/apic.h
+++ b/include/asm-i386/apic.h
@@ -3,6 +3,7 @@
#include <linux/config.h>
#include <asm/apicdef.h>
+#include <asm/system.h>
#define APIC_DEBUG 1
@@ -20,7 +21,12 @@
extern __inline void apic_write(unsigned long reg, unsigned long v)
{
- *((volatile unsigned long *)(APIC_BASE+reg))=v;
+ *((volatile unsigned long *)(APIC_BASE+reg)) = v;
+}
+
+extern __inline void apic_write_atomic(unsigned long reg, unsigned long v)
+{
+ xchg((volatile unsigned long *)(APIC_BASE+reg), v);
}
extern __inline unsigned long apic_read(unsigned long reg)
@@ -32,30 +38,33 @@ extern unsigned int apic_timer_irqs [NR_CPUS];
#ifdef CONFIG_X86_GOOD_APIC
# define FORCE_READ_AROUND_WRITE 0
-# define apic_readaround(x)
+# define apic_read_around(x)
+# define apic_write_around(x,y) apic_write((x),(y))
#else
# define FORCE_READ_AROUND_WRITE 1
-# define apic_readaround(x) apic_read(x)
+# define apic_read_around(x) apic_read(x)
+# define apic_write_around(x,y) apic_write_atomic((x),(y))
#endif
-#define apic_write_around(x,y) \
- do { apic_readaround(x); apic_write(x,y); } while (0)
-
extern inline void ack_APIC_irq(void)
{
- /* Clear the IPI */
-
- apic_readaround(APIC_EOI);
/*
- * on P6+ cores (CONFIG_X86_GOOD_APIC) ack_APIC_irq() actually
- * gets compiled as a single instruction ... yummie.
+ * ack_APIC_irq() actually gets compiled as a single instruction:
+ * - a single rmw on Pentium/82489DX
+ * - a single write on P6+ cores (CONFIG_X86_GOOD_APIC)
+ * ... yummie.
*/
- apic_write(APIC_EOI, 0); /* Docs say use 0 for future compatibility */
+
+ /* Docs say use 0 for future compatibility */
+ apic_write_around(APIC_EOI, 0);
}
extern int get_maxlvt(void);
+extern void connect_bsp_APIC (void);
+extern void disconnect_bsp_APIC (void);
extern void disable_local_APIC (void);
extern void cache_APIC_registers (void);
+extern void sync_Arb_IDs(void);
extern void setup_local_APIC (void);
extern void init_apic_mappings(void);
extern void smp_local_timer_interrupt(struct pt_regs * regs);