1c6557e7fSMartin Schwidefsky #ifndef _ASM_IRQ_H 2c6557e7fSMartin Schwidefsky #define _ASM_IRQ_H 3c6557e7fSMartin Schwidefsky 4c6557e7fSMartin Schwidefsky #include <linux/hardirq.h> 5420f42ecSHeiko Carstens #include <linux/percpu.h> 6420f42ecSHeiko Carstens #include <linux/cache.h> 7d7b250e2SHeiko Carstens #include <linux/types.h> 8c6557e7fSMartin Schwidefsky 9420f42ecSHeiko Carstens enum interruption_main_class { 10c6557e7fSMartin Schwidefsky EXTERNAL_INTERRUPT, 11c6557e7fSMartin Schwidefsky IO_INTERRUPT, 12420f42ecSHeiko Carstens NR_IRQS 13c6557e7fSMartin Schwidefsky }; 14c6557e7fSMartin Schwidefsky 15420f42ecSHeiko Carstens enum interruption_class { 16420f42ecSHeiko Carstens IRQEXT_CLK, 17420f42ecSHeiko Carstens IRQEXT_EXC, 18420f42ecSHeiko Carstens IRQEXT_EMS, 19420f42ecSHeiko Carstens IRQEXT_TMR, 20420f42ecSHeiko Carstens IRQEXT_TLA, 21420f42ecSHeiko Carstens IRQEXT_PFL, 22420f42ecSHeiko Carstens IRQEXT_DSD, 23420f42ecSHeiko Carstens IRQEXT_VRT, 24420f42ecSHeiko Carstens IRQEXT_SCP, 25420f42ecSHeiko Carstens IRQEXT_IUC, 26420f42ecSHeiko Carstens IRQEXT_CMS, 27420f42ecSHeiko Carstens IRQEXT_CMC, 28420f42ecSHeiko Carstens IRQEXT_CMR, 29420f42ecSHeiko Carstens IRQIO_CIO, 30420f42ecSHeiko Carstens IRQIO_QAI, 31420f42ecSHeiko Carstens IRQIO_DAS, 32420f42ecSHeiko Carstens IRQIO_C15, 33420f42ecSHeiko Carstens IRQIO_C70, 34420f42ecSHeiko Carstens IRQIO_TAP, 35420f42ecSHeiko Carstens IRQIO_VMR, 36420f42ecSHeiko Carstens IRQIO_LCS, 37420f42ecSHeiko Carstens IRQIO_CLW, 38420f42ecSHeiko Carstens IRQIO_CTC, 39420f42ecSHeiko Carstens IRQIO_APB, 40420f42ecSHeiko Carstens IRQIO_ADM, 41420f42ecSHeiko Carstens IRQIO_CSC, 42420f42ecSHeiko Carstens IRQIO_PCI, 43420f42ecSHeiko Carstens IRQIO_MSI, 44420f42ecSHeiko Carstens NMI_NMI, 45420f42ecSHeiko Carstens NR_ARCH_IRQS 46420f42ecSHeiko Carstens }; 47420f42ecSHeiko Carstens 48420f42ecSHeiko Carstens struct irq_stat { 49420f42ecSHeiko Carstens unsigned int irqs[NR_ARCH_IRQS]; 50420f42ecSHeiko Carstens }; 51420f42ecSHeiko Carstens 52420f42ecSHeiko Carstens DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); 53420f42ecSHeiko Carstens 54420f42ecSHeiko Carstens static __always_inline void inc_irq_stat(enum interruption_class irq) 55420f42ecSHeiko Carstens { 56420f42ecSHeiko Carstens __get_cpu_var(irq_stat).irqs[irq]++; 57420f42ecSHeiko Carstens } 58420f42ecSHeiko Carstens 59fde15c3aSHeiko Carstens struct ext_code { 60fde15c3aSHeiko Carstens unsigned short subcode; 61fde15c3aSHeiko Carstens unsigned short code; 62fde15c3aSHeiko Carstens }; 63fde15c3aSHeiko Carstens 64fde15c3aSHeiko Carstens typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long); 65d7b250e2SHeiko Carstens 66d7b250e2SHeiko Carstens int register_external_interrupt(u16 code, ext_int_handler_t handler); 67d7b250e2SHeiko Carstens int unregister_external_interrupt(u16 code, ext_int_handler_t handler); 68d7b250e2SHeiko Carstens void service_subclass_irq_register(void); 69d7b250e2SHeiko Carstens void service_subclass_irq_unregister(void); 70b03d541aSJan Glauber void measurement_alert_subclass_register(void); 71b03d541aSJan Glauber void measurement_alert_subclass_unregister(void); 72d7b250e2SHeiko Carstens 739a4da8a5SJan Glauber #ifdef CONFIG_LOCKDEP 749a4da8a5SJan Glauber # define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq) 759a4da8a5SJan Glauber # define disable_irq_nosync_lockdep_irqsave(irq, flags) \ 769a4da8a5SJan Glauber disable_irq_nosync(irq) 779a4da8a5SJan Glauber # define disable_irq_lockdep(irq) disable_irq(irq) 789a4da8a5SJan Glauber # define enable_irq_lockdep(irq) enable_irq(irq) 799a4da8a5SJan Glauber # define enable_irq_lockdep_irqrestore(irq, flags) \ 809a4da8a5SJan Glauber enable_irq(irq) 819a4da8a5SJan Glauber #endif 829a4da8a5SJan Glauber 83052ff461SHeiko Carstens #endif /* _ASM_IRQ_H */ 84