diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-03-26 16:39:17 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-03-27 12:28:43 -0400 |
commit | 6e15cf04860074ad032e88c306bea656bbdd0f22 (patch) | |
tree | c346383bb7563e8d66b2f4a502f875b259c34870 /arch/x86/include/asm/irq_vectors.h | |
parent | be0ea69674ed95e1e98cb3687a241badc756d228 (diff) | |
parent | 60db56422043aaa455ac7f858ce23c273220f9d9 (diff) |
Merge branch 'core/percpu' into percpu-cpumask-x86-for-linus-2
Conflicts:
arch/parisc/kernel/irq.c
arch/x86/include/asm/fixmap_64.h
arch/x86/include/asm/setup.h
kernel/irq/handle.c
Semantic merge:
arch/x86/include/asm/fixmap.h
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/include/asm/irq_vectors.h')
-rw-r--r-- | arch/x86/include/asm/irq_vectors.h | 209 |
1 files changed, 105 insertions, 104 deletions
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h index f7ff65032b9d..8a285f356f8a 100644 --- a/arch/x86/include/asm/irq_vectors.h +++ b/arch/x86/include/asm/irq_vectors.h | |||
@@ -1,47 +1,69 @@ | |||
1 | #ifndef _ASM_X86_IRQ_VECTORS_H | 1 | #ifndef _ASM_X86_IRQ_VECTORS_H |
2 | #define _ASM_X86_IRQ_VECTORS_H | 2 | #define _ASM_X86_IRQ_VECTORS_H |
3 | 3 | ||
4 | #include <linux/threads.h> | 4 | /* |
5 | * Linux IRQ vector layout. | ||
6 | * | ||
7 | * There are 256 IDT entries (per CPU - each entry is 8 bytes) which can | ||
8 | * be defined by Linux. They are used as a jump table by the CPU when a | ||
9 | * given vector is triggered - by a CPU-external, CPU-internal or | ||
10 | * software-triggered event. | ||
11 | * | ||
12 | * Linux sets the kernel code address each entry jumps to early during | ||
13 | * bootup, and never changes them. This is the general layout of the | ||
14 | * IDT entries: | ||
15 | * | ||
16 | * Vectors 0 ... 31 : system traps and exceptions - hardcoded events | ||
17 | * Vectors 32 ... 127 : device interrupts | ||
18 | * Vector 128 : legacy int80 syscall interface | ||
19 | * Vectors 129 ... 237 : device interrupts | ||
20 | * Vectors 238 ... 255 : special interrupts | ||
21 | * | ||
22 | * 64-bit x86 has per CPU IDT tables, 32-bit has one shared IDT table. | ||
23 | * | ||
24 | * This file enumerates the exact layout of them: | ||
25 | */ | ||
5 | 26 | ||
6 | #define NMI_VECTOR 0x02 | 27 | #define NMI_VECTOR 0x02 |
7 | 28 | ||
8 | /* | 29 | /* |
9 | * IDT vectors usable for external interrupt sources start | 30 | * IDT vectors usable for external interrupt sources start |
10 | * at 0x20: | 31 | * at 0x20: |
11 | */ | 32 | */ |
12 | #define FIRST_EXTERNAL_VECTOR 0x20 | 33 | #define FIRST_EXTERNAL_VECTOR 0x20 |
13 | 34 | ||
14 | #ifdef CONFIG_X86_32 | 35 | #ifdef CONFIG_X86_32 |
15 | # define SYSCALL_VECTOR 0x80 | 36 | # define SYSCALL_VECTOR 0x80 |
16 | #else | 37 | #else |
17 | # define IA32_SYSCALL_VECTOR 0x80 | 38 | # define IA32_SYSCALL_VECTOR 0x80 |
18 | #endif | 39 | #endif |
19 | 40 | ||
20 | /* | 41 | /* |
21 | * Reserve the lowest usable priority level 0x20 - 0x2f for triggering | 42 | * Reserve the lowest usable priority level 0x20 - 0x2f for triggering |
22 | * cleanup after irq migration. | 43 | * cleanup after irq migration. |
23 | */ | 44 | */ |
24 | #define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR | 45 | #define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR |
25 | 46 | ||
26 | /* | 47 | /* |
27 | * Vectors 0x30-0x3f are used for ISA interrupts. | 48 | * Vectors 0x30-0x3f are used for ISA interrupts. |
28 | */ | 49 | */ |
29 | #define IRQ0_VECTOR (FIRST_EXTERNAL_VECTOR + 0x10) | 50 | #define IRQ0_VECTOR (FIRST_EXTERNAL_VECTOR + 0x10) |
30 | #define IRQ1_VECTOR (IRQ0_VECTOR + 1) | 51 | |
31 | #define IRQ2_VECTOR (IRQ0_VECTOR + 2) | 52 | #define IRQ1_VECTOR (IRQ0_VECTOR + 1) |
32 | #define IRQ3_VECTOR (IRQ0_VECTOR + 3) | 53 | #define IRQ2_VECTOR (IRQ0_VECTOR + 2) |
33 | #define IRQ4_VECTOR (IRQ0_VECTOR + 4) | 54 | #define IRQ3_VECTOR (IRQ0_VECTOR + 3) |
34 | #define IRQ5_VECTOR (IRQ0_VECTOR + 5) | 55 | #define IRQ4_VECTOR (IRQ0_VECTOR + 4) |
35 | #define IRQ6_VECTOR (IRQ0_VECTOR + 6) | 56 | #define IRQ5_VECTOR (IRQ0_VECTOR + 5) |
36 | #define IRQ7_VECTOR (IRQ0_VECTOR + 7) | 57 | #define IRQ6_VECTOR (IRQ0_VECTOR + 6) |
37 | #define IRQ8_VECTOR (IRQ0_VECTOR + 8) | 58 | #define IRQ7_VECTOR (IRQ0_VECTOR + 7) |
38 | #define IRQ9_VECTOR (IRQ0_VECTOR + 9) | 59 | #define IRQ8_VECTOR (IRQ0_VECTOR + 8) |
39 | #define IRQ10_VECTOR (IRQ0_VECTOR + 10) | 60 | #define IRQ9_VECTOR (IRQ0_VECTOR + 9) |
40 | #define IRQ11_VECTOR (IRQ0_VECTOR + 11) | 61 | #define IRQ10_VECTOR (IRQ0_VECTOR + 10) |
41 | #define IRQ12_VECTOR (IRQ0_VECTOR + 12) | 62 | #define IRQ11_VECTOR (IRQ0_VECTOR + 11) |
42 | #define IRQ13_VECTOR (IRQ0_VECTOR + 13) | 63 | #define IRQ12_VECTOR (IRQ0_VECTOR + 12) |
43 | #define IRQ14_VECTOR (IRQ0_VECTOR + 14) | 64 | #define IRQ13_VECTOR (IRQ0_VECTOR + 13) |
44 | #define IRQ15_VECTOR (IRQ0_VECTOR + 15) | 65 | #define IRQ14_VECTOR (IRQ0_VECTOR + 14) |
66 | #define IRQ15_VECTOR (IRQ0_VECTOR + 15) | ||
45 | 67 | ||
46 | /* | 68 | /* |
47 | * Special IRQ vectors used by the SMP architecture, 0xf0-0xff | 69 | * Special IRQ vectors used by the SMP architecture, 0xf0-0xff |
@@ -49,119 +71,98 @@ | |||
49 | * some of the following vectors are 'rare', they are merged | 71 | * some of the following vectors are 'rare', they are merged |
50 | * into a single vector (CALL_FUNCTION_VECTOR) to save vector space. | 72 | * into a single vector (CALL_FUNCTION_VECTOR) to save vector space. |
51 | * TLB, reschedule and local APIC vectors are performance-critical. | 73 | * TLB, reschedule and local APIC vectors are performance-critical. |
52 | * | ||
53 | * Vectors 0xf0-0xfa are free (reserved for future Linux use). | ||
54 | */ | 74 | */ |
55 | #ifdef CONFIG_X86_32 | ||
56 | |||
57 | # define SPURIOUS_APIC_VECTOR 0xff | ||
58 | # define ERROR_APIC_VECTOR 0xfe | ||
59 | # define INVALIDATE_TLB_VECTOR 0xfd | ||
60 | # define RESCHEDULE_VECTOR 0xfc | ||
61 | # define CALL_FUNCTION_VECTOR 0xfb | ||
62 | # define CALL_FUNCTION_SINGLE_VECTOR 0xfa | ||
63 | # define THERMAL_APIC_VECTOR 0xf0 | ||
64 | |||
65 | #else | ||
66 | 75 | ||
67 | #define SPURIOUS_APIC_VECTOR 0xff | 76 | #define SPURIOUS_APIC_VECTOR 0xff |
77 | /* | ||
78 | * Sanity check | ||
79 | */ | ||
80 | #if ((SPURIOUS_APIC_VECTOR & 0x0F) != 0x0F) | ||
81 | # error SPURIOUS_APIC_VECTOR definition error | ||
82 | #endif | ||
83 | |||
68 | #define ERROR_APIC_VECTOR 0xfe | 84 | #define ERROR_APIC_VECTOR 0xfe |
69 | #define RESCHEDULE_VECTOR 0xfd | 85 | #define RESCHEDULE_VECTOR 0xfd |
70 | #define CALL_FUNCTION_VECTOR 0xfc | 86 | #define CALL_FUNCTION_VECTOR 0xfc |
71 | #define CALL_FUNCTION_SINGLE_VECTOR 0xfb | 87 | #define CALL_FUNCTION_SINGLE_VECTOR 0xfb |
72 | #define THERMAL_APIC_VECTOR 0xfa | 88 | #define THERMAL_APIC_VECTOR 0xfa |
73 | #define THRESHOLD_APIC_VECTOR 0xf9 | ||
74 | #define UV_BAU_MESSAGE 0xf8 | ||
75 | #define INVALIDATE_TLB_VECTOR_END 0xf7 | ||
76 | #define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */ | ||
77 | |||
78 | #define NUM_INVALIDATE_TLB_VECTORS 8 | ||
79 | 89 | ||
90 | #ifdef CONFIG_X86_32 | ||
91 | /* 0xf8 - 0xf9 : free */ | ||
92 | #else | ||
93 | # define THRESHOLD_APIC_VECTOR 0xf9 | ||
94 | # define UV_BAU_MESSAGE 0xf8 | ||
80 | #endif | 95 | #endif |
81 | 96 | ||
97 | /* f0-f7 used for spreading out TLB flushes: */ | ||
98 | #define INVALIDATE_TLB_VECTOR_END 0xf7 | ||
99 | #define INVALIDATE_TLB_VECTOR_START 0xf0 | ||
100 | #define NUM_INVALIDATE_TLB_VECTORS 8 | ||
101 | |||
82 | /* | 102 | /* |
83 | * Local APIC timer IRQ vector is on a different priority level, | 103 | * Local APIC timer IRQ vector is on a different priority level, |
84 | * to work around the 'lost local interrupt if more than 2 IRQ | 104 | * to work around the 'lost local interrupt if more than 2 IRQ |
85 | * sources per level' errata. | 105 | * sources per level' errata. |
86 | */ | 106 | */ |
87 | #define LOCAL_TIMER_VECTOR 0xef | 107 | #define LOCAL_TIMER_VECTOR 0xef |
108 | |||
109 | /* | ||
110 | * Performance monitoring interrupt vector: | ||
111 | */ | ||
112 | #define LOCAL_PERF_VECTOR 0xee | ||
88 | 113 | ||
89 | /* | 114 | /* |
90 | * First APIC vector available to drivers: (vectors 0x30-0xee) we | 115 | * First APIC vector available to drivers: (vectors 0x30-0xee) we |
91 | * start at 0x31(0x41) to spread out vectors evenly between priority | 116 | * start at 0x31(0x41) to spread out vectors evenly between priority |
92 | * levels. (0x80 is the syscall vector) | 117 | * levels. (0x80 is the syscall vector) |
93 | */ | 118 | */ |
94 | #define FIRST_DEVICE_VECTOR (IRQ15_VECTOR + 2) | 119 | #define FIRST_DEVICE_VECTOR (IRQ15_VECTOR + 2) |
95 | |||
96 | #define NR_VECTORS 256 | ||
97 | 120 | ||
98 | #define FPU_IRQ 13 | 121 | #define NR_VECTORS 256 |
99 | 122 | ||
100 | #define FIRST_VM86_IRQ 3 | 123 | #define FPU_IRQ 13 |
101 | #define LAST_VM86_IRQ 15 | ||
102 | #define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15) | ||
103 | 124 | ||
104 | #define NR_IRQS_LEGACY 16 | 125 | #define FIRST_VM86_IRQ 3 |
126 | #define LAST_VM86_IRQ 15 | ||
105 | 127 | ||
106 | #if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER) | 128 | #ifndef __ASSEMBLY__ |
107 | 129 | static inline int invalid_vm86_irq(int irq) | |
108 | #ifndef CONFIG_SPARSE_IRQ | 130 | { |
109 | # if NR_CPUS < MAX_IO_APICS | 131 | return irq < FIRST_VM86_IRQ || irq > LAST_VM86_IRQ; |
110 | # define NR_IRQS (NR_VECTORS + (32 * NR_CPUS)) | 132 | } |
111 | # else | ||
112 | # define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS)) | ||
113 | # endif | ||
114 | #else | ||
115 | # if (8 * NR_CPUS) > (32 * MAX_IO_APICS) | ||
116 | # define NR_IRQS (NR_VECTORS + (8 * NR_CPUS)) | ||
117 | # else | ||
118 | # define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS)) | ||
119 | # endif | ||
120 | #endif | 133 | #endif |
121 | 134 | ||
122 | #elif defined(CONFIG_X86_VOYAGER) | 135 | /* |
123 | 136 | * Size the maximum number of interrupts. | |
124 | # define NR_IRQS 224 | 137 | * |
138 | * If the irq_desc[] array has a sparse layout, we can size things | ||
139 | * generously - it scales up linearly with the maximum number of CPUs, | ||
140 | * and the maximum number of IO-APICs, whichever is higher. | ||
141 | * | ||
142 | * In other cases we size more conservatively, to not create too large | ||
143 | * static arrays. | ||
144 | */ | ||
125 | 145 | ||
126 | #else /* IO_APIC || VOYAGER */ | 146 | #define NR_IRQS_LEGACY 16 |
127 | 147 | ||
128 | # define NR_IRQS 16 | 148 | #define CPU_VECTOR_LIMIT ( 8 * NR_CPUS ) |
149 | #define IO_APIC_VECTOR_LIMIT ( 32 * MAX_IO_APICS ) | ||
129 | 150 | ||
151 | #ifdef CONFIG_X86_IO_APIC | ||
152 | # ifdef CONFIG_SPARSE_IRQ | ||
153 | # define NR_IRQS \ | ||
154 | (CPU_VECTOR_LIMIT > IO_APIC_VECTOR_LIMIT ? \ | ||
155 | (NR_VECTORS + CPU_VECTOR_LIMIT) : \ | ||
156 | (NR_VECTORS + IO_APIC_VECTOR_LIMIT)) | ||
157 | # else | ||
158 | # if NR_CPUS < MAX_IO_APICS | ||
159 | # define NR_IRQS (NR_VECTORS + 4*CPU_VECTOR_LIMIT) | ||
160 | # else | ||
161 | # define NR_IRQS (NR_VECTORS + IO_APIC_VECTOR_LIMIT) | ||
162 | # endif | ||
163 | # endif | ||
164 | #else /* !CONFIG_X86_IO_APIC: */ | ||
165 | # define NR_IRQS NR_IRQS_LEGACY | ||
130 | #endif | 166 | #endif |
131 | 167 | ||
132 | /* Voyager specific defines */ | ||
133 | /* These define the CPIs we use in linux */ | ||
134 | #define VIC_CPI_LEVEL0 0 | ||
135 | #define VIC_CPI_LEVEL1 1 | ||
136 | /* now the fake CPIs */ | ||
137 | #define VIC_TIMER_CPI 2 | ||
138 | #define VIC_INVALIDATE_CPI 3 | ||
139 | #define VIC_RESCHEDULE_CPI 4 | ||
140 | #define VIC_ENABLE_IRQ_CPI 5 | ||
141 | #define VIC_CALL_FUNCTION_CPI 6 | ||
142 | #define VIC_CALL_FUNCTION_SINGLE_CPI 7 | ||
143 | |||
144 | /* Now the QIC CPIs: Since we don't need the two initial levels, | ||
145 | * these are 2 less than the VIC CPIs */ | ||
146 | #define QIC_CPI_OFFSET 1 | ||
147 | #define QIC_TIMER_CPI (VIC_TIMER_CPI - QIC_CPI_OFFSET) | ||
148 | #define QIC_INVALIDATE_CPI (VIC_INVALIDATE_CPI - QIC_CPI_OFFSET) | ||
149 | #define QIC_RESCHEDULE_CPI (VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET) | ||
150 | #define QIC_ENABLE_IRQ_CPI (VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET) | ||
151 | #define QIC_CALL_FUNCTION_CPI (VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET) | ||
152 | #define QIC_CALL_FUNCTION_SINGLE_CPI (VIC_CALL_FUNCTION_SINGLE_CPI - QIC_CPI_OFFSET) | ||
153 | |||
154 | #define VIC_START_FAKE_CPI VIC_TIMER_CPI | ||
155 | #define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_SINGLE_CPI | ||
156 | |||
157 | /* this is the SYS_INT CPI. */ | ||
158 | #define VIC_SYS_INT 8 | ||
159 | #define VIC_CMN_INT 15 | ||
160 | |||
161 | /* This is the boot CPI for alternate processors. It gets overwritten | ||
162 | * by the above once the system has activated all available processors */ | ||
163 | #define VIC_CPU_BOOT_CPI VIC_CPI_LEVEL0 | ||
164 | #define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8) | ||
165 | |||
166 | |||
167 | #endif /* _ASM_X86_IRQ_VECTORS_H */ | 168 | #endif /* _ASM_X86_IRQ_VECTORS_H */ |