diff options
author | Jesper Nilsson <jesper.nilsson@axis.com> | 2007-11-30 12:09:54 -0500 |
---|---|---|
committer | Jesper Nilsson <jesper.nilsson@axis.com> | 2008-02-08 05:06:27 -0500 |
commit | 693d9847b210f3812bed975d1c8edae90b8f8e1c (patch) | |
tree | aad83572d6fc64d8064005583d5da3ec84a9c0bb /arch/cris/arch-v32 | |
parent | 96e476697d7ed025bfa1af4073e825901b5c6b1a (diff) |
CRIS v32: Update and simplify kernel/irq.c.
- First timer register has changed name to timer0.
- Build IRQs with only IRQ number, mask bit will be calculated instead.
- Add more IRQs, up to 64 supported.
- Use arrays to hold which IRQs triggered instead of trying to do magic
with two 32 bit values now that more than 32 IRQs are supported.
Diffstat (limited to 'arch/cris/arch-v32')
-rw-r--r-- | arch/cris/arch-v32/kernel/irq.c | 274 |
1 files changed, 193 insertions, 81 deletions
diff --git a/arch/cris/arch-v32/kernel/irq.c b/arch/cris/arch-v32/kernel/irq.c index a9acaa270243..173c141ac9ba 100644 --- a/arch/cris/arch-v32/kernel/irq.c +++ b/arch/cris/arch-v32/kernel/irq.c | |||
@@ -15,15 +15,21 @@ | |||
15 | #include <linux/threads.h> | 15 | #include <linux/threads.h> |
16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
17 | #include <linux/kernel_stat.h> | 17 | #include <linux/kernel_stat.h> |
18 | #include <asm/arch/hwregs/reg_map.h> | 18 | #include <hwregs/reg_map.h> |
19 | #include <asm/arch/hwregs/reg_rdwr.h> | 19 | #include <hwregs/reg_rdwr.h> |
20 | #include <asm/arch/hwregs/intr_vect.h> | 20 | #include <hwregs/intr_vect.h> |
21 | #include <asm/arch/hwregs/intr_vect_defs.h> | 21 | #include <hwregs/intr_vect_defs.h> |
22 | 22 | ||
23 | #define CPU_FIXED -1 | 23 | #define CPU_FIXED -1 |
24 | 24 | ||
25 | /* IRQ masks (refer to comment for crisv32_do_multiple) */ | 25 | /* IRQ masks (refer to comment for crisv32_do_multiple) */ |
26 | #define TIMER_MASK (1 << (TIMER_INTR_VECT - FIRST_IRQ)) | 26 | #if TIMER0_INTR_VECT - FIRST_IRQ < 32 |
27 | #define TIMER_MASK (1 << (TIMER0_INTR_VECT - FIRST_IRQ)) | ||
28 | #undef TIMER_VECT1 | ||
29 | #else | ||
30 | #define TIMER_MASK (1 << (TIMER0_INTR_VECT - FIRST_IRQ - 32)) | ||
31 | #define TIMER_VECT1 | ||
32 | #endif | ||
27 | #ifdef CONFIG_ETRAX_KGDB | 33 | #ifdef CONFIG_ETRAX_KGDB |
28 | #if defined(CONFIG_ETRAX_KGDB_PORT0) | 34 | #if defined(CONFIG_ETRAX_KGDB_PORT0) |
29 | #define IGNOREMASK (1 << (SER0_INTR_VECT - FIRST_IRQ)) | 35 | #define IGNOREMASK (1 << (SER0_INTR_VECT - FIRST_IRQ)) |
@@ -44,8 +50,8 @@ struct cris_irq_allocation | |||
44 | cpumask_t mask; /* The CPUs to which the IRQ may be allocated. */ | 50 | cpumask_t mask; /* The CPUs to which the IRQ may be allocated. */ |
45 | }; | 51 | }; |
46 | 52 | ||
47 | struct cris_irq_allocation irq_allocations[NR_IRQS] = | 53 | struct cris_irq_allocation irq_allocations[NR_REAL_IRQS] = |
48 | {[0 ... NR_IRQS - 1] = {0, CPU_MASK_ALL}}; | 54 | { [0 ... NR_REAL_IRQS - 1] = {0, CPU_MASK_ALL} }; |
49 | 55 | ||
50 | static unsigned long irq_regs[NR_CPUS] = | 56 | static unsigned long irq_regs[NR_CPUS] = |
51 | { | 57 | { |
@@ -55,6 +61,12 @@ static unsigned long irq_regs[NR_CPUS] = | |||
55 | #endif | 61 | #endif |
56 | }; | 62 | }; |
57 | 63 | ||
64 | #if NR_REAL_IRQS > 32 | ||
65 | #define NBR_REGS 2 | ||
66 | #else | ||
67 | #define NBR_REGS 1 | ||
68 | #endif | ||
69 | |||
58 | unsigned long cpu_irq_counters[NR_CPUS]; | 70 | unsigned long cpu_irq_counters[NR_CPUS]; |
59 | unsigned long irq_counters[NR_REAL_IRQS]; | 71 | unsigned long irq_counters[NR_REAL_IRQS]; |
60 | 72 | ||
@@ -79,45 +91,81 @@ extern void d_mmu_write(void); | |||
79 | extern void kgdb_init(void); | 91 | extern void kgdb_init(void); |
80 | extern void breakpoint(void); | 92 | extern void breakpoint(void); |
81 | 93 | ||
94 | /* From traps.c. */ | ||
95 | extern void breakh_BUG(void); | ||
96 | |||
82 | /* | 97 | /* |
83 | * Build the IRQ handler stubs using macros from irq.h. First argument is the | 98 | * Build the IRQ handler stubs using macros from irq.h. |
84 | * IRQ number, the second argument is the corresponding bit in | ||
85 | * intr_rw_vect_mask found in asm/arch/hwregs/intr_vect_defs.h. | ||
86 | */ | 99 | */ |
87 | BUILD_IRQ(0x31, (1 << 0)) /* memarb */ | 100 | BUILD_IRQ(0x31) |
88 | BUILD_IRQ(0x32, (1 << 1)) /* gen_io */ | 101 | BUILD_IRQ(0x32) |
89 | BUILD_IRQ(0x33, (1 << 2)) /* iop0 */ | 102 | BUILD_IRQ(0x33) |
90 | BUILD_IRQ(0x34, (1 << 3)) /* iop1 */ | 103 | BUILD_IRQ(0x34) |
91 | BUILD_IRQ(0x35, (1 << 4)) /* iop2 */ | 104 | BUILD_IRQ(0x35) |
92 | BUILD_IRQ(0x36, (1 << 5)) /* iop3 */ | 105 | BUILD_IRQ(0x36) |
93 | BUILD_IRQ(0x37, (1 << 6)) /* dma0 */ | 106 | BUILD_IRQ(0x37) |
94 | BUILD_IRQ(0x38, (1 << 7)) /* dma1 */ | 107 | BUILD_IRQ(0x38) |
95 | BUILD_IRQ(0x39, (1 << 8)) /* dma2 */ | 108 | BUILD_IRQ(0x39) |
96 | BUILD_IRQ(0x3a, (1 << 9)) /* dma3 */ | 109 | BUILD_IRQ(0x3a) |
97 | BUILD_IRQ(0x3b, (1 << 10)) /* dma4 */ | 110 | BUILD_IRQ(0x3b) |
98 | BUILD_IRQ(0x3c, (1 << 11)) /* dma5 */ | 111 | BUILD_IRQ(0x3c) |
99 | BUILD_IRQ(0x3d, (1 << 12)) /* dma6 */ | 112 | BUILD_IRQ(0x3d) |
100 | BUILD_IRQ(0x3e, (1 << 13)) /* dma7 */ | 113 | BUILD_IRQ(0x3e) |
101 | BUILD_IRQ(0x3f, (1 << 14)) /* dma8 */ | 114 | BUILD_IRQ(0x3f) |
102 | BUILD_IRQ(0x40, (1 << 15)) /* dma9 */ | 115 | BUILD_IRQ(0x40) |
103 | BUILD_IRQ(0x41, (1 << 16)) /* ata */ | 116 | BUILD_IRQ(0x41) |
104 | BUILD_IRQ(0x42, (1 << 17)) /* sser0 */ | 117 | BUILD_IRQ(0x42) |
105 | BUILD_IRQ(0x43, (1 << 18)) /* sser1 */ | 118 | BUILD_IRQ(0x43) |
106 | BUILD_IRQ(0x44, (1 << 19)) /* ser0 */ | 119 | BUILD_IRQ(0x44) |
107 | BUILD_IRQ(0x45, (1 << 20)) /* ser1 */ | 120 | BUILD_IRQ(0x45) |
108 | BUILD_IRQ(0x46, (1 << 21)) /* ser2 */ | 121 | BUILD_IRQ(0x46) |
109 | BUILD_IRQ(0x47, (1 << 22)) /* ser3 */ | 122 | BUILD_IRQ(0x47) |
110 | BUILD_IRQ(0x48, (1 << 23)) | 123 | BUILD_IRQ(0x48) |
111 | BUILD_IRQ(0x49, (1 << 24)) /* eth0 */ | 124 | BUILD_IRQ(0x49) |
112 | BUILD_IRQ(0x4a, (1 << 25)) /* eth1 */ | 125 | BUILD_IRQ(0x4a) |
113 | BUILD_TIMER_IRQ(0x4b, (1 << 26))/* timer */ | 126 | BUILD_IRQ(0x4b) |
114 | BUILD_IRQ(0x4c, (1 << 27)) /* bif_arb */ | 127 | BUILD_IRQ(0x4c) |
115 | BUILD_IRQ(0x4d, (1 << 28)) /* bif_dma */ | 128 | BUILD_IRQ(0x4d) |
116 | BUILD_IRQ(0x4e, (1 << 29)) /* ext */ | 129 | BUILD_IRQ(0x4e) |
117 | BUILD_IRQ(0x4f, (1 << 29)) /* ipi */ | 130 | BUILD_IRQ(0x4f) |
131 | BUILD_IRQ(0x50) | ||
132 | #if MACH_IRQS > 32 | ||
133 | BUILD_IRQ(0x51) | ||
134 | BUILD_IRQ(0x52) | ||
135 | BUILD_IRQ(0x53) | ||
136 | BUILD_IRQ(0x54) | ||
137 | BUILD_IRQ(0x55) | ||
138 | BUILD_IRQ(0x56) | ||
139 | BUILD_IRQ(0x57) | ||
140 | BUILD_IRQ(0x58) | ||
141 | BUILD_IRQ(0x59) | ||
142 | BUILD_IRQ(0x5a) | ||
143 | BUILD_IRQ(0x5b) | ||
144 | BUILD_IRQ(0x5c) | ||
145 | BUILD_IRQ(0x5d) | ||
146 | BUILD_IRQ(0x5e) | ||
147 | BUILD_IRQ(0x5f) | ||
148 | BUILD_IRQ(0x60) | ||
149 | BUILD_IRQ(0x61) | ||
150 | BUILD_IRQ(0x62) | ||
151 | BUILD_IRQ(0x63) | ||
152 | BUILD_IRQ(0x64) | ||
153 | BUILD_IRQ(0x65) | ||
154 | BUILD_IRQ(0x66) | ||
155 | BUILD_IRQ(0x67) | ||
156 | BUILD_IRQ(0x68) | ||
157 | BUILD_IRQ(0x69) | ||
158 | BUILD_IRQ(0x6a) | ||
159 | BUILD_IRQ(0x6b) | ||
160 | BUILD_IRQ(0x6c) | ||
161 | BUILD_IRQ(0x6d) | ||
162 | BUILD_IRQ(0x6e) | ||
163 | BUILD_IRQ(0x6f) | ||
164 | BUILD_IRQ(0x70) | ||
165 | #endif | ||
118 | 166 | ||
119 | /* Pointers to the low-level handlers. */ | 167 | /* Pointers to the low-level handlers. */ |
120 | static void (*interrupt[NR_IRQS])(void) = { | 168 | static void (*interrupt[MACH_IRQS])(void) = { |
121 | IRQ0x31_interrupt, IRQ0x32_interrupt, IRQ0x33_interrupt, | 169 | IRQ0x31_interrupt, IRQ0x32_interrupt, IRQ0x33_interrupt, |
122 | IRQ0x34_interrupt, IRQ0x35_interrupt, IRQ0x36_interrupt, | 170 | IRQ0x34_interrupt, IRQ0x35_interrupt, IRQ0x36_interrupt, |
123 | IRQ0x37_interrupt, IRQ0x38_interrupt, IRQ0x39_interrupt, | 171 | IRQ0x37_interrupt, IRQ0x38_interrupt, IRQ0x39_interrupt, |
@@ -128,7 +176,20 @@ static void (*interrupt[NR_IRQS])(void) = { | |||
128 | IRQ0x46_interrupt, IRQ0x47_interrupt, IRQ0x48_interrupt, | 176 | IRQ0x46_interrupt, IRQ0x47_interrupt, IRQ0x48_interrupt, |
129 | IRQ0x49_interrupt, IRQ0x4a_interrupt, IRQ0x4b_interrupt, | 177 | IRQ0x49_interrupt, IRQ0x4a_interrupt, IRQ0x4b_interrupt, |
130 | IRQ0x4c_interrupt, IRQ0x4d_interrupt, IRQ0x4e_interrupt, | 178 | IRQ0x4c_interrupt, IRQ0x4d_interrupt, IRQ0x4e_interrupt, |
131 | IRQ0x4f_interrupt | 179 | IRQ0x4f_interrupt, IRQ0x50_interrupt, |
180 | #if MACH_IRQS > 32 | ||
181 | IRQ0x51_interrupt, IRQ0x52_interrupt, IRQ0x53_interrupt, | ||
182 | IRQ0x54_interrupt, IRQ0x55_interrupt, IRQ0x56_interrupt, | ||
183 | IRQ0x57_interrupt, IRQ0x58_interrupt, IRQ0x59_interrupt, | ||
184 | IRQ0x5a_interrupt, IRQ0x5b_interrupt, IRQ0x5c_interrupt, | ||
185 | IRQ0x5d_interrupt, IRQ0x5e_interrupt, IRQ0x5f_interrupt, | ||
186 | IRQ0x60_interrupt, IRQ0x61_interrupt, IRQ0x62_interrupt, | ||
187 | IRQ0x63_interrupt, IRQ0x64_interrupt, IRQ0x65_interrupt, | ||
188 | IRQ0x66_interrupt, IRQ0x67_interrupt, IRQ0x68_interrupt, | ||
189 | IRQ0x69_interrupt, IRQ0x6a_interrupt, IRQ0x6b_interrupt, | ||
190 | IRQ0x6c_interrupt, IRQ0x6d_interrupt, IRQ0x6e_interrupt, | ||
191 | IRQ0x6f_interrupt, IRQ0x70_interrupt, | ||
192 | #endif | ||
132 | }; | 193 | }; |
133 | 194 | ||
134 | void | 195 | void |
@@ -137,13 +198,26 @@ block_irq(int irq, int cpu) | |||
137 | int intr_mask; | 198 | int intr_mask; |
138 | unsigned long flags; | 199 | unsigned long flags; |
139 | 200 | ||
140 | spin_lock_irqsave(&irq_lock, flags); | 201 | spin_lock_irqsave(&irq_lock, flags); |
141 | intr_mask = REG_RD_INT(intr_vect, irq_regs[cpu], rw_mask); | 202 | if (irq - FIRST_IRQ < 32) |
142 | 203 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | |
143 | /* Remember; 1 let through, 0 block. */ | 204 | rw_mask, 0); |
144 | intr_mask &= ~(1 << (irq - FIRST_IRQ)); | 205 | else |
145 | 206 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | |
146 | REG_WR_INT(intr_vect, irq_regs[cpu], rw_mask, intr_mask); | 207 | rw_mask, 1); |
208 | |||
209 | /* Remember; 1 let thru, 0 block. */ | ||
210 | if (irq - FIRST_IRQ < 32) | ||
211 | intr_mask &= ~(1 << (irq - FIRST_IRQ)); | ||
212 | else | ||
213 | intr_mask &= ~(1 << (irq - FIRST_IRQ - 32)); | ||
214 | |||
215 | if (irq - FIRST_IRQ < 32) | ||
216 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, | ||
217 | 0, intr_mask); | ||
218 | else | ||
219 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, | ||
220 | 1, intr_mask); | ||
147 | spin_unlock_irqrestore(&irq_lock, flags); | 221 | spin_unlock_irqrestore(&irq_lock, flags); |
148 | } | 222 | } |
149 | 223 | ||
@@ -154,12 +228,26 @@ unblock_irq(int irq, int cpu) | |||
154 | unsigned long flags; | 228 | unsigned long flags; |
155 | 229 | ||
156 | spin_lock_irqsave(&irq_lock, flags); | 230 | spin_lock_irqsave(&irq_lock, flags); |
157 | intr_mask = REG_RD_INT(intr_vect, irq_regs[cpu], rw_mask); | 231 | if (irq - FIRST_IRQ < 32) |
158 | 232 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | |
159 | /* Remember; 1 let through, 0 block. */ | 233 | rw_mask, 0); |
160 | intr_mask |= (1 << (irq - FIRST_IRQ)); | 234 | else |
235 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | ||
236 | rw_mask, 1); | ||
237 | |||
238 | /* Remember; 1 let thru, 0 block. */ | ||
239 | if (irq - FIRST_IRQ < 32) | ||
240 | intr_mask |= (1 << (irq - FIRST_IRQ)); | ||
241 | else | ||
242 | intr_mask |= (1 << (irq - FIRST_IRQ - 32)); | ||
243 | |||
244 | if (irq - FIRST_IRQ < 32) | ||
245 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, | ||
246 | 0, intr_mask); | ||
247 | else | ||
248 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, | ||
249 | 1, intr_mask); | ||
161 | 250 | ||
162 | REG_WR_INT(intr_vect, irq_regs[cpu], rw_mask, intr_mask); | ||
163 | spin_unlock_irqrestore(&irq_lock, flags); | 251 | spin_unlock_irqrestore(&irq_lock, flags); |
164 | } | 252 | } |
165 | 253 | ||
@@ -298,8 +386,9 @@ crisv32_do_multiple(struct pt_regs* regs) | |||
298 | { | 386 | { |
299 | int cpu; | 387 | int cpu; |
300 | int mask; | 388 | int mask; |
301 | int masked; | 389 | int masked[NBR_REGS]; |
302 | int bit; | 390 | int bit; |
391 | int i; | ||
303 | 392 | ||
304 | cpu = smp_processor_id(); | 393 | cpu = smp_processor_id(); |
305 | 394 | ||
@@ -308,42 +397,59 @@ crisv32_do_multiple(struct pt_regs* regs) | |||
308 | */ | 397 | */ |
309 | irq_enter(); | 398 | irq_enter(); |
310 | 399 | ||
311 | /* Get which IRQs that happened. */ | 400 | for (i = 0; i < NBR_REGS; i++) { |
312 | masked = REG_RD_INT(intr_vect, irq_regs[cpu], r_masked_vect); | 401 | /* Get which IRQs that happend. */ |
402 | masked[i] = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | ||
403 | r_masked_vect, i); | ||
313 | 404 | ||
314 | /* Calculate new IRQ mask with these IRQs disabled. */ | 405 | /* Calculate new IRQ mask with these IRQs disabled. */ |
315 | mask = REG_RD_INT(intr_vect, irq_regs[cpu], rw_mask); | 406 | mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, i); |
316 | mask &= ~masked; | 407 | mask &= ~masked[i]; |
317 | 408 | ||
318 | /* Timer IRQ is never masked */ | 409 | /* Timer IRQ is never masked */ |
319 | if (masked & TIMER_MASK) | 410 | #ifdef TIMER_VECT1 |
320 | mask |= TIMER_MASK; | 411 | if ((i == 1) && (masked[0] & TIMER_MASK)) |
321 | 412 | mask |= TIMER_MASK; | |
322 | /* Block all the IRQs */ | 413 | #else |
323 | REG_WR_INT(intr_vect, irq_regs[cpu], rw_mask, mask); | 414 | if ((i == 0) && (masked[0] & TIMER_MASK)) |
415 | mask |= TIMER_MASK; | ||
416 | #endif | ||
417 | /* Block all the IRQs */ | ||
418 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, i, mask); | ||
324 | 419 | ||
325 | /* Check for timer IRQ and handle it special. */ | 420 | /* Check for timer IRQ and handle it special. */ |
326 | if (masked & TIMER_MASK) { | 421 | #ifdef TIMER_VECT1 |
327 | masked &= ~TIMER_MASK; | 422 | if ((i == 1) && (masked[i] & TIMER_MASK)) { |
328 | do_IRQ(TIMER_INTR_VECT, regs); | 423 | masked[i] &= ~TIMER_MASK; |
424 | do_IRQ(TIMER0_INTR_VECT, regs); | ||
425 | } | ||
426 | #else | ||
427 | if ((i == 0) && (masked[i] & TIMER_MASK)) { | ||
428 | masked[i] &= ~TIMER_MASK; | ||
429 | do_IRQ(TIMER0_INTR_VECT, regs); | ||
430 | } | ||
329 | } | 431 | } |
432 | #endif | ||
330 | 433 | ||
331 | #ifdef IGNORE_MASK | 434 | #ifdef IGNORE_MASK |
332 | /* Remove IRQs that can't be handled as multiple. */ | 435 | /* Remove IRQs that can't be handled as multiple. */ |
333 | masked &= ~IGNORE_MASK; | 436 | masked[0] &= ~IGNORE_MASK; |
334 | #endif | 437 | #endif |
335 | 438 | ||
336 | /* Handle the rest of the IRQs. */ | 439 | /* Handle the rest of the IRQs. */ |
337 | for (bit = 0; bit < 32; bit++) | 440 | for (i = 0; i < NBR_REGS; i++) { |
338 | { | 441 | for (bit = 0; bit < 32; bit++) { |
339 | if (masked & (1 << bit)) | 442 | if (masked[i] & (1 << bit)) |
340 | do_IRQ(bit + FIRST_IRQ, regs); | 443 | do_IRQ(bit + FIRST_IRQ + i*32, regs); |
444 | } | ||
341 | } | 445 | } |
342 | 446 | ||
343 | /* Unblock all the IRQs. */ | 447 | /* Unblock all the IRQs. */ |
344 | mask = REG_RD_INT(intr_vect, irq_regs[cpu], rw_mask); | 448 | for (i = 0; i < NBR_REGS; i++) { |
345 | mask |= masked; | 449 | mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, i); |
346 | REG_WR_INT(intr_vect, irq_regs[cpu], rw_mask, mask); | 450 | mask |= masked[i]; |
451 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, i, mask); | ||
452 | } | ||
347 | 453 | ||
348 | /* This irq_exit() will trigger the soft IRQs. */ | 454 | /* This irq_exit() will trigger the soft IRQs. */ |
349 | irq_exit(); | 455 | irq_exit(); |
@@ -361,20 +467,21 @@ init_IRQ(void) | |||
361 | reg_intr_vect_rw_mask vect_mask = {0}; | 467 | reg_intr_vect_rw_mask vect_mask = {0}; |
362 | 468 | ||
363 | /* Clear all interrupts masks. */ | 469 | /* Clear all interrupts masks. */ |
364 | REG_WR(intr_vect, regi_irq, rw_mask, vect_mask); | 470 | for (i = 0; i < NBR_REGS; i++) |
471 | REG_WR_VECT(intr_vect, regi_irq, rw_mask, i, vect_mask); | ||
365 | 472 | ||
366 | for (i = 0; i < 256; i++) | 473 | for (i = 0; i < 256; i++) |
367 | etrax_irv->v[i] = weird_irq; | 474 | etrax_irv->v[i] = weird_irq; |
368 | 475 | ||
369 | /* Point all IRQs to bad handlers. */ | 476 | /* Point all IRQ's to bad handlers. */ |
370 | for (i = FIRST_IRQ, j = 0; j < NR_IRQS; i++, j++) { | 477 | for (i = FIRST_IRQ, j = 0; j < NR_IRQS; i++, j++) { |
371 | irq_desc[j].chip = &crisv32_irq_type; | 478 | irq_desc[j].chip = &crisv32_irq_type; |
372 | set_exception_vector(i, interrupt[j]); | 479 | set_exception_vector(i, interrupt[j]); |
373 | } | 480 | } |
374 | 481 | ||
375 | /* Mark Timer and IPI IRQs as CPU local */ | 482 | /* Mark Timer and IPI IRQs as CPU local */ |
376 | irq_allocations[TIMER_INTR_VECT - FIRST_IRQ].cpu = CPU_FIXED; | 483 | irq_allocations[TIMER0_INTR_VECT - FIRST_IRQ].cpu = CPU_FIXED; |
377 | irq_desc[TIMER_INTR_VECT].status |= IRQ_PER_CPU; | 484 | irq_desc[TIMER0_INTR_VECT].status |= IRQ_PER_CPU; |
378 | irq_allocations[IPI_INTR_VECT - FIRST_IRQ].cpu = CPU_FIXED; | 485 | irq_allocations[IPI_INTR_VECT - FIRST_IRQ].cpu = CPU_FIXED; |
379 | irq_desc[IPI_INTR_VECT].status |= IRQ_PER_CPU; | 486 | irq_desc[IPI_INTR_VECT].status |= IRQ_PER_CPU; |
380 | 487 | ||
@@ -391,6 +498,11 @@ init_IRQ(void) | |||
391 | set_exception_vector(0x0a, d_mmu_access); | 498 | set_exception_vector(0x0a, d_mmu_access); |
392 | set_exception_vector(0x0b, d_mmu_write); | 499 | set_exception_vector(0x0b, d_mmu_write); |
393 | 500 | ||
501 | #ifdef CONFIG_BUG | ||
502 | /* Break 14 handler, used to implement cheap BUG(). */ | ||
503 | set_exception_vector(0x1e, breakh_BUG); | ||
504 | #endif | ||
505 | |||
394 | /* The system-call trap is reached by "break 13". */ | 506 | /* The system-call trap is reached by "break 13". */ |
395 | set_exception_vector(0x1d, system_call); | 507 | set_exception_vector(0x1d, system_call); |
396 | 508 | ||