Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _ASM_IRQ_H |
| 2 | #define _ASM_IRQ_H |
| 3 | |
Sebastian Ott | afaa7d2 | 2014-11-14 11:01:37 +0100 | [diff] [blame] | 4 | #define EXT_INTERRUPT 0 |
| 5 | #define IO_INTERRUPT 1 |
| 6 | #define THIN_INTERRUPT 2 |
Martin Schwidefsky | 1f44a22 | 2013-06-27 09:01:09 +0200 | [diff] [blame] | 7 | |
Sebastian Ott | afaa7d2 | 2014-11-14 11:01:37 +0100 | [diff] [blame] | 8 | #define NR_IRQS_BASE 3 |
Martin Schwidefsky | 1f44a22 | 2013-06-27 09:01:09 +0200 | [diff] [blame] | 9 | |
Sebastian Ott | bb98f39 | 2016-06-02 14:57:17 +0200 | [diff] [blame] | 10 | #define NR_IRQS NR_IRQS_BASE |
| 11 | #define NR_IRQS_LEGACY NR_IRQS_BASE |
Martin Schwidefsky | 1f44a22 | 2013-06-27 09:01:09 +0200 | [diff] [blame] | 12 | |
Thomas Huth | 072c279 | 2014-04-02 14:06:10 +0200 | [diff] [blame] | 13 | /* External interruption codes */ |
| 14 | #define EXT_IRQ_INTERRUPT_KEY 0x0040 |
| 15 | #define EXT_IRQ_CLK_COMP 0x1004 |
| 16 | #define EXT_IRQ_CPU_TIMER 0x1005 |
| 17 | #define EXT_IRQ_WARNING_TRACK 0x1007 |
| 18 | #define EXT_IRQ_MALFUNC_ALERT 0x1200 |
| 19 | #define EXT_IRQ_EMERGENCY_SIG 0x1201 |
| 20 | #define EXT_IRQ_EXTERNAL_CALL 0x1202 |
| 21 | #define EXT_IRQ_TIMING_ALERT 0x1406 |
| 22 | #define EXT_IRQ_MEASURE_ALERT 0x1407 |
| 23 | #define EXT_IRQ_SERVICE_SIG 0x2401 |
Thomas Huth | 1dad093 | 2014-03-31 15:24:08 +0200 | [diff] [blame] | 24 | #define EXT_IRQ_CP_SERVICE 0x2603 |
Thomas Huth | 072c279 | 2014-04-02 14:06:10 +0200 | [diff] [blame] | 25 | #define EXT_IRQ_IUCV 0x4000 |
| 26 | |
Martin Schwidefsky | 1f44a22 | 2013-06-27 09:01:09 +0200 | [diff] [blame] | 27 | #ifndef __ASSEMBLY__ |
| 28 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 29 | #include <linux/hardirq.h> |
Heiko Carstens | 420f42e | 2013-01-02 15:18:18 +0100 | [diff] [blame] | 30 | #include <linux/percpu.h> |
| 31 | #include <linux/cache.h> |
Heiko Carstens | d7b250e | 2011-05-26 09:48:24 +0200 | [diff] [blame] | 32 | #include <linux/types.h> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 33 | |
Heiko Carstens | 420f42e | 2013-01-02 15:18:18 +0100 | [diff] [blame] | 34 | enum interruption_class { |
| 35 | IRQEXT_CLK, |
| 36 | IRQEXT_EXC, |
| 37 | IRQEXT_EMS, |
| 38 | IRQEXT_TMR, |
| 39 | IRQEXT_TLA, |
| 40 | IRQEXT_PFL, |
| 41 | IRQEXT_DSD, |
| 42 | IRQEXT_VRT, |
| 43 | IRQEXT_SCP, |
| 44 | IRQEXT_IUC, |
| 45 | IRQEXT_CMS, |
| 46 | IRQEXT_CMC, |
Ralf Hoppe | 8f933b1 | 2013-04-08 09:52:57 +0200 | [diff] [blame] | 47 | IRQEXT_FTP, |
Heiko Carstens | 420f42e | 2013-01-02 15:18:18 +0100 | [diff] [blame] | 48 | IRQIO_CIO, |
| 49 | IRQIO_QAI, |
| 50 | IRQIO_DAS, |
| 51 | IRQIO_C15, |
| 52 | IRQIO_C70, |
| 53 | IRQIO_TAP, |
| 54 | IRQIO_VMR, |
| 55 | IRQIO_LCS, |
Heiko Carstens | 420f42e | 2013-01-02 15:18:18 +0100 | [diff] [blame] | 56 | IRQIO_CTC, |
| 57 | IRQIO_APB, |
| 58 | IRQIO_ADM, |
| 59 | IRQIO_CSC, |
| 60 | IRQIO_PCI, |
| 61 | IRQIO_MSI, |
Linus Torvalds | 89f8833 | 2013-02-24 13:07:18 -0800 | [diff] [blame] | 62 | IRQIO_VIR, |
Cornelia Huck | 96b1453 | 2013-02-06 10:23:39 +0100 | [diff] [blame] | 63 | IRQIO_VAI, |
Heiko Carstens | 420f42e | 2013-01-02 15:18:18 +0100 | [diff] [blame] | 64 | NMI_NMI, |
Heiko Carstens | 93f3b2e | 2013-01-02 16:54:12 +0100 | [diff] [blame] | 65 | CPU_RST, |
Heiko Carstens | 420f42e | 2013-01-02 15:18:18 +0100 | [diff] [blame] | 66 | NR_ARCH_IRQS |
| 67 | }; |
| 68 | |
| 69 | struct irq_stat { |
| 70 | unsigned int irqs[NR_ARCH_IRQS]; |
| 71 | }; |
| 72 | |
| 73 | DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); |
| 74 | |
| 75 | static __always_inline void inc_irq_stat(enum interruption_class irq) |
| 76 | { |
Christoph Lameter | eb7e7d7 | 2014-08-17 12:30:45 -0500 | [diff] [blame] | 77 | __this_cpu_inc(irq_stat.irqs[irq]); |
Heiko Carstens | 420f42e | 2013-01-02 15:18:18 +0100 | [diff] [blame] | 78 | } |
| 79 | |
Heiko Carstens | fde15c3 | 2012-03-11 11:59:31 -0400 | [diff] [blame] | 80 | struct ext_code { |
| 81 | unsigned short subcode; |
| 82 | unsigned short code; |
| 83 | }; |
| 84 | |
| 85 | typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long); |
Heiko Carstens | d7b250e | 2011-05-26 09:48:24 +0200 | [diff] [blame] | 86 | |
Thomas Huth | 1dad093 | 2014-03-31 15:24:08 +0200 | [diff] [blame] | 87 | int register_external_irq(u16 code, ext_int_handler_t handler); |
| 88 | int unregister_external_irq(u16 code, ext_int_handler_t handler); |
Heiko Carstens | 82003c3 | 2013-09-04 13:35:45 +0200 | [diff] [blame] | 89 | |
| 90 | enum irq_subclass { |
| 91 | IRQ_SUBCLASS_MEASUREMENT_ALERT = 5, |
| 92 | IRQ_SUBCLASS_SERVICE_SIGNAL = 9, |
| 93 | }; |
| 94 | |
Heiko Carstens | db7e007 | 2015-08-15 11:42:21 +0200 | [diff] [blame] | 95 | #define CR0_IRQ_SUBCLASS_MASK \ |
| 96 | ((1UL << (63 - 30)) /* Warning Track */ | \ |
| 97 | (1UL << (63 - 48)) /* Malfunction Alert */ | \ |
| 98 | (1UL << (63 - 49)) /* Emergency Signal */ | \ |
| 99 | (1UL << (63 - 50)) /* External Call */ | \ |
| 100 | (1UL << (63 - 52)) /* Clock Comparator */ | \ |
| 101 | (1UL << (63 - 53)) /* CPU Timer */ | \ |
| 102 | (1UL << (63 - 54)) /* Service Signal */ | \ |
| 103 | (1UL << (63 - 57)) /* Interrupt Key */ | \ |
| 104 | (1UL << (63 - 58)) /* Measurement Alert */ | \ |
| 105 | (1UL << (63 - 59)) /* Timing Alert */ | \ |
| 106 | (1UL << (63 - 62))) /* IUCV */ |
| 107 | |
Heiko Carstens | 82003c3 | 2013-09-04 13:35:45 +0200 | [diff] [blame] | 108 | void irq_subclass_register(enum irq_subclass subclass); |
| 109 | void irq_subclass_unregister(enum irq_subclass subclass); |
Heiko Carstens | d7b250e | 2011-05-26 09:48:24 +0200 | [diff] [blame] | 110 | |
Martin Schwidefsky | 1f44a22 | 2013-06-27 09:01:09 +0200 | [diff] [blame] | 111 | #define irq_canonicalize(irq) (irq) |
| 112 | |
| 113 | #endif /* __ASSEMBLY__ */ |
Jan Glauber | 9a4da8a | 2012-11-29 13:05:05 +0100 | [diff] [blame] | 114 | |
Heiko Carstens | 052ff46 | 2011-01-05 12:47:28 +0100 | [diff] [blame] | 115 | #endif /* _ASM_IRQ_H */ |