2008-10-22 22:26:29 -07:00
# ifndef _ASM_X86_HW_IRQ_H
# define _ASM_X86_HW_IRQ_H
2008-05-02 19:00:30 +02:00
/*
* ( C ) 1992 , 1993 Linus Torvalds , ( C ) 1997 Ingo Molnar
*
* moved some of the old arch / i386 / kernel / irq . h to here . VY
*
* IRQ / IPI changes taken from work by Thomas Radke
* < tomsoft @ informatik . tu - chemnitz . de >
*
* hacked by Andi Kleen for x86 - 64.
* unified by tglx
*/
2008-05-02 20:10:09 +02:00
# include <asm/irq_vectors.h>
2008-05-02 19:00:30 +02:00
# ifndef __ASSEMBLY__
# include <linux/percpu.h>
# include <linux/profile.h>
# include <linux/smp.h>
# include <asm/atomic.h>
# include <asm/irq.h>
# include <asm/sections.h>
# define platform_legacy_irq(irq) ((irq) < 16)
/* Interrupt handlers registered during init_IRQ */
extern void apic_timer_interrupt ( void ) ;
extern void error_interrupt ( void ) ;
extern void spurious_interrupt ( void ) ;
extern void thermal_interrupt ( void ) ;
extern void reschedule_interrupt ( void ) ;
extern void invalidate_interrupt ( void ) ;
extern void invalidate_interrupt0 ( void ) ;
extern void invalidate_interrupt1 ( void ) ;
extern void invalidate_interrupt2 ( void ) ;
extern void invalidate_interrupt3 ( void ) ;
extern void invalidate_interrupt4 ( void ) ;
extern void invalidate_interrupt5 ( void ) ;
extern void invalidate_interrupt6 ( void ) ;
extern void invalidate_interrupt7 ( void ) ;
extern void irq_move_cleanup_interrupt ( void ) ;
extern void threshold_interrupt ( void ) ;
extern void call_function_interrupt ( void ) ;
2008-07-15 21:55:59 +02:00
extern void call_function_single_interrupt ( void ) ;
2008-05-02 19:00:30 +02:00
/* PIC specific functions */
extern void disable_8259A_irq ( unsigned int irq ) ;
extern void enable_8259A_irq ( unsigned int irq ) ;
extern int i8259A_irq_pending ( unsigned int irq ) ;
extern void make_8259A_irq ( unsigned int irq ) ;
extern void init_8259A ( int aeoi ) ;
/* IOAPIC */
# define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
extern unsigned long io_apic_irqs ;
extern void init_VISWS_APIC_irqs ( void ) ;
extern void setup_IO_APIC ( void ) ;
extern void disable_IO_APIC ( void ) ;
extern int IO_APIC_get_PCI_irq_vector ( int bus , int slot , int fn ) ;
extern void setup_ioapic_dest ( void ) ;
2008-05-02 22:02:25 +02:00
# ifdef CONFIG_X86_64
extern void enable_IO_APIC ( void ) ;
# endif
2008-05-02 19:00:30 +02:00
/* IPI functions */
2008-07-10 11:16:53 -07:00
# ifdef CONFIG_X86_32
2008-05-02 19:00:30 +02:00
extern void send_IPI_self ( int vector ) ;
2008-07-10 11:16:53 -07:00
# endif
2008-05-02 19:00:30 +02:00
extern void send_IPI ( int dest , int vector ) ;
/* Statistics */
extern atomic_t irq_err_count ;
extern atomic_t irq_mis_count ;
2008-05-03 00:30:50 +02:00
/* EISA */
extern void eisa_set_level_irq ( unsigned int irq ) ;
2008-05-02 20:10:09 +02:00
/* Voyager functions */
extern asmlinkage void vic_cpi_interrupt ( void ) ;
extern asmlinkage void vic_sys_interrupt ( void ) ;
extern asmlinkage void vic_cmn_interrupt ( void ) ;
extern asmlinkage void qic_timer_interrupt ( void ) ;
extern asmlinkage void qic_invalidate_interrupt ( void ) ;
extern asmlinkage void qic_reschedule_interrupt ( void ) ;
extern asmlinkage void qic_enable_irq_interrupt ( void ) ;
extern asmlinkage void qic_call_function_interrupt ( void ) ;
2008-07-23 17:13:14 +05:30
/* SMP */
extern void smp_apic_timer_interrupt ( struct pt_regs * ) ;
extern void smp_spurious_interrupt ( struct pt_regs * ) ;
extern void smp_error_interrupt ( struct pt_regs * ) ;
2008-07-25 10:42:26 +05:30
# ifdef CONFIG_X86_SMP
extern void smp_reschedule_interrupt ( struct pt_regs * ) ;
extern void smp_call_function_interrupt ( struct pt_regs * ) ;
extern void smp_call_function_single_interrupt ( struct pt_regs * ) ;
2008-07-25 11:32:38 +05:30
# ifdef CONFIG_X86_32
extern void smp_invalidate_interrupt ( struct pt_regs * ) ;
# else
extern asmlinkage void smp_invalidate_interrupt ( struct pt_regs * ) ;
# endif
2008-07-25 10:42:26 +05:30
# endif
2008-07-23 17:13:14 +05:30
2007-10-11 11:20:03 +02:00
# ifdef CONFIG_X86_32
2008-08-19 20:50:46 -07:00
extern void ( * const interrupt [ NR_VECTORS ] ) ( void ) ;
2008-08-19 20:50:28 -07:00
# endif
2008-05-02 22:10:39 +02:00
typedef int vector_irq_t [ NR_VECTORS ] ;
DECLARE_PER_CPU ( vector_irq_t , vector_irq ) ;
2008-08-09 15:09:02 -07:00
2008-08-19 20:50:28 -07:00
# ifdef CONFIG_X86_IO_APIC
2008-08-09 15:09:02 -07:00
extern void lock_vector_lock ( void ) ;
extern void unlock_vector_lock ( void ) ;
extern void __setup_vector_irq ( int cpu ) ;
# else
static inline void lock_vector_lock ( void ) { }
static inline void unlock_vector_lock ( void ) { }
static inline void __setup_vector_irq ( int cpu ) { }
# endif
2008-05-02 19:00:30 +02:00
2008-05-02 22:10:39 +02:00
# endif /* !ASSEMBLY_ */
2008-10-22 22:26:29 -07:00
# endif /* _ASM_X86_HW_IRQ_H */