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