diff options
Diffstat (limited to 'include/asm-i386/apic.h')
-rw-r--r-- | include/asm-i386/apic.h | 33 |
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); |