2 * Setup the interrupt stuff.
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
8 * Copyright (C) 1998 Harald Koerfgen
10 #include <linux/sched.h>
11 #include <linux/interrupt.h>
12 #include <linux/mc146818rtc.h>
13 #include <linux/param.h>
14 #include <asm/mipsregs.h>
15 #include <asm/bootinfo.h>
18 #include <asm/reboot.h>
20 #include <asm/dec/interrupts.h>
21 #include <asm/dec/kn01.h>
22 #include <asm/dec/kn02.h>
23 #include <asm/dec/kn02xa.h>
24 #include <asm/dec/kn03.h>
25 #include <asm/dec/ioasic_ints.h>
27 extern asmlinkage
void decstation_handle_int(void);
29 void dec_init_kn01(void);
30 void dec_init_kn230(void);
31 void dec_init_kn02(void);
32 void dec_init_kn02ba(void);
33 void dec_init_kn02ca(void);
34 void dec_init_kn03(void);
36 char *dec_rtc_base
= (char *) KN01_RTC_BASE
; /* Assume DS2100/3100 initially */
38 decint_t dec_interrupt
[NR_INTS
];
41 * Information regarding the IRQ Controller
43 * isr and imr are also hardcoded for different machines in int_handler.S
46 volatile unsigned int *isr
= 0L; /* address of the interrupt status register */
47 volatile unsigned int *imr
= 0L; /* address of the interrupt mask register */
49 extern void dec_machine_restart(char *command
);
50 extern void dec_machine_halt(void);
51 extern void dec_machine_power_off(void);
53 extern void wbflush_setup(void);
55 extern struct rtc_ops dec_rtc_ops
;
57 extern void intr_halt(void);
59 extern int setup_dec_irq(int, struct irqaction
*);
61 void (*board_time_init
) (struct irqaction
* irq
);
63 __initfunc(static void dec_irq_setup(void))
65 switch (mips_machtype
) {
69 case MACH_DS5100
: /* DS5100 MIPSMATE */
72 case MACH_DS5000_200
: /* DS5000 3max */
75 case MACH_DS5000_1XX
: /* DS5000/100 3min */
78 case MACH_DS5000_2X0
: /* DS5000/240 3max+ */
81 case MACH_DS5000_XX
: /* Personal DS5000/2x */
84 case MACH_DS5800
: /* DS5800 Isis */
85 panic("Don't know how to set this up!");
87 case MACH_DS5400
: /* DS5400 MIPSfair */
88 panic("Don't know how to set this up!");
90 case MACH_DS5500
: /* DS5500 MIPSfair-2 */
91 panic("Don't know how to set this up!");
94 set_except_vector(0, decstation_handle_int
);
98 * enable the periodic interrupts
100 __initfunc(static void dec_time_init(struct irqaction
*irq
))
103 * Here we go, enable periodic rtc interrupts.
110 CMOS_WRITE(RTC_REF_CLCK_32KHZ
| (16 - LOG_2_HZ
), RTC_REG_A
);
111 CMOS_WRITE(CMOS_READ(RTC_REG_B
) | RTC_PIE
, RTC_REG_B
);
112 setup_dec_irq(CLOCK
, irq
);
115 __initfunc(void decstation_setup(void))
117 irq_setup
= dec_irq_setup
;
118 board_time_init
= dec_time_init
;
122 _machine_restart
= dec_machine_restart
;
123 _machine_halt
= dec_machine_halt
;
124 _machine_power_off
= dec_machine_power_off
;
126 rtc_ops
= &dec_rtc_ops
;
130 * Machine-specific initialisation for kn01, aka Pmax, aka DS2100, DS3100,
131 * and possibly also the DS5100.
133 __initfunc(void dec_init_kn01(void))
136 * Setup some memory addresses.
138 dec_rtc_base
= (char *) KN01_RTC_BASE
;
141 * Setup interrupt structure
143 dec_interrupt
[CLOCK
].cpu_mask
= IE_IRQ3
;
144 dec_interrupt
[CLOCK
].iemask
= 0;
145 cpu_mask_tbl
[0] = IE_IRQ3
;
146 cpu_irq_nr
[0] = CLOCK
;
148 dec_interrupt
[SCSI_INT
].cpu_mask
= IE_IRQ0
;
149 dec_interrupt
[SCSI_INT
].iemask
= 0;
150 cpu_mask_tbl
[1] = IE_IRQ0
;
151 cpu_irq_nr
[1] = SCSI_INT
;
153 dec_interrupt
[ETHER
].cpu_mask
= IE_IRQ1
;
154 dec_interrupt
[ETHER
].iemask
= 0;
155 cpu_mask_tbl
[2] = IE_IRQ1
;
156 cpu_irq_nr
[2] = ETHER
;
158 dec_interrupt
[SERIAL
].cpu_mask
= IE_IRQ2
;
159 dec_interrupt
[SERIAL
].iemask
= 0;
160 cpu_mask_tbl
[3] = IE_IRQ2
;
161 cpu_irq_nr
[3] = SERIAL
;
163 dec_interrupt
[MEMORY
].cpu_mask
= IE_IRQ4
;
164 dec_interrupt
[MEMORY
].iemask
= 0;
165 cpu_mask_tbl
[4] = IE_IRQ4
;
166 cpu_irq_nr
[4] = MEMORY
;
168 dec_interrupt
[FPU
].cpu_mask
= IE_IRQ5
;
169 dec_interrupt
[FPU
].iemask
= 0;
170 cpu_mask_tbl
[5] = IE_IRQ5
;
172 } /* dec_init_kn01 */
175 * Machine-specific initialisation for kn230, aka MIPSmate, aka DS5100
177 * There are a lot of experiments to do, this is definitely incomplete.
179 __initfunc(void dec_init_kn230(void))
182 * Setup some memory addresses.
184 dec_rtc_base
= (char *) KN01_RTC_BASE
;
187 * Setup interrupt structure
189 dec_interrupt
[CLOCK
].cpu_mask
= IE_IRQ2
;
190 dec_interrupt
[CLOCK
].iemask
= 0;
191 cpu_mask_tbl
[0] = IE_IRQ2
;
192 cpu_irq_nr
[0] = CLOCK
;
194 dec_interrupt
[FPU
].cpu_mask
= IE_IRQ5
;
195 dec_interrupt
[FPU
].iemask
= 0;
196 cpu_mask_tbl
[5] = IE_IRQ5
;
198 } /* dec_init_kn230 */
201 * Machine-specific initialisation for kn02, aka 3max, aka DS5000/2xx.
203 __initfunc(void dec_init_kn02(void))
206 * Setup some memory addresses. FIXME: probably incomplete!
208 dec_rtc_base
= (char *) KN02_RTC_BASE
;
209 isr
= (volatile unsigned int *) KN02_CSR_ADDR
;
210 imr
= (volatile unsigned int *) KN02_CSR_ADDR
;
213 * Setup IOASIC interrupt
215 cpu_ivec_tbl
[1] = kn02_io_int
;
216 cpu_mask_tbl
[1] = IE_IRQ0
;
218 *imr
= *imr
& 0xff00ff00;
221 * Setup interrupt structure
223 dec_interrupt
[CLOCK
].cpu_mask
= IE_IRQ1
;
224 dec_interrupt
[CLOCK
].iemask
= 0;
225 cpu_mask_tbl
[0] = IE_IRQ1
;
226 cpu_irq_nr
[0] = CLOCK
;
228 dec_interrupt
[SCSI_INT
].cpu_mask
= IE_IRQ0
;
229 dec_interrupt
[SCSI_INT
].iemask
= KN02_SLOT5
;
230 asic_mask_tbl
[0] = KN02_SLOT5
;
231 asic_irq_nr
[0] = SCSI_INT
;
233 dec_interrupt
[ETHER
].cpu_mask
= IE_IRQ0
;
234 dec_interrupt
[ETHER
].iemask
= KN02_SLOT6
;
235 asic_mask_tbl
[1] = KN02_SLOT6
;
236 asic_irq_nr
[1] = ETHER
;
238 dec_interrupt
[SERIAL
].cpu_mask
= IE_IRQ0
;
239 dec_interrupt
[SERIAL
].iemask
= KN02_SLOT7
;
240 asic_mask_tbl
[2] = KN02_SLOT7
;
241 asic_irq_nr
[2] = SERIAL
;
243 dec_interrupt
[TC0
].cpu_mask
= IE_IRQ0
;
244 dec_interrupt
[TC0
].iemask
= KN02_SLOT0
;
245 asic_mask_tbl
[3] = KN02_SLOT0
;
246 asic_irq_nr
[3] = TC0
;
248 dec_interrupt
[TC1
].cpu_mask
= IE_IRQ0
;
249 dec_interrupt
[TC1
].iemask
= KN02_SLOT1
;
250 asic_mask_tbl
[4] = KN02_SLOT1
;
251 asic_irq_nr
[4] = TC1
;
253 dec_interrupt
[TC2
].cpu_mask
= IE_IRQ0
;
254 dec_interrupt
[TC2
].iemask
= KN02_SLOT2
;
255 asic_mask_tbl
[5] = KN02_SLOT2
;
256 asic_irq_nr
[5] = TC2
;
258 dec_interrupt
[MEMORY
].cpu_mask
= IE_IRQ3
;
259 dec_interrupt
[MEMORY
].iemask
= 0;
260 cpu_mask_tbl
[2] = IE_IRQ3
;
261 cpu_irq_nr
[2] = MEMORY
;
263 dec_interrupt
[FPU
].cpu_mask
= IE_IRQ5
;
264 dec_interrupt
[FPU
].iemask
= 0;
265 cpu_mask_tbl
[3] = IE_IRQ5
;
268 } /* dec_init_kn02 */
271 * Machine-specific initialisation for kn02ba, aka 3min, aka DS5000/1xx.
273 __initfunc(void dec_init_kn02ba(void))
276 * Setup some memory addresses.
278 dec_rtc_base
= (char *) KN02XA_RTC_BASE
;
279 isr
= (volatile unsigned int *) KN02XA_SIR_ADDR
;
280 imr
= (volatile unsigned int *) KN02XA_SIRM_ADDR
;
283 * Setup IOASIC interrupt
285 cpu_mask_tbl
[0] = IE_IRQ3
;
287 cpu_ivec_tbl
[0] = kn02ba_io_int
;
291 * Setup interrupt structure
293 dec_interrupt
[CLOCK
].cpu_mask
= IE_IRQ3
;
294 dec_interrupt
[CLOCK
].iemask
= KMIN_CLOCK
;
295 asic_mask_tbl
[0] = KMIN_CLOCK
;
296 asic_irq_nr
[0] = CLOCK
;
298 dec_interrupt
[SCSI_DMA_INT
].cpu_mask
= IE_IRQ3
;
299 dec_interrupt
[SCSI_DMA_INT
].iemask
= SCSI_DMA_INTS
;
300 asic_mask_tbl
[1] = SCSI_DMA_INTS
;
301 asic_irq_nr
[1] = SCSI_DMA_INT
;
303 dec_interrupt
[SCSI_INT
].cpu_mask
= IE_IRQ3
;
304 dec_interrupt
[SCSI_INT
].iemask
= SCSI_CHIP
;
305 asic_mask_tbl
[2] = SCSI_CHIP
;
306 asic_irq_nr
[2] = SCSI_INT
;
308 dec_interrupt
[ETHER
].cpu_mask
= IE_IRQ3
;
309 dec_interrupt
[ETHER
].iemask
= LANCE_INTS
;
310 asic_mask_tbl
[3] = LANCE_INTS
;
311 asic_irq_nr
[3] = ETHER
;
313 dec_interrupt
[SERIAL
].cpu_mask
= IE_IRQ3
;
314 dec_interrupt
[SERIAL
].iemask
= SERIAL_INTS
;
315 asic_mask_tbl
[4] = SERIAL_INTS
;
316 asic_irq_nr
[4] = SERIAL
;
318 dec_interrupt
[MEMORY
].cpu_mask
= IE_IRQ3
;
319 dec_interrupt
[MEMORY
].iemask
= KMIN_TIMEOUT
;
320 asic_mask_tbl
[5] = KMIN_TIMEOUT
;
321 asic_irq_nr
[5] = MEMORY
;
323 dec_interrupt
[TC0
].cpu_mask
= IE_IRQ0
;
324 dec_interrupt
[TC0
].iemask
= 0;
325 cpu_mask_tbl
[1] = IE_IRQ0
;
328 dec_interrupt
[TC1
].cpu_mask
= IE_IRQ1
;
329 dec_interrupt
[TC1
].iemask
= 0;
330 cpu_mask_tbl
[2] = IE_IRQ1
;
333 dec_interrupt
[TC2
].cpu_mask
= IE_IRQ2
;
334 dec_interrupt
[TC2
].iemask
= 0;
335 cpu_mask_tbl
[3] = IE_IRQ2
;
338 dec_interrupt
[HALT
].cpu_mask
= IE_IRQ4
;
339 dec_interrupt
[HALT
].iemask
= 0;
340 cpu_mask_tbl
[4] = IE_IRQ4
;
341 cpu_irq_nr
[4] = HALT
;
343 dec_interrupt
[FPU
].cpu_mask
= IE_IRQ5
;
344 dec_interrupt
[FPU
].iemask
= 0;
345 cpu_mask_tbl
[5] = IE_IRQ5
;
348 } /* dec_init_kn02ba */
351 * Machine-specific initialisation for kn02ca, aka maxine, aka DS5000/2x.
353 __initfunc(void dec_init_kn02ca(void))
356 * Setup some memory addresses. FIXME: probably incomplete!
358 dec_rtc_base
= (char *) KN02XA_RTC_BASE
;
359 isr
= (volatile unsigned int *) KN02XA_SIR_ADDR
;
360 imr
= (volatile unsigned int *) KN02XA_SIRM_ADDR
;
363 * Setup IOASIC interrupt
365 cpu_ivec_tbl
[1] = kn02ba_io_int
;
367 cpu_mask_tbl
[1] = IE_IRQ3
;
371 * Setup interrupt structure
373 dec_interrupt
[CLOCK
].cpu_mask
= IE_IRQ1
;
374 dec_interrupt
[CLOCK
].iemask
= 0;
375 cpu_mask_tbl
[0] = IE_IRQ1
;
376 cpu_irq_nr
[0] = CLOCK
;
378 dec_interrupt
[SCSI_DMA_INT
].cpu_mask
= IE_IRQ3
;
379 dec_interrupt
[SCSI_DMA_INT
].iemask
= SCSI_DMA_INTS
;
380 asic_mask_tbl
[0] = SCSI_DMA_INTS
;
381 asic_irq_nr
[0] = SCSI_DMA_INT
;
383 dec_interrupt
[SCSI_INT
].cpu_mask
= IE_IRQ3
;
384 dec_interrupt
[SCSI_INT
].iemask
= SCSI_CHIP
;
385 asic_mask_tbl
[1] = SCSI_CHIP
;
386 asic_irq_nr
[1] = SCSI_INT
;
388 dec_interrupt
[ETHER
].cpu_mask
= IE_IRQ3
;
389 dec_interrupt
[ETHER
].iemask
= LANCE_INTS
;
390 asic_mask_tbl
[2] = LANCE_INTS
;
391 asic_irq_nr
[2] = ETHER
;
393 dec_interrupt
[SERIAL
].cpu_mask
= IE_IRQ3
;
394 dec_interrupt
[SERIAL
].iemask
= XINE_SERIAL_INTS
;
395 asic_mask_tbl
[3] = XINE_SERIAL_INTS
;
396 asic_irq_nr
[3] = SERIAL
;
398 dec_interrupt
[TC0
].cpu_mask
= IE_IRQ3
;
399 dec_interrupt
[TC0
].iemask
= MAXINE_TC0
;
400 asic_mask_tbl
[4] = MAXINE_TC0
;
401 asic_irq_nr
[4] = TC0
;
403 dec_interrupt
[TC1
].cpu_mask
= IE_IRQ3
;
404 dec_interrupt
[TC1
].iemask
= MAXINE_TC1
;
405 asic_mask_tbl
[5] = MAXINE_TC1
;
406 asic_irq_nr
[5] = TC1
;
408 dec_interrupt
[MEMORY
].cpu_mask
= IE_IRQ2
;
409 dec_interrupt
[MEMORY
].iemask
= 0;
410 cpu_mask_tbl
[2] = IE_IRQ2
;
411 cpu_irq_nr
[2] = MEMORY
;
413 dec_interrupt
[HALT
].cpu_mask
= IE_IRQ4
;
414 dec_interrupt
[HALT
].iemask
= 0;
415 cpu_mask_tbl
[3] = IE_IRQ4
;
416 cpu_irq_nr
[3] = HALT
;
418 dec_interrupt
[FPU
].cpu_mask
= IE_IRQ5
;
419 dec_interrupt
[FPU
].iemask
= 0;
420 cpu_mask_tbl
[4] = IE_IRQ5
;
423 } /* dec_init_kn02ca */
426 * Machine-specific initialisation for kn03, aka 3max+, aka DS5000/240.
428 __initfunc(void dec_init_kn03(void))
431 * Setup some memory addresses. FIXME: probably incomplete!
433 dec_rtc_base
= (char *) KN03_RTC_BASE
;
434 isr
= (volatile unsigned int *) KN03_SIR_ADDR
;
435 imr
= (volatile unsigned int *) KN03_SIRM_ADDR
;
438 * Setup IOASIC interrupt
440 cpu_ivec_tbl
[1] = kn03_io_int
;
441 cpu_mask_tbl
[1] = IE_IRQ0
;
446 * Setup interrupt structure
448 dec_interrupt
[CLOCK
].cpu_mask
= IE_IRQ1
;
449 dec_interrupt
[CLOCK
].iemask
= 0;
450 cpu_mask_tbl
[0] = IE_IRQ1
;
451 cpu_irq_nr
[0] = CLOCK
;
453 dec_interrupt
[SCSI_DMA_INT
].cpu_mask
= IE_IRQ0
;
454 dec_interrupt
[SCSI_DMA_INT
].iemask
= SCSI_DMA_INTS
;
455 asic_mask_tbl
[0] = SCSI_DMA_INTS
;
456 asic_irq_nr
[0] = SCSI_DMA_INT
;
458 dec_interrupt
[SCSI_INT
].cpu_mask
= IE_IRQ0
;
459 dec_interrupt
[SCSI_INT
].iemask
= SCSI_CHIP
;
460 asic_mask_tbl
[1] = SCSI_CHIP
;
461 asic_irq_nr
[1] = SCSI_INT
;
463 dec_interrupt
[ETHER
].cpu_mask
= IE_IRQ0
;
464 dec_interrupt
[ETHER
].iemask
= LANCE_INTS
;
465 asic_mask_tbl
[2] = LANCE_INTS
;
466 asic_irq_nr
[2] = ETHER
;
468 dec_interrupt
[SERIAL
].cpu_mask
= IE_IRQ0
;
469 dec_interrupt
[SERIAL
].iemask
= SERIAL_INTS
;
470 asic_mask_tbl
[3] = SERIAL_INTS
;
471 asic_irq_nr
[3] = SERIAL
;
473 dec_interrupt
[TC0
].cpu_mask
= IE_IRQ0
;
474 dec_interrupt
[TC0
].iemask
= KN03_TC0
;
475 asic_mask_tbl
[4] = KN03_TC0
;
476 asic_irq_nr
[4] = TC0
;
478 dec_interrupt
[TC1
].cpu_mask
= IE_IRQ0
;
479 dec_interrupt
[TC1
].iemask
= KN03_TC1
;
480 asic_mask_tbl
[5] = KN03_TC1
;
481 asic_irq_nr
[5] = TC1
;
483 dec_interrupt
[TC2
].cpu_mask
= IE_IRQ0
;
484 dec_interrupt
[TC2
].iemask
= KN03_TC2
;
485 asic_mask_tbl
[6] = KN03_TC2
;
486 asic_irq_nr
[6] = TC2
;
488 dec_interrupt
[MEMORY
].cpu_mask
= IE_IRQ3
;
489 dec_interrupt
[MEMORY
].iemask
= 0;
490 cpu_mask_tbl
[2] = IE_IRQ3
;
491 cpu_irq_nr
[2] = MEMORY
;
493 dec_interrupt
[HALT
].cpu_mask
= IE_IRQ4
;
494 dec_interrupt
[HALT
].iemask
= 0;
495 cpu_mask_tbl
[3] = IE_IRQ4
;
496 cpu_irq_nr
[3] = HALT
;
498 dec_interrupt
[FPU
].cpu_mask
= IE_IRQ5
;
499 dec_interrupt
[FPU
].iemask
= 0;
500 cpu_mask_tbl
[4] = IE_IRQ5
;
503 } /* dec_init_kn03 */