xref: /OK3568_Linux_fs/kernel/arch/s390/include/asm/irq.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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