#ifndef __ASM_APIC_H #define __ASM_APIC_H #include #include #define APIC_DEBUG 1 #ifdef CONFIG_X86_LOCAL_APIC #if APIC_DEBUG #define Dprintk(x...) printk(##x) #else #define Dprintk(x...) #endif /* * Basic functions accessing APICs. */ extern __inline void apic_write(unsigned long reg, unsigned long v) { *((volatile unsigned long *)(APIC_BASE+reg))=v; } extern __inline unsigned long apic_read(unsigned long reg) { return *((volatile unsigned long *)(APIC_BASE+reg)); } extern unsigned int apic_timer_irqs [NR_CPUS]; #ifdef CONFIG_X86_GOOD_APIC # define FORCE_READ_AROUND_WRITE 0 # define apic_readaround(x) #else # define FORCE_READ_AROUND_WRITE 1 # define apic_readaround(x) apic_read(x) #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. */ apic_write(APIC_EOI, 0); /* Docs say use 0 for future compatibility */ } extern int get_maxlvt(void); extern void disable_local_APIC (void); extern void cache_APIC_registers (void); extern void setup_local_APIC (void); extern void init_apic_mappings(void); extern void smp_local_timer_interrupt(struct pt_regs * regs); extern void setup_APIC_clocks(void); #endif #endif