hw_irq.h 3.99 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef _ASM_HW_IRQ_H
#define _ASM_HW_IRQ_H

/*
 *	linux/include/asm/hw_irq.h
 *
 *	(C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
 *
 *	moved some of the old arch/i386/kernel/irq.h to here. VY
 *
 *	IRQ/IPI changes taken from work by Thomas Radke
 *	<tomsoft@informatik.tu-chemnitz.de>
 *
 *	hacked by Andi Kleen for x86-64.
 */

#ifndef __ASSEMBLY__
#include <asm/atomic.h>
#include <asm/irq.h>
#include <linux/profile.h>
#include <linux/smp.h>
22
#include <linux/percpu.h>
Linus Torvalds's avatar
Linus Torvalds committed
23
24
#endif

25
#define NMI_VECTOR		0x02
Linus Torvalds's avatar
Linus Torvalds committed
26
27
28
29
30
31
32
33
34
35
36
37
/*
 * IDT vectors usable for external interrupt sources start
 * at 0x20:
 */
#define FIRST_EXTERNAL_VECTOR	0x20

#define IA32_SYSCALL_VECTOR	0x80


/*
 * Vectors 0x20-0x2f are used for ISA interrupts.
 */
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#define IRQ0_VECTOR		FIRST_EXTERNAL_VECTOR
#define IRQ1_VECTOR		IRQ0_VECTOR + 1
#define IRQ2_VECTOR		IRQ0_VECTOR + 2
#define IRQ3_VECTOR		IRQ0_VECTOR + 3
#define IRQ4_VECTOR		IRQ0_VECTOR + 4
#define IRQ5_VECTOR		IRQ0_VECTOR + 5 
#define IRQ6_VECTOR		IRQ0_VECTOR + 6
#define IRQ7_VECTOR		IRQ0_VECTOR + 7
#define IRQ8_VECTOR		IRQ0_VECTOR + 8
#define IRQ9_VECTOR		IRQ0_VECTOR + 9
#define IRQ10_VECTOR		IRQ0_VECTOR + 10
#define IRQ11_VECTOR		IRQ0_VECTOR + 11
#define IRQ12_VECTOR		IRQ0_VECTOR + 12
#define IRQ13_VECTOR		IRQ0_VECTOR + 13
#define IRQ14_VECTOR		IRQ0_VECTOR + 14
#define IRQ15_VECTOR		IRQ0_VECTOR + 15
Linus Torvalds's avatar
Linus Torvalds committed
54
55
56
57
58
59
60
61
62
63

/*
 * Special IRQ vectors used by the SMP architecture, 0xf0-0xff
 *
 *  some of the following vectors are 'rare', they are merged
 *  into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
 *  TLB, reschedule and local APIC vectors are performance-critical.
 */
#define SPURIOUS_APIC_VECTOR	0xff
#define ERROR_APIC_VECTOR	0xfe
64
65
#define RESCHEDULE_VECTOR	0xfd
#define CALL_FUNCTION_VECTOR	0xfc
66
67
/* fb free - please don't readd KDB here because it's useless
   (hint - think what a NMI bit does to a vector) */
68
#define THERMAL_APIC_VECTOR	0xfa
69
#define THRESHOLD_APIC_VECTOR   0xf9
70
71
72
/* f8 free */
#define INVALIDATE_TLB_VECTOR_END	0xf7
#define INVALIDATE_TLB_VECTOR_START	0xf0	/* f0-f7 used for TLB flush */
Linus Torvalds's avatar
Linus Torvalds committed
73

74
#define NUM_INVALIDATE_TLB_VECTORS	8
Linus Torvalds's avatar
Linus Torvalds committed
75
76
77
78
79
80
81
82
83
84
85
86
87

/*
 * Local APIC timer IRQ vector is on a different priority level,
 * to work around the 'lost local interrupt if more than 2 IRQ
 * sources per level' errata.
 */
#define LOCAL_TIMER_VECTOR	0xef

/*
 * First APIC vector available to drivers: (vectors 0x30-0xee)
 * we start at 0x31 to spread out vectors evenly between priority
 * levels. (0x80 is the syscall vector)
 */
88
#define FIRST_DEVICE_VECTOR	(IRQ15_VECTOR + 2)
Linus Torvalds's avatar
Linus Torvalds committed
89
90
91
92
#define FIRST_SYSTEM_VECTOR	0xef   /* duplicated in irq.h */


#ifndef __ASSEMBLY__
93
94
typedef int vector_irq_t[NR_VECTORS];
DECLARE_PER_CPU(vector_irq_t, vector_irq);
95
96
extern void __setup_vector_irq(int cpu);
extern spinlock_t vector_lock;
Linus Torvalds's avatar
Linus Torvalds committed
97
98
99
100
101
102
103
104
105
106
107
108
109

/*
 * Various low-level irq details needed by irq.c, process.c,
 * time.c, io_apic.c and smp.c
 *
 * Interrupt entry/exit code at both C and assembly level
 */

extern void disable_8259A_irq(unsigned int irq);
extern void enable_8259A_irq(unsigned int irq);
extern int i8259A_irq_pending(unsigned int irq);
extern void make_8259A_irq(unsigned int irq);
extern void init_8259A(int aeoi);
110
extern void send_IPI_self(int vector);
Linus Torvalds's avatar
Linus Torvalds committed
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
extern void init_VISWS_APIC_irqs(void);
extern void setup_IO_APIC(void);
extern void disable_IO_APIC(void);
extern void print_IO_APIC(void);
extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
extern void send_IPI(int dest, int vector);
extern void setup_ioapic_dest(void);

extern unsigned long io_apic_irqs;

extern atomic_t irq_err_count;
extern atomic_t irq_mis_count;

#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))

#define __STR(x) #x
#define STR(x) __STR(x)

#include <asm/ptrace.h>

#define IRQ_NAME2(nr) nr##_interrupt(void)
#define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr)

/*
 *	SMP has a few special interrupts for IPI messages
 */

#define BUILD_IRQ(nr) \
asmlinkage void IRQ_NAME(nr); \
__asm__( \
"\n.p2align\n" \
"IRQ" #nr "_interrupt:\n\t" \
143
	"push $~(" #nr ") ; " \
Linus Torvalds's avatar
Linus Torvalds committed
144
145
146
147
148
149
150
	"jmp common_interrupt");

#define platform_legacy_irq(irq)	((irq) < 16)

#endif

#endif /* _ASM_HW_IRQ_H */