#ifndef _ASM_IRQ_H #define _ASM_IRQ_H #include #include #include #include enum interruption_main_class { EXTERNAL_INTERRUPT, IO_INTERRUPT, NR_IRQS }; enum interruption_class { IRQEXT_CLK, IRQEXT_EXC, IRQEXT_EMS, IRQEXT_TMR, IRQEXT_TLA, IRQEXT_PFL, IRQEXT_DSD, IRQEXT_VRT, IRQEXT_SCP, IRQEXT_IUC, IRQEXT_CMS, IRQEXT_CMC, IRQEXT_CMR, IRQIO_CIO, IRQIO_QAI, IRQIO_DAS, IRQIO_C15, IRQIO_C70, IRQIO_TAP, IRQIO_VMR, IRQIO_LCS, IRQIO_CLW, IRQIO_CTC, IRQIO_APB, IRQIO_ADM, IRQIO_CSC, IRQIO_PCI, IRQIO_MSI, IRQIO_VIR, NMI_NMI, CPU_RST, NR_ARCH_IRQS }; struct irq_stat { unsigned int irqs[NR_ARCH_IRQS]; }; DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); static __always_inline void inc_irq_stat(enum interruption_class irq) { __get_cpu_var(irq_stat).irqs[irq]++; } struct ext_code { unsigned short subcode; unsigned short code; }; typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long); int register_external_interrupt(u16 code, ext_int_handler_t handler); int unregister_external_interrupt(u16 code, ext_int_handler_t handler); void service_subclass_irq_register(void); void service_subclass_irq_unregister(void); void measurement_alert_subclass_register(void); void measurement_alert_subclass_unregister(void); #ifdef CONFIG_LOCKDEP # define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq) # define disable_irq_nosync_lockdep_irqsave(irq, flags) \ disable_irq_nosync(irq) # define disable_irq_lockdep(irq) disable_irq(irq) # define enable_irq_lockdep(irq) enable_irq(irq) # define enable_irq_lockdep_irqrestore(irq, flags) \ enable_irq(irq) #endif #endif /* _ASM_IRQ_H */