irq.h 2.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
#ifndef _ASM_IRQ_H
#define _ASM_IRQ_H

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#define EXT_INTERRUPT	1
#define IO_INTERRUPT	2
#define THIN_INTERRUPT	3

#define NR_IRQS_BASE	4

#ifdef CONFIG_PCI_NR_MSI
# define NR_IRQS	(NR_IRQS_BASE + CONFIG_PCI_NR_MSI)
#else
# define NR_IRQS	NR_IRQS_BASE
#endif

/* This number is used when no interrupt has been assigned */
#define NO_IRQ		0

19 20 21 22 23 24 25 26 27 28 29 30 31
/* External interruption codes */
#define EXT_IRQ_INTERRUPT_KEY	0x0040
#define EXT_IRQ_CLK_COMP	0x1004
#define EXT_IRQ_CPU_TIMER	0x1005
#define EXT_IRQ_WARNING_TRACK	0x1007
#define EXT_IRQ_MALFUNC_ALERT	0x1200
#define EXT_IRQ_EMERGENCY_SIG	0x1201
#define EXT_IRQ_EXTERNAL_CALL	0x1202
#define EXT_IRQ_TIMING_ALERT	0x1406
#define EXT_IRQ_MEASURE_ALERT	0x1407
#define EXT_IRQ_SERVICE_SIG	0x2401
#define EXT_IRQ_IUCV		0x4000

32 33
#ifndef __ASSEMBLY__

L
Linus Torvalds 已提交
34
#include <linux/hardirq.h>
35 36
#include <linux/percpu.h>
#include <linux/cache.h>
37
#include <linux/types.h>
L
Linus Torvalds 已提交
38

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
enum interruption_class {
	IRQEXT_CLK,
	IRQEXT_EXC,
	IRQEXT_EMS,
	IRQEXT_TMR,
	IRQEXT_TLA,
	IRQEXT_PFL,
	IRQEXT_DSD,
	IRQEXT_VRT,
	IRQEXT_SCP,
	IRQEXT_IUC,
	IRQEXT_CMS,
	IRQEXT_CMC,
	IRQEXT_CMR,
	IRQIO_CIO,
	IRQIO_QAI,
	IRQIO_DAS,
	IRQIO_C15,
	IRQIO_C70,
	IRQIO_TAP,
	IRQIO_VMR,
	IRQIO_LCS,
	IRQIO_CLW,
	IRQIO_CTC,
	IRQIO_APB,
	IRQIO_ADM,
	IRQIO_CSC,
	IRQIO_PCI,
	IRQIO_MSI,
68
	IRQIO_VIR,
69
	NMI_NMI,
70
	CPU_RST,
71
	NR_ARCH_IRQS
L
Linus Torvalds 已提交
72 73
};

74 75 76 77 78 79 80 81 82 83 84
struct irq_stat {
	unsigned int irqs[NR_ARCH_IRQS];
};

DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);

static __always_inline void inc_irq_stat(enum interruption_class irq)
{
	__get_cpu_var(irq_stat).irqs[irq]++;
}

85 86 87 88 89 90
struct ext_code {
	unsigned short subcode;
	unsigned short code;
};

typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long);
91 92 93

int register_external_interrupt(u16 code, ext_int_handler_t handler);
int unregister_external_interrupt(u16 code, ext_int_handler_t handler);
94 95 96 97 98 99 100 101

enum irq_subclass {
	IRQ_SUBCLASS_MEASUREMENT_ALERT = 5,
	IRQ_SUBCLASS_SERVICE_SIGNAL = 9,
};

void irq_subclass_register(enum irq_subclass subclass);
void irq_subclass_unregister(enum irq_subclass subclass);
102

103 104 105
#define irq_canonicalize(irq)  (irq)

#endif /* __ASSEMBLY__ */
106

107
#endif /* _ASM_IRQ_H */