1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _ASM_IRQ_H 3 #define _ASM_IRQ_H 4 5 #define EXT_INTERRUPT 0 6 #define IO_INTERRUPT 1 7 #define THIN_INTERRUPT 2 8 9 #define NR_IRQS_BASE 3 10 11 #define NR_IRQS NR_IRQS_BASE 12 #define NR_IRQS_LEGACY NR_IRQS_BASE 13 14 /* External interruption codes */ 15 #define EXT_IRQ_INTERRUPT_KEY 0x0040 16 #define EXT_IRQ_CLK_COMP 0x1004 17 #define EXT_IRQ_CPU_TIMER 0x1005 18 #define EXT_IRQ_WARNING_TRACK 0x1007 19 #define EXT_IRQ_MALFUNC_ALERT 0x1200 20 #define EXT_IRQ_EMERGENCY_SIG 0x1201 21 #define EXT_IRQ_EXTERNAL_CALL 0x1202 22 #define EXT_IRQ_TIMING_ALERT 0x1406 23 #define EXT_IRQ_MEASURE_ALERT 0x1407 24 #define EXT_IRQ_SERVICE_SIG 0x2401 25 #define EXT_IRQ_CP_SERVICE 0x2603 26 #define EXT_IRQ_IUCV 0x4000 27 28 #ifndef __ASSEMBLY__ 29 30 #include <linux/hardirq.h> 31 #include <linux/percpu.h> 32 #include <linux/cache.h> 33 #include <linux/types.h> 34 #include <asm/ctlreg.h> 35 36 enum interruption_class { 37 IRQEXT_CLK, 38 IRQEXT_EXC, 39 IRQEXT_EMS, 40 IRQEXT_TMR, 41 IRQEXT_TLA, 42 IRQEXT_PFL, 43 IRQEXT_DSD, 44 IRQEXT_VRT, 45 IRQEXT_SCP, 46 IRQEXT_IUC, 47 IRQEXT_CMS, 48 IRQEXT_CMC, 49 IRQEXT_FTP, 50 IRQIO_CIO, 51 IRQIO_DAS, 52 IRQIO_C15, 53 IRQIO_C70, 54 IRQIO_TAP, 55 IRQIO_VMR, 56 IRQIO_LCS, 57 IRQIO_CTC, 58 IRQIO_ADM, 59 IRQIO_CSC, 60 IRQIO_VIR, 61 IRQIO_QAI, 62 IRQIO_APB, 63 IRQIO_PCF, 64 IRQIO_PCD, 65 IRQIO_MSI, 66 IRQIO_VAI, 67 IRQIO_GAL, 68 NMI_NMI, 69 CPU_RST, 70 NR_ARCH_IRQS 71 }; 72 73 struct irq_stat { 74 unsigned int irqs[NR_ARCH_IRQS]; 75 }; 76 77 DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); 78 79 static __always_inline void inc_irq_stat(enum interruption_class irq) 80 { 81 __this_cpu_inc(irq_stat.irqs[irq]); 82 } 83 84 struct ext_code { 85 union { 86 struct { 87 unsigned short subcode; 88 unsigned short code; 89 }; 90 unsigned int int_code; 91 }; 92 }; 93 94 typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long); 95 96 int register_external_irq(u16 code, ext_int_handler_t handler); 97 int unregister_external_irq(u16 code, ext_int_handler_t handler); 98 99 enum irq_subclass { 100 IRQ_SUBCLASS_MEASUREMENT_ALERT = 5, 101 IRQ_SUBCLASS_SERVICE_SIGNAL = 9, 102 }; 103 104 #define CR0_IRQ_SUBCLASS_MASK \ 105 (CR0_WARNING_TRACK | \ 106 CR0_MALFUNCTION_ALERT_SUBMASK | \ 107 CR0_EMERGENCY_SIGNAL_SUBMASK | \ 108 CR0_EXTERNAL_CALL_SUBMASK | \ 109 CR0_CLOCK_COMPARATOR_SUBMASK | \ 110 CR0_CPU_TIMER_SUBMASK | \ 111 CR0_SERVICE_SIGNAL_SUBMASK | \ 112 CR0_INTERRUPT_KEY_SUBMASK | \ 113 CR0_MEASUREMENT_ALERT_SUBMASK | \ 114 CR0_ETR_SUBMASK | \ 115 CR0_IUCV) 116 117 void irq_subclass_register(enum irq_subclass subclass); 118 void irq_subclass_unregister(enum irq_subclass subclass); 119 120 #define irq_canonicalize(irq) (irq) 121 122 #endif /* __ASSEMBLY__ */ 123 124 #endif /* _ASM_IRQ_H */ 125