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 36enum 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 73struct irq_stat { 74 unsigned int irqs[NR_ARCH_IRQS]; 75}; 76 77DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); 78 79static __always_inline void inc_irq_stat(enum interruption_class irq) 80{ 81 __this_cpu_inc(irq_stat.irqs[irq]); 82} 83 84struct ext_code { 85 union { 86 struct { 87 unsigned short subcode; 88 unsigned short code; 89 }; 90 unsigned int int_code; 91 }; 92}; 93 94typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long); 95 96int register_external_irq(u16 code, ext_int_handler_t handler); 97int unregister_external_irq(u16 code, ext_int_handler_t handler); 98 99enum 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 117void irq_subclass_register(enum irq_subclass subclass); 118void 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