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