xref: /openbmc/linux/arch/s390/include/asm/irq.h (revision 7d8484c4)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2c6557e7fSMartin Schwidefsky #ifndef _ASM_IRQ_H
3c6557e7fSMartin Schwidefsky #define _ASM_IRQ_H
4c6557e7fSMartin Schwidefsky 
5afaa7d29SSebastian Ott #define EXT_INTERRUPT	0
6afaa7d29SSebastian Ott #define IO_INTERRUPT	1
7afaa7d29SSebastian Ott #define THIN_INTERRUPT	2
81f44a225SMartin Schwidefsky 
9afaa7d29SSebastian Ott #define NR_IRQS_BASE	3
101f44a225SMartin Schwidefsky 
111f44a225SMartin Schwidefsky #define NR_IRQS	NR_IRQS_BASE
12bb98f396SSebastian Ott #define NR_IRQS_LEGACY NR_IRQS_BASE
131f44a225SMartin Schwidefsky 
14072c2790SThomas Huth /* External interruption codes */
15072c2790SThomas Huth #define EXT_IRQ_INTERRUPT_KEY	0x0040
16072c2790SThomas Huth #define EXT_IRQ_CLK_COMP	0x1004
17072c2790SThomas Huth #define EXT_IRQ_CPU_TIMER	0x1005
18072c2790SThomas Huth #define EXT_IRQ_WARNING_TRACK	0x1007
19072c2790SThomas Huth #define EXT_IRQ_MALFUNC_ALERT	0x1200
20072c2790SThomas Huth #define EXT_IRQ_EMERGENCY_SIG	0x1201
21072c2790SThomas Huth #define EXT_IRQ_EXTERNAL_CALL	0x1202
22072c2790SThomas Huth #define EXT_IRQ_TIMING_ALERT	0x1406
23072c2790SThomas Huth #define EXT_IRQ_MEASURE_ALERT	0x1407
24072c2790SThomas Huth #define EXT_IRQ_SERVICE_SIG	0x2401
251dad093bSThomas Huth #define EXT_IRQ_CP_SERVICE	0x2603
26072c2790SThomas Huth #define EXT_IRQ_IUCV		0x4000
27072c2790SThomas Huth 
281f44a225SMartin Schwidefsky #ifndef __ASSEMBLY__
291f44a225SMartin Schwidefsky 
30c6557e7fSMartin Schwidefsky #include <linux/hardirq.h>
31420f42ecSHeiko Carstens #include <linux/percpu.h>
32420f42ecSHeiko Carstens #include <linux/cache.h>
33d7b250e2SHeiko Carstens #include <linux/types.h>
34c6557e7fSMartin Schwidefsky 
35420f42ecSHeiko Carstens enum interruption_class {
36420f42ecSHeiko Carstens 	IRQEXT_CLK,
37420f42ecSHeiko Carstens 	IRQEXT_EXC,
38420f42ecSHeiko Carstens 	IRQEXT_EMS,
39420f42ecSHeiko Carstens 	IRQEXT_TMR,
40420f42ecSHeiko Carstens 	IRQEXT_TLA,
41420f42ecSHeiko Carstens 	IRQEXT_PFL,
42420f42ecSHeiko Carstens 	IRQEXT_DSD,
43420f42ecSHeiko Carstens 	IRQEXT_VRT,
44420f42ecSHeiko Carstens 	IRQEXT_SCP,
45420f42ecSHeiko Carstens 	IRQEXT_IUC,
46420f42ecSHeiko Carstens 	IRQEXT_CMS,
47420f42ecSHeiko Carstens 	IRQEXT_CMC,
488f933b10SRalf Hoppe 	IRQEXT_FTP,
49420f42ecSHeiko Carstens 	IRQIO_CIO,
50420f42ecSHeiko Carstens 	IRQIO_DAS,
51420f42ecSHeiko Carstens 	IRQIO_C15,
52420f42ecSHeiko Carstens 	IRQIO_C70,
53420f42ecSHeiko Carstens 	IRQIO_TAP,
54420f42ecSHeiko Carstens 	IRQIO_VMR,
55420f42ecSHeiko Carstens 	IRQIO_LCS,
56420f42ecSHeiko Carstens 	IRQIO_CTC,
57420f42ecSHeiko Carstens 	IRQIO_ADM,
58420f42ecSHeiko Carstens 	IRQIO_CSC,
59914b7dd0SSebastian Ott 	IRQIO_VIR,
60914b7dd0SSebastian Ott 	IRQIO_QAI,
61914b7dd0SSebastian Ott 	IRQIO_APB,
6207e3ec3aSSebastian Ott 	IRQIO_PCF,
6307e3ec3aSSebastian Ott 	IRQIO_PCD,
64420f42ecSHeiko Carstens 	IRQIO_MSI,
6596b14536SCornelia Huck 	IRQIO_VAI,
669f30f621SMichael Mueller 	IRQIO_GAL,
67420f42ecSHeiko Carstens 	NMI_NMI,
6893f3b2eeSHeiko Carstens 	CPU_RST,
69420f42ecSHeiko Carstens 	NR_ARCH_IRQS
70420f42ecSHeiko Carstens };
71420f42ecSHeiko Carstens 
72420f42ecSHeiko Carstens struct irq_stat {
73420f42ecSHeiko Carstens 	unsigned int irqs[NR_ARCH_IRQS];
74420f42ecSHeiko Carstens };
75420f42ecSHeiko Carstens 
76420f42ecSHeiko Carstens DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
77420f42ecSHeiko Carstens 
inc_irq_stat(enum interruption_class irq)78420f42ecSHeiko Carstens static __always_inline void inc_irq_stat(enum interruption_class irq)
79420f42ecSHeiko Carstens {
80eb7e7d76SChristoph Lameter 	__this_cpu_inc(irq_stat.irqs[irq]);
81420f42ecSHeiko Carstens }
82420f42ecSHeiko Carstens 
83fde15c3aSHeiko Carstens struct ext_code {
84*7d8484c4SHeiko Carstens 	union {
85*7d8484c4SHeiko Carstens 		struct {
86fde15c3aSHeiko Carstens 			unsigned short subcode;
87fde15c3aSHeiko Carstens 			unsigned short code;
88fde15c3aSHeiko Carstens 		};
89*7d8484c4SHeiko Carstens 		unsigned int int_code;
90*7d8484c4SHeiko Carstens 	};
91*7d8484c4SHeiko Carstens };
92fde15c3aSHeiko Carstens 
93fde15c3aSHeiko Carstens typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long);
94d7b250e2SHeiko Carstens 
951dad093bSThomas Huth int register_external_irq(u16 code, ext_int_handler_t handler);
961dad093bSThomas Huth int unregister_external_irq(u16 code, ext_int_handler_t handler);
9782003c3eSHeiko Carstens 
9882003c3eSHeiko Carstens enum irq_subclass {
9982003c3eSHeiko Carstens 	IRQ_SUBCLASS_MEASUREMENT_ALERT = 5,
10082003c3eSHeiko Carstens 	IRQ_SUBCLASS_SERVICE_SIGNAL = 9,
10182003c3eSHeiko Carstens };
10282003c3eSHeiko Carstens 
103db7e007fSHeiko Carstens #define CR0_IRQ_SUBCLASS_MASK					  \
104db7e007fSHeiko Carstens 	((1UL << (63 - 30))  /* Warning Track */		| \
105db7e007fSHeiko Carstens 	 (1UL << (63 - 48))  /* Malfunction Alert */		| \
106db7e007fSHeiko Carstens 	 (1UL << (63 - 49))  /* Emergency Signal */		| \
107db7e007fSHeiko Carstens 	 (1UL << (63 - 50))  /* External Call */		| \
108db7e007fSHeiko Carstens 	 (1UL << (63 - 52))  /* Clock Comparator */		| \
109db7e007fSHeiko Carstens 	 (1UL << (63 - 53))  /* CPU Timer */			| \
110db7e007fSHeiko Carstens 	 (1UL << (63 - 54))  /* Service Signal */		| \
111db7e007fSHeiko Carstens 	 (1UL << (63 - 57))  /* Interrupt Key */		| \
112db7e007fSHeiko Carstens 	 (1UL << (63 - 58))  /* Measurement Alert */		| \
113db7e007fSHeiko Carstens 	 (1UL << (63 - 59))  /* Timing Alert */			| \
114db7e007fSHeiko Carstens 	 (1UL << (63 - 62))) /* IUCV */
115db7e007fSHeiko Carstens 
11682003c3eSHeiko Carstens void irq_subclass_register(enum irq_subclass subclass);
11782003c3eSHeiko Carstens void irq_subclass_unregister(enum irq_subclass subclass);
118d7b250e2SHeiko Carstens 
1191f44a225SMartin Schwidefsky #define irq_canonicalize(irq)  (irq)
1201f44a225SMartin Schwidefsky 
1211f44a225SMartin Schwidefsky #endif /* __ASSEMBLY__ */
1229a4da8a5SJan Glauber 
123052ff461SHeiko Carstens #endif /* _ASM_IRQ_H */
124