1 #ifndef _ASM_IRQ_H 2 #define _ASM_IRQ_H 3 4 #define EXT_INTERRUPT 1 5 #define IO_INTERRUPT 2 6 #define THIN_INTERRUPT 3 7 8 #define NR_IRQS_BASE 4 9 10 #ifdef CONFIG_PCI_NR_MSI 11 # define NR_IRQS (NR_IRQS_BASE + CONFIG_PCI_NR_MSI) 12 #else 13 # define NR_IRQS NR_IRQS_BASE 14 #endif 15 16 /* This number is used when no interrupt has been assigned */ 17 #define NO_IRQ 0 18 19 #ifndef __ASSEMBLY__ 20 21 #include <linux/hardirq.h> 22 #include <linux/percpu.h> 23 #include <linux/cache.h> 24 #include <linux/types.h> 25 26 enum interruption_class { 27 IRQEXT_CLK, 28 IRQEXT_EXC, 29 IRQEXT_EMS, 30 IRQEXT_TMR, 31 IRQEXT_TLA, 32 IRQEXT_PFL, 33 IRQEXT_DSD, 34 IRQEXT_VRT, 35 IRQEXT_SCP, 36 IRQEXT_IUC, 37 IRQEXT_CMS, 38 IRQEXT_CMC, 39 IRQEXT_CMR, 40 IRQIO_CIO, 41 IRQIO_QAI, 42 IRQIO_DAS, 43 IRQIO_C15, 44 IRQIO_C70, 45 IRQIO_TAP, 46 IRQIO_VMR, 47 IRQIO_LCS, 48 IRQIO_CLW, 49 IRQIO_CTC, 50 IRQIO_APB, 51 IRQIO_ADM, 52 IRQIO_CSC, 53 IRQIO_PCI, 54 IRQIO_MSI, 55 IRQIO_VIR, 56 IRQIO_VAI, 57 NMI_NMI, 58 CPU_RST, 59 NR_ARCH_IRQS 60 }; 61 62 struct irq_stat { 63 unsigned int irqs[NR_ARCH_IRQS]; 64 }; 65 66 DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); 67 68 static __always_inline void inc_irq_stat(enum interruption_class irq) 69 { 70 __get_cpu_var(irq_stat).irqs[irq]++; 71 } 72 73 struct ext_code { 74 unsigned short subcode; 75 unsigned short code; 76 }; 77 78 typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long); 79 80 int register_external_interrupt(u16 code, ext_int_handler_t handler); 81 int unregister_external_interrupt(u16 code, ext_int_handler_t handler); 82 83 enum irq_subclass { 84 IRQ_SUBCLASS_MEASUREMENT_ALERT = 5, 85 IRQ_SUBCLASS_SERVICE_SIGNAL = 9, 86 }; 87 88 void irq_subclass_register(enum irq_subclass subclass); 89 void irq_subclass_unregister(enum irq_subclass subclass); 90 91 #define irq_canonicalize(irq) (irq) 92 93 #endif /* __ASSEMBLY__ */ 94 95 #endif /* _ASM_IRQ_H */ 96