diff options
Diffstat (limited to 'arch/mips/dec/setup.c')
-rw-r--r-- | arch/mips/dec/setup.c | 784 |
1 files changed, 784 insertions, 0 deletions
diff --git a/arch/mips/dec/setup.c b/arch/mips/dec/setup.c new file mode 100644 index 000000000..99b9b2975 --- /dev/null +++ b/arch/mips/dec/setup.c | |||
@@ -0,0 +1,784 @@ | |||
1 | /* | ||
2 | * System-specific setup, especially interrupts. | ||
3 | * | ||
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 | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 1998 Harald Koerfgen | ||
9 | * Copyright (C) 2000, 2001, 2002, 2003, 2005, 2020 Maciej W. Rozycki | ||
10 | */ | ||
11 | #include <linux/console.h> | ||
12 | #include <linux/export.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/ioport.h> | ||
16 | #include <linux/irq.h> | ||
17 | #include <linux/irqnr.h> | ||
18 | #include <linux/memblock.h> | ||
19 | #include <linux/param.h> | ||
20 | #include <linux/percpu-defs.h> | ||
21 | #include <linux/sched.h> | ||
22 | #include <linux/spinlock.h> | ||
23 | #include <linux/types.h> | ||
24 | #include <linux/pm.h> | ||
25 | |||
26 | #include <asm/addrspace.h> | ||
27 | #include <asm/bootinfo.h> | ||
28 | #include <asm/cpu.h> | ||
29 | #include <asm/cpu-features.h> | ||
30 | #include <asm/cpu-type.h> | ||
31 | #include <asm/irq.h> | ||
32 | #include <asm/irq_cpu.h> | ||
33 | #include <asm/mipsregs.h> | ||
34 | #include <asm/page.h> | ||
35 | #include <asm/reboot.h> | ||
36 | #include <asm/sections.h> | ||
37 | #include <asm/time.h> | ||
38 | #include <asm/traps.h> | ||
39 | #include <asm/wbflush.h> | ||
40 | |||
41 | #include <asm/dec/interrupts.h> | ||
42 | #include <asm/dec/ioasic.h> | ||
43 | #include <asm/dec/ioasic_addrs.h> | ||
44 | #include <asm/dec/ioasic_ints.h> | ||
45 | #include <asm/dec/kn01.h> | ||
46 | #include <asm/dec/kn02.h> | ||
47 | #include <asm/dec/kn02ba.h> | ||
48 | #include <asm/dec/kn02ca.h> | ||
49 | #include <asm/dec/kn03.h> | ||
50 | #include <asm/dec/kn230.h> | ||
51 | #include <asm/dec/system.h> | ||
52 | |||
53 | |||
54 | extern void dec_machine_restart(char *command); | ||
55 | extern void dec_machine_halt(void); | ||
56 | extern void dec_machine_power_off(void); | ||
57 | extern irqreturn_t dec_intr_halt(int irq, void *dev_id); | ||
58 | |||
59 | unsigned long dec_kn_slot_base, dec_kn_slot_size; | ||
60 | |||
61 | EXPORT_SYMBOL(dec_kn_slot_base); | ||
62 | EXPORT_SYMBOL(dec_kn_slot_size); | ||
63 | |||
64 | int dec_tc_bus; | ||
65 | |||
66 | DEFINE_SPINLOCK(ioasic_ssr_lock); | ||
67 | EXPORT_SYMBOL(ioasic_ssr_lock); | ||
68 | |||
69 | volatile u32 *ioasic_base; | ||
70 | |||
71 | EXPORT_SYMBOL(ioasic_base); | ||
72 | |||
73 | /* | ||
74 | * IRQ routing and priority tables. Priorites are set as follows: | ||
75 | * | ||
76 | * KN01 KN230 KN02 KN02-BA KN02-CA KN03 | ||
77 | * | ||
78 | * MEMORY CPU CPU CPU ASIC CPU CPU | ||
79 | * RTC CPU CPU CPU ASIC CPU CPU | ||
80 | * DMA - - - ASIC ASIC ASIC | ||
81 | * SERIAL0 CPU CPU CSR ASIC ASIC ASIC | ||
82 | * SERIAL1 - - - ASIC - ASIC | ||
83 | * SCSI CPU CPU CSR ASIC ASIC ASIC | ||
84 | * ETHERNET CPU * CSR ASIC ASIC ASIC | ||
85 | * other - - - ASIC - - | ||
86 | * TC2 - - CSR CPU ASIC ASIC | ||
87 | * TC1 - - CSR CPU ASIC ASIC | ||
88 | * TC0 - - CSR CPU ASIC ASIC | ||
89 | * other - CPU - CPU ASIC ASIC | ||
90 | * other - - - - CPU CPU | ||
91 | * | ||
92 | * * -- shared with SCSI | ||
93 | */ | ||
94 | |||
95 | int dec_interrupt[DEC_NR_INTS] = { | ||
96 | [0 ... DEC_NR_INTS - 1] = -1 | ||
97 | }; | ||
98 | |||
99 | EXPORT_SYMBOL(dec_interrupt); | ||
100 | |||
101 | int_ptr cpu_mask_nr_tbl[DEC_MAX_CPU_INTS][2] = { | ||
102 | { { .i = ~0 }, { .p = dec_intr_unimplemented } }, | ||
103 | }; | ||
104 | int_ptr asic_mask_nr_tbl[DEC_MAX_ASIC_INTS][2] = { | ||
105 | { { .i = ~0 }, { .p = asic_intr_unimplemented } }, | ||
106 | }; | ||
107 | int cpu_fpu_mask = DEC_CPU_IRQ_MASK(DEC_CPU_INR_FPU); | ||
108 | int *fpu_kstat_irq; | ||
109 | |||
110 | static irq_handler_t busirq_handler; | ||
111 | static unsigned int busirq_flags = IRQF_NO_THREAD; | ||
112 | |||
113 | /* | ||
114 | * Bus error (DBE/IBE exceptions and bus interrupts) handling setup. | ||
115 | */ | ||
116 | static void __init dec_be_init(void) | ||
117 | { | ||
118 | switch (mips_machtype) { | ||
119 | case MACH_DS23100: /* DS2100/DS3100 Pmin/Pmax */ | ||
120 | board_be_handler = dec_kn01_be_handler; | ||
121 | busirq_handler = dec_kn01_be_interrupt; | ||
122 | busirq_flags |= IRQF_SHARED; | ||
123 | dec_kn01_be_init(); | ||
124 | break; | ||
125 | case MACH_DS5000_1XX: /* DS5000/1xx 3min */ | ||
126 | case MACH_DS5000_XX: /* DS5000/xx Maxine */ | ||
127 | board_be_handler = dec_kn02xa_be_handler; | ||
128 | busirq_handler = dec_kn02xa_be_interrupt; | ||
129 | dec_kn02xa_be_init(); | ||
130 | break; | ||
131 | case MACH_DS5000_200: /* DS5000/200 3max */ | ||
132 | case MACH_DS5000_2X0: /* DS5000/240 3max+ */ | ||
133 | case MACH_DS5900: /* DS5900 bigmax */ | ||
134 | board_be_handler = dec_ecc_be_handler; | ||
135 | busirq_handler = dec_ecc_be_interrupt; | ||
136 | dec_ecc_be_init(); | ||
137 | break; | ||
138 | } | ||
139 | } | ||
140 | |||
141 | void __init plat_mem_setup(void) | ||
142 | { | ||
143 | board_be_init = dec_be_init; | ||
144 | |||
145 | wbflush_setup(); | ||
146 | |||
147 | _machine_restart = dec_machine_restart; | ||
148 | _machine_halt = dec_machine_halt; | ||
149 | pm_power_off = dec_machine_power_off; | ||
150 | |||
151 | ioport_resource.start = ~0UL; | ||
152 | ioport_resource.end = 0UL; | ||
153 | |||
154 | /* Stay away from the firmware working memory area for now. */ | ||
155 | memblock_reserve(PHYS_OFFSET, __pa_symbol(&_text) - PHYS_OFFSET); | ||
156 | } | ||
157 | |||
158 | /* | ||
159 | * Machine-specific initialisation for KN01, aka DS2100 (aka Pmin) | ||
160 | * or DS3100 (aka Pmax). | ||
161 | */ | ||
162 | static int kn01_interrupt[DEC_NR_INTS] __initdata = { | ||
163 | [DEC_IRQ_CASCADE] = -1, | ||
164 | [DEC_IRQ_AB_RECV] = -1, | ||
165 | [DEC_IRQ_AB_XMIT] = -1, | ||
166 | [DEC_IRQ_DZ11] = DEC_CPU_IRQ_NR(KN01_CPU_INR_DZ11), | ||
167 | [DEC_IRQ_ASC] = -1, | ||
168 | [DEC_IRQ_FLOPPY] = -1, | ||
169 | [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU), | ||
170 | [DEC_IRQ_HALT] = -1, | ||
171 | [DEC_IRQ_ISDN] = -1, | ||
172 | [DEC_IRQ_LANCE] = DEC_CPU_IRQ_NR(KN01_CPU_INR_LANCE), | ||
173 | [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN01_CPU_INR_BUS), | ||
174 | [DEC_IRQ_PSU] = -1, | ||
175 | [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN01_CPU_INR_RTC), | ||
176 | [DEC_IRQ_SCC0] = -1, | ||
177 | [DEC_IRQ_SCC1] = -1, | ||
178 | [DEC_IRQ_SII] = DEC_CPU_IRQ_NR(KN01_CPU_INR_SII), | ||
179 | [DEC_IRQ_TC0] = -1, | ||
180 | [DEC_IRQ_TC1] = -1, | ||
181 | [DEC_IRQ_TC2] = -1, | ||
182 | [DEC_IRQ_TIMER] = -1, | ||
183 | [DEC_IRQ_VIDEO] = DEC_CPU_IRQ_NR(KN01_CPU_INR_VIDEO), | ||
184 | [DEC_IRQ_ASC_MERR] = -1, | ||
185 | [DEC_IRQ_ASC_ERR] = -1, | ||
186 | [DEC_IRQ_ASC_DMA] = -1, | ||
187 | [DEC_IRQ_FLOPPY_ERR] = -1, | ||
188 | [DEC_IRQ_ISDN_ERR] = -1, | ||
189 | [DEC_IRQ_ISDN_RXDMA] = -1, | ||
190 | [DEC_IRQ_ISDN_TXDMA] = -1, | ||
191 | [DEC_IRQ_LANCE_MERR] = -1, | ||
192 | [DEC_IRQ_SCC0A_RXERR] = -1, | ||
193 | [DEC_IRQ_SCC0A_RXDMA] = -1, | ||
194 | [DEC_IRQ_SCC0A_TXERR] = -1, | ||
195 | [DEC_IRQ_SCC0A_TXDMA] = -1, | ||
196 | [DEC_IRQ_AB_RXERR] = -1, | ||
197 | [DEC_IRQ_AB_RXDMA] = -1, | ||
198 | [DEC_IRQ_AB_TXERR] = -1, | ||
199 | [DEC_IRQ_AB_TXDMA] = -1, | ||
200 | [DEC_IRQ_SCC1A_RXERR] = -1, | ||
201 | [DEC_IRQ_SCC1A_RXDMA] = -1, | ||
202 | [DEC_IRQ_SCC1A_TXERR] = -1, | ||
203 | [DEC_IRQ_SCC1A_TXDMA] = -1, | ||
204 | }; | ||
205 | |||
206 | static int_ptr kn01_cpu_mask_nr_tbl[][2] __initdata = { | ||
207 | { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_BUS) }, | ||
208 | { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_BUS) } }, | ||
209 | { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_RTC) }, | ||
210 | { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_RTC) } }, | ||
211 | { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_DZ11) }, | ||
212 | { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_DZ11) } }, | ||
213 | { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_SII) }, | ||
214 | { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_SII) } }, | ||
215 | { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_LANCE) }, | ||
216 | { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_LANCE) } }, | ||
217 | { { .i = DEC_CPU_IRQ_ALL }, | ||
218 | { .p = cpu_all_int } }, | ||
219 | }; | ||
220 | |||
221 | static void __init dec_init_kn01(void) | ||
222 | { | ||
223 | /* IRQ routing. */ | ||
224 | memcpy(&dec_interrupt, &kn01_interrupt, | ||
225 | sizeof(kn01_interrupt)); | ||
226 | |||
227 | /* CPU IRQ priorities. */ | ||
228 | memcpy(&cpu_mask_nr_tbl, &kn01_cpu_mask_nr_tbl, | ||
229 | sizeof(kn01_cpu_mask_nr_tbl)); | ||
230 | |||
231 | mips_cpu_irq_init(); | ||
232 | |||
233 | } /* dec_init_kn01 */ | ||
234 | |||
235 | |||
236 | /* | ||
237 | * Machine-specific initialisation for KN230, aka DS5100, aka MIPSmate. | ||
238 | */ | ||
239 | static int kn230_interrupt[DEC_NR_INTS] __initdata = { | ||
240 | [DEC_IRQ_CASCADE] = -1, | ||
241 | [DEC_IRQ_AB_RECV] = -1, | ||
242 | [DEC_IRQ_AB_XMIT] = -1, | ||
243 | [DEC_IRQ_DZ11] = DEC_CPU_IRQ_NR(KN230_CPU_INR_DZ11), | ||
244 | [DEC_IRQ_ASC] = -1, | ||
245 | [DEC_IRQ_FLOPPY] = -1, | ||
246 | [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU), | ||
247 | [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN230_CPU_INR_HALT), | ||
248 | [DEC_IRQ_ISDN] = -1, | ||
249 | [DEC_IRQ_LANCE] = DEC_CPU_IRQ_NR(KN230_CPU_INR_LANCE), | ||
250 | [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN230_CPU_INR_BUS), | ||
251 | [DEC_IRQ_PSU] = -1, | ||
252 | [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN230_CPU_INR_RTC), | ||
253 | [DEC_IRQ_SCC0] = -1, | ||
254 | [DEC_IRQ_SCC1] = -1, | ||
255 | [DEC_IRQ_SII] = DEC_CPU_IRQ_NR(KN230_CPU_INR_SII), | ||
256 | [DEC_IRQ_TC0] = -1, | ||
257 | [DEC_IRQ_TC1] = -1, | ||
258 | [DEC_IRQ_TC2] = -1, | ||
259 | [DEC_IRQ_TIMER] = -1, | ||
260 | [DEC_IRQ_VIDEO] = -1, | ||
261 | [DEC_IRQ_ASC_MERR] = -1, | ||
262 | [DEC_IRQ_ASC_ERR] = -1, | ||
263 | [DEC_IRQ_ASC_DMA] = -1, | ||
264 | [DEC_IRQ_FLOPPY_ERR] = -1, | ||
265 | [DEC_IRQ_ISDN_ERR] = -1, | ||
266 | [DEC_IRQ_ISDN_RXDMA] = -1, | ||
267 | [DEC_IRQ_ISDN_TXDMA] = -1, | ||
268 | [DEC_IRQ_LANCE_MERR] = -1, | ||
269 | [DEC_IRQ_SCC0A_RXERR] = -1, | ||
270 | [DEC_IRQ_SCC0A_RXDMA] = -1, | ||
271 | [DEC_IRQ_SCC0A_TXERR] = -1, | ||
272 | [DEC_IRQ_SCC0A_TXDMA] = -1, | ||
273 | [DEC_IRQ_AB_RXERR] = -1, | ||
274 | [DEC_IRQ_AB_RXDMA] = -1, | ||
275 | [DEC_IRQ_AB_TXERR] = -1, | ||
276 | [DEC_IRQ_AB_TXDMA] = -1, | ||
277 | [DEC_IRQ_SCC1A_RXERR] = -1, | ||
278 | [DEC_IRQ_SCC1A_RXDMA] = -1, | ||
279 | [DEC_IRQ_SCC1A_TXERR] = -1, | ||
280 | [DEC_IRQ_SCC1A_TXDMA] = -1, | ||
281 | }; | ||
282 | |||
283 | static int_ptr kn230_cpu_mask_nr_tbl[][2] __initdata = { | ||
284 | { { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_BUS) }, | ||
285 | { .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_BUS) } }, | ||
286 | { { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_RTC) }, | ||
287 | { .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_RTC) } }, | ||
288 | { { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_DZ11) }, | ||
289 | { .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_DZ11) } }, | ||
290 | { { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_SII) }, | ||
291 | { .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_SII) } }, | ||
292 | { { .i = DEC_CPU_IRQ_ALL }, | ||
293 | { .p = cpu_all_int } }, | ||
294 | }; | ||
295 | |||
296 | static void __init dec_init_kn230(void) | ||
297 | { | ||
298 | /* IRQ routing. */ | ||
299 | memcpy(&dec_interrupt, &kn230_interrupt, | ||
300 | sizeof(kn230_interrupt)); | ||
301 | |||
302 | /* CPU IRQ priorities. */ | ||
303 | memcpy(&cpu_mask_nr_tbl, &kn230_cpu_mask_nr_tbl, | ||
304 | sizeof(kn230_cpu_mask_nr_tbl)); | ||
305 | |||
306 | mips_cpu_irq_init(); | ||
307 | |||
308 | } /* dec_init_kn230 */ | ||
309 | |||
310 | |||
311 | /* | ||
312 | * Machine-specific initialisation for KN02, aka DS5000/200, aka 3max. | ||
313 | */ | ||
314 | static int kn02_interrupt[DEC_NR_INTS] __initdata = { | ||
315 | [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02_CPU_INR_CASCADE), | ||
316 | [DEC_IRQ_AB_RECV] = -1, | ||
317 | [DEC_IRQ_AB_XMIT] = -1, | ||
318 | [DEC_IRQ_DZ11] = KN02_IRQ_NR(KN02_CSR_INR_DZ11), | ||
319 | [DEC_IRQ_ASC] = KN02_IRQ_NR(KN02_CSR_INR_ASC), | ||
320 | [DEC_IRQ_FLOPPY] = -1, | ||
321 | [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU), | ||
322 | [DEC_IRQ_HALT] = -1, | ||
323 | [DEC_IRQ_ISDN] = -1, | ||
324 | [DEC_IRQ_LANCE] = KN02_IRQ_NR(KN02_CSR_INR_LANCE), | ||
325 | [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN02_CPU_INR_BUS), | ||
326 | [DEC_IRQ_PSU] = -1, | ||
327 | [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN02_CPU_INR_RTC), | ||
328 | [DEC_IRQ_SCC0] = -1, | ||
329 | [DEC_IRQ_SCC1] = -1, | ||
330 | [DEC_IRQ_SII] = -1, | ||
331 | [DEC_IRQ_TC0] = KN02_IRQ_NR(KN02_CSR_INR_TC0), | ||
332 | [DEC_IRQ_TC1] = KN02_IRQ_NR(KN02_CSR_INR_TC1), | ||
333 | [DEC_IRQ_TC2] = KN02_IRQ_NR(KN02_CSR_INR_TC2), | ||
334 | [DEC_IRQ_TIMER] = -1, | ||
335 | [DEC_IRQ_VIDEO] = -1, | ||
336 | [DEC_IRQ_ASC_MERR] = -1, | ||
337 | [DEC_IRQ_ASC_ERR] = -1, | ||
338 | [DEC_IRQ_ASC_DMA] = -1, | ||
339 | [DEC_IRQ_FLOPPY_ERR] = -1, | ||
340 | [DEC_IRQ_ISDN_ERR] = -1, | ||
341 | [DEC_IRQ_ISDN_RXDMA] = -1, | ||
342 | [DEC_IRQ_ISDN_TXDMA] = -1, | ||
343 | [DEC_IRQ_LANCE_MERR] = -1, | ||
344 | [DEC_IRQ_SCC0A_RXERR] = -1, | ||
345 | [DEC_IRQ_SCC0A_RXDMA] = -1, | ||
346 | [DEC_IRQ_SCC0A_TXERR] = -1, | ||
347 | [DEC_IRQ_SCC0A_TXDMA] = -1, | ||
348 | [DEC_IRQ_AB_RXERR] = -1, | ||
349 | [DEC_IRQ_AB_RXDMA] = -1, | ||
350 | [DEC_IRQ_AB_TXERR] = -1, | ||
351 | [DEC_IRQ_AB_TXDMA] = -1, | ||
352 | [DEC_IRQ_SCC1A_RXERR] = -1, | ||
353 | [DEC_IRQ_SCC1A_RXDMA] = -1, | ||
354 | [DEC_IRQ_SCC1A_TXERR] = -1, | ||
355 | [DEC_IRQ_SCC1A_TXDMA] = -1, | ||
356 | }; | ||
357 | |||
358 | static int_ptr kn02_cpu_mask_nr_tbl[][2] __initdata = { | ||
359 | { { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_BUS) }, | ||
360 | { .i = DEC_CPU_IRQ_NR(KN02_CPU_INR_BUS) } }, | ||
361 | { { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_RTC) }, | ||
362 | { .i = DEC_CPU_IRQ_NR(KN02_CPU_INR_RTC) } }, | ||
363 | { { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_CASCADE) }, | ||
364 | { .p = kn02_io_int } }, | ||
365 | { { .i = DEC_CPU_IRQ_ALL }, | ||
366 | { .p = cpu_all_int } }, | ||
367 | }; | ||
368 | |||
369 | static int_ptr kn02_asic_mask_nr_tbl[][2] __initdata = { | ||
370 | { { .i = KN02_IRQ_MASK(KN02_CSR_INR_DZ11) }, | ||
371 | { .i = KN02_IRQ_NR(KN02_CSR_INR_DZ11) } }, | ||
372 | { { .i = KN02_IRQ_MASK(KN02_CSR_INR_ASC) }, | ||
373 | { .i = KN02_IRQ_NR(KN02_CSR_INR_ASC) } }, | ||
374 | { { .i = KN02_IRQ_MASK(KN02_CSR_INR_LANCE) }, | ||
375 | { .i = KN02_IRQ_NR(KN02_CSR_INR_LANCE) } }, | ||
376 | { { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC2) }, | ||
377 | { .i = KN02_IRQ_NR(KN02_CSR_INR_TC2) } }, | ||
378 | { { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC1) }, | ||
379 | { .i = KN02_IRQ_NR(KN02_CSR_INR_TC1) } }, | ||
380 | { { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC0) }, | ||
381 | { .i = KN02_IRQ_NR(KN02_CSR_INR_TC0) } }, | ||
382 | { { .i = KN02_IRQ_ALL }, | ||
383 | { .p = kn02_all_int } }, | ||
384 | }; | ||
385 | |||
386 | static void __init dec_init_kn02(void) | ||
387 | { | ||
388 | /* IRQ routing. */ | ||
389 | memcpy(&dec_interrupt, &kn02_interrupt, | ||
390 | sizeof(kn02_interrupt)); | ||
391 | |||
392 | /* CPU IRQ priorities. */ | ||
393 | memcpy(&cpu_mask_nr_tbl, &kn02_cpu_mask_nr_tbl, | ||
394 | sizeof(kn02_cpu_mask_nr_tbl)); | ||
395 | |||
396 | /* KN02 CSR IRQ priorities. */ | ||
397 | memcpy(&asic_mask_nr_tbl, &kn02_asic_mask_nr_tbl, | ||
398 | sizeof(kn02_asic_mask_nr_tbl)); | ||
399 | |||
400 | mips_cpu_irq_init(); | ||
401 | init_kn02_irqs(KN02_IRQ_BASE); | ||
402 | |||
403 | } /* dec_init_kn02 */ | ||
404 | |||
405 | |||
406 | /* | ||
407 | * Machine-specific initialisation for KN02-BA, aka DS5000/1xx | ||
408 | * (xx = 20, 25, 33), aka 3min. Also applies to KN04(-BA), aka | ||
409 | * DS5000/150, aka 4min. | ||
410 | */ | ||
411 | static int kn02ba_interrupt[DEC_NR_INTS] __initdata = { | ||
412 | [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_CASCADE), | ||
413 | [DEC_IRQ_AB_RECV] = -1, | ||
414 | [DEC_IRQ_AB_XMIT] = -1, | ||
415 | [DEC_IRQ_DZ11] = -1, | ||
416 | [DEC_IRQ_ASC] = IO_IRQ_NR(KN02BA_IO_INR_ASC), | ||
417 | [DEC_IRQ_FLOPPY] = -1, | ||
418 | [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU), | ||
419 | [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_HALT), | ||
420 | [DEC_IRQ_ISDN] = -1, | ||
421 | [DEC_IRQ_LANCE] = IO_IRQ_NR(KN02BA_IO_INR_LANCE), | ||
422 | [DEC_IRQ_BUS] = IO_IRQ_NR(KN02BA_IO_INR_BUS), | ||
423 | [DEC_IRQ_PSU] = IO_IRQ_NR(KN02BA_IO_INR_PSU), | ||
424 | [DEC_IRQ_RTC] = IO_IRQ_NR(KN02BA_IO_INR_RTC), | ||
425 | [DEC_IRQ_SCC0] = IO_IRQ_NR(KN02BA_IO_INR_SCC0), | ||
426 | [DEC_IRQ_SCC1] = IO_IRQ_NR(KN02BA_IO_INR_SCC1), | ||
427 | [DEC_IRQ_SII] = -1, | ||
428 | [DEC_IRQ_TC0] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC0), | ||
429 | [DEC_IRQ_TC1] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC1), | ||
430 | [DEC_IRQ_TC2] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC2), | ||
431 | [DEC_IRQ_TIMER] = -1, | ||
432 | [DEC_IRQ_VIDEO] = -1, | ||
433 | [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR), | ||
434 | [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR), | ||
435 | [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA), | ||
436 | [DEC_IRQ_FLOPPY_ERR] = -1, | ||
437 | [DEC_IRQ_ISDN_ERR] = -1, | ||
438 | [DEC_IRQ_ISDN_RXDMA] = -1, | ||
439 | [DEC_IRQ_ISDN_TXDMA] = -1, | ||
440 | [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR), | ||
441 | [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR), | ||
442 | [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA), | ||
443 | [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR), | ||
444 | [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA), | ||
445 | [DEC_IRQ_AB_RXERR] = -1, | ||
446 | [DEC_IRQ_AB_RXDMA] = -1, | ||
447 | [DEC_IRQ_AB_TXERR] = -1, | ||
448 | [DEC_IRQ_AB_TXDMA] = -1, | ||
449 | [DEC_IRQ_SCC1A_RXERR] = IO_IRQ_NR(IO_INR_SCC1A_RXERR), | ||
450 | [DEC_IRQ_SCC1A_RXDMA] = IO_IRQ_NR(IO_INR_SCC1A_RXDMA), | ||
451 | [DEC_IRQ_SCC1A_TXERR] = IO_IRQ_NR(IO_INR_SCC1A_TXERR), | ||
452 | [DEC_IRQ_SCC1A_TXDMA] = IO_IRQ_NR(IO_INR_SCC1A_TXDMA), | ||
453 | }; | ||
454 | |||
455 | static int_ptr kn02ba_cpu_mask_nr_tbl[][2] __initdata = { | ||
456 | { { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_CASCADE) }, | ||
457 | { .p = kn02xa_io_int } }, | ||
458 | { { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC2) }, | ||
459 | { .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC2) } }, | ||
460 | { { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC1) }, | ||
461 | { .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC1) } }, | ||
462 | { { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC0) }, | ||
463 | { .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC0) } }, | ||
464 | { { .i = DEC_CPU_IRQ_ALL }, | ||
465 | { .p = cpu_all_int } }, | ||
466 | }; | ||
467 | |||
468 | static int_ptr kn02ba_asic_mask_nr_tbl[][2] __initdata = { | ||
469 | { { .i = IO_IRQ_MASK(KN02BA_IO_INR_BUS) }, | ||
470 | { .i = IO_IRQ_NR(KN02BA_IO_INR_BUS) } }, | ||
471 | { { .i = IO_IRQ_MASK(KN02BA_IO_INR_RTC) }, | ||
472 | { .i = IO_IRQ_NR(KN02BA_IO_INR_RTC) } }, | ||
473 | { { .i = IO_IRQ_DMA }, | ||
474 | { .p = asic_dma_int } }, | ||
475 | { { .i = IO_IRQ_MASK(KN02BA_IO_INR_SCC0) }, | ||
476 | { .i = IO_IRQ_NR(KN02BA_IO_INR_SCC0) } }, | ||
477 | { { .i = IO_IRQ_MASK(KN02BA_IO_INR_SCC1) }, | ||
478 | { .i = IO_IRQ_NR(KN02BA_IO_INR_SCC1) } }, | ||
479 | { { .i = IO_IRQ_MASK(KN02BA_IO_INR_ASC) }, | ||
480 | { .i = IO_IRQ_NR(KN02BA_IO_INR_ASC) } }, | ||
481 | { { .i = IO_IRQ_MASK(KN02BA_IO_INR_LANCE) }, | ||
482 | { .i = IO_IRQ_NR(KN02BA_IO_INR_LANCE) } }, | ||
483 | { { .i = IO_IRQ_ALL }, | ||
484 | { .p = asic_all_int } }, | ||
485 | }; | ||
486 | |||
487 | static void __init dec_init_kn02ba(void) | ||
488 | { | ||
489 | /* IRQ routing. */ | ||
490 | memcpy(&dec_interrupt, &kn02ba_interrupt, | ||
491 | sizeof(kn02ba_interrupt)); | ||
492 | |||
493 | /* CPU IRQ priorities. */ | ||
494 | memcpy(&cpu_mask_nr_tbl, &kn02ba_cpu_mask_nr_tbl, | ||
495 | sizeof(kn02ba_cpu_mask_nr_tbl)); | ||
496 | |||
497 | /* I/O ASIC IRQ priorities. */ | ||
498 | memcpy(&asic_mask_nr_tbl, &kn02ba_asic_mask_nr_tbl, | ||
499 | sizeof(kn02ba_asic_mask_nr_tbl)); | ||
500 | |||
501 | mips_cpu_irq_init(); | ||
502 | init_ioasic_irqs(IO_IRQ_BASE); | ||
503 | |||
504 | } /* dec_init_kn02ba */ | ||
505 | |||
506 | |||
507 | /* | ||
508 | * Machine-specific initialisation for KN02-CA, aka DS5000/xx, | ||
509 | * (xx = 20, 25, 33), aka MAXine. Also applies to KN04(-CA), aka | ||
510 | * DS5000/50, aka 4MAXine. | ||
511 | */ | ||
512 | static int kn02ca_interrupt[DEC_NR_INTS] __initdata = { | ||
513 | [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_CASCADE), | ||
514 | [DEC_IRQ_AB_RECV] = IO_IRQ_NR(KN02CA_IO_INR_AB_RECV), | ||
515 | [DEC_IRQ_AB_XMIT] = IO_IRQ_NR(KN02CA_IO_INR_AB_XMIT), | ||
516 | [DEC_IRQ_DZ11] = -1, | ||
517 | [DEC_IRQ_ASC] = IO_IRQ_NR(KN02CA_IO_INR_ASC), | ||
518 | [DEC_IRQ_FLOPPY] = IO_IRQ_NR(KN02CA_IO_INR_FLOPPY), | ||
519 | [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU), | ||
520 | [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_HALT), | ||
521 | [DEC_IRQ_ISDN] = IO_IRQ_NR(KN02CA_IO_INR_ISDN), | ||
522 | [DEC_IRQ_LANCE] = IO_IRQ_NR(KN02CA_IO_INR_LANCE), | ||
523 | [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_BUS), | ||
524 | [DEC_IRQ_PSU] = -1, | ||
525 | [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_RTC), | ||
526 | [DEC_IRQ_SCC0] = IO_IRQ_NR(KN02CA_IO_INR_SCC0), | ||
527 | [DEC_IRQ_SCC1] = -1, | ||
528 | [DEC_IRQ_SII] = -1, | ||
529 | [DEC_IRQ_TC0] = IO_IRQ_NR(KN02CA_IO_INR_TC0), | ||
530 | [DEC_IRQ_TC1] = IO_IRQ_NR(KN02CA_IO_INR_TC1), | ||
531 | [DEC_IRQ_TC2] = -1, | ||
532 | [DEC_IRQ_TIMER] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_TIMER), | ||
533 | [DEC_IRQ_VIDEO] = IO_IRQ_NR(KN02CA_IO_INR_VIDEO), | ||
534 | [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR), | ||
535 | [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR), | ||
536 | [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA), | ||
537 | [DEC_IRQ_FLOPPY_ERR] = IO_IRQ_NR(IO_INR_FLOPPY_ERR), | ||
538 | [DEC_IRQ_ISDN_ERR] = IO_IRQ_NR(IO_INR_ISDN_ERR), | ||
539 | [DEC_IRQ_ISDN_RXDMA] = IO_IRQ_NR(IO_INR_ISDN_RXDMA), | ||
540 | [DEC_IRQ_ISDN_TXDMA] = IO_IRQ_NR(IO_INR_ISDN_TXDMA), | ||
541 | [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR), | ||
542 | [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR), | ||
543 | [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA), | ||
544 | [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR), | ||
545 | [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA), | ||
546 | [DEC_IRQ_AB_RXERR] = IO_IRQ_NR(IO_INR_AB_RXERR), | ||
547 | [DEC_IRQ_AB_RXDMA] = IO_IRQ_NR(IO_INR_AB_RXDMA), | ||
548 | [DEC_IRQ_AB_TXERR] = IO_IRQ_NR(IO_INR_AB_TXERR), | ||
549 | [DEC_IRQ_AB_TXDMA] = IO_IRQ_NR(IO_INR_AB_TXDMA), | ||
550 | [DEC_IRQ_SCC1A_RXERR] = -1, | ||
551 | [DEC_IRQ_SCC1A_RXDMA] = -1, | ||
552 | [DEC_IRQ_SCC1A_TXERR] = -1, | ||
553 | [DEC_IRQ_SCC1A_TXDMA] = -1, | ||
554 | }; | ||
555 | |||
556 | static int_ptr kn02ca_cpu_mask_nr_tbl[][2] __initdata = { | ||
557 | { { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_BUS) }, | ||
558 | { .i = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_BUS) } }, | ||
559 | { { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_RTC) }, | ||
560 | { .i = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_RTC) } }, | ||
561 | { { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_CASCADE) }, | ||
562 | { .p = kn02xa_io_int } }, | ||
563 | { { .i = DEC_CPU_IRQ_ALL }, | ||
564 | { .p = cpu_all_int } }, | ||
565 | }; | ||
566 | |||
567 | static int_ptr kn02ca_asic_mask_nr_tbl[][2] __initdata = { | ||
568 | { { .i = IO_IRQ_DMA }, | ||
569 | { .p = asic_dma_int } }, | ||
570 | { { .i = IO_IRQ_MASK(KN02CA_IO_INR_SCC0) }, | ||
571 | { .i = IO_IRQ_NR(KN02CA_IO_INR_SCC0) } }, | ||
572 | { { .i = IO_IRQ_MASK(KN02CA_IO_INR_ASC) }, | ||
573 | { .i = IO_IRQ_NR(KN02CA_IO_INR_ASC) } }, | ||
574 | { { .i = IO_IRQ_MASK(KN02CA_IO_INR_LANCE) }, | ||
575 | { .i = IO_IRQ_NR(KN02CA_IO_INR_LANCE) } }, | ||
576 | { { .i = IO_IRQ_MASK(KN02CA_IO_INR_TC1) }, | ||
577 | { .i = IO_IRQ_NR(KN02CA_IO_INR_TC1) } }, | ||
578 | { { .i = IO_IRQ_MASK(KN02CA_IO_INR_TC0) }, | ||
579 | { .i = IO_IRQ_NR(KN02CA_IO_INR_TC0) } }, | ||
580 | { { .i = IO_IRQ_ALL }, | ||
581 | { .p = asic_all_int } }, | ||
582 | }; | ||
583 | |||
584 | static void __init dec_init_kn02ca(void) | ||
585 | { | ||
586 | /* IRQ routing. */ | ||
587 | memcpy(&dec_interrupt, &kn02ca_interrupt, | ||
588 | sizeof(kn02ca_interrupt)); | ||
589 | |||
590 | /* CPU IRQ priorities. */ | ||
591 | memcpy(&cpu_mask_nr_tbl, &kn02ca_cpu_mask_nr_tbl, | ||
592 | sizeof(kn02ca_cpu_mask_nr_tbl)); | ||
593 | |||
594 | /* I/O ASIC IRQ priorities. */ | ||
595 | memcpy(&asic_mask_nr_tbl, &kn02ca_asic_mask_nr_tbl, | ||
596 | sizeof(kn02ca_asic_mask_nr_tbl)); | ||
597 | |||
598 | mips_cpu_irq_init(); | ||
599 | init_ioasic_irqs(IO_IRQ_BASE); | ||
600 | |||
601 | } /* dec_init_kn02ca */ | ||
602 | |||
603 | |||
604 | /* | ||
605 | * Machine-specific initialisation for KN03, aka DS5000/240, | ||
606 | * aka 3max+ and DS5900, aka BIGmax. Also applies to KN05, aka | ||
607 | * DS5000/260, aka 4max+ and DS5900/260. | ||
608 | */ | ||
609 | static int kn03_interrupt[DEC_NR_INTS] __initdata = { | ||
610 | [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN03_CPU_INR_CASCADE), | ||
611 | [DEC_IRQ_AB_RECV] = -1, | ||
612 | [DEC_IRQ_AB_XMIT] = -1, | ||
613 | [DEC_IRQ_DZ11] = -1, | ||
614 | [DEC_IRQ_ASC] = IO_IRQ_NR(KN03_IO_INR_ASC), | ||
615 | [DEC_IRQ_FLOPPY] = -1, | ||
616 | [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU), | ||
617 | [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN03_CPU_INR_HALT), | ||
618 | [DEC_IRQ_ISDN] = -1, | ||
619 | [DEC_IRQ_LANCE] = IO_IRQ_NR(KN03_IO_INR_LANCE), | ||
620 | [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN03_CPU_INR_BUS), | ||
621 | [DEC_IRQ_PSU] = IO_IRQ_NR(KN03_IO_INR_PSU), | ||
622 | [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN03_CPU_INR_RTC), | ||
623 | [DEC_IRQ_SCC0] = IO_IRQ_NR(KN03_IO_INR_SCC0), | ||
624 | [DEC_IRQ_SCC1] = IO_IRQ_NR(KN03_IO_INR_SCC1), | ||
625 | [DEC_IRQ_SII] = -1, | ||
626 | [DEC_IRQ_TC0] = IO_IRQ_NR(KN03_IO_INR_TC0), | ||
627 | [DEC_IRQ_TC1] = IO_IRQ_NR(KN03_IO_INR_TC1), | ||
628 | [DEC_IRQ_TC2] = IO_IRQ_NR(KN03_IO_INR_TC2), | ||
629 | [DEC_IRQ_TIMER] = -1, | ||
630 | [DEC_IRQ_VIDEO] = -1, | ||
631 | [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR), | ||
632 | [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR), | ||
633 | [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA), | ||
634 | [DEC_IRQ_FLOPPY_ERR] = -1, | ||
635 | [DEC_IRQ_ISDN_ERR] = -1, | ||
636 | [DEC_IRQ_ISDN_RXDMA] = -1, | ||
637 | [DEC_IRQ_ISDN_TXDMA] = -1, | ||
638 | [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR), | ||
639 | [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR), | ||
640 | [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA), | ||
641 | [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR), | ||
642 | [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA), | ||
643 | [DEC_IRQ_AB_RXERR] = -1, | ||
644 | [DEC_IRQ_AB_RXDMA] = -1, | ||
645 | [DEC_IRQ_AB_TXERR] = -1, | ||
646 | [DEC_IRQ_AB_TXDMA] = -1, | ||
647 | [DEC_IRQ_SCC1A_RXERR] = IO_IRQ_NR(IO_INR_SCC1A_RXERR), | ||
648 | [DEC_IRQ_SCC1A_RXDMA] = IO_IRQ_NR(IO_INR_SCC1A_RXDMA), | ||
649 | [DEC_IRQ_SCC1A_TXERR] = IO_IRQ_NR(IO_INR_SCC1A_TXERR), | ||
650 | [DEC_IRQ_SCC1A_TXDMA] = IO_IRQ_NR(IO_INR_SCC1A_TXDMA), | ||
651 | }; | ||
652 | |||
653 | static int_ptr kn03_cpu_mask_nr_tbl[][2] __initdata = { | ||
654 | { { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_BUS) }, | ||
655 | { .i = DEC_CPU_IRQ_NR(KN03_CPU_INR_BUS) } }, | ||
656 | { { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_RTC) }, | ||
657 | { .i = DEC_CPU_IRQ_NR(KN03_CPU_INR_RTC) } }, | ||
658 | { { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_CASCADE) }, | ||
659 | { .p = kn03_io_int } }, | ||
660 | { { .i = DEC_CPU_IRQ_ALL }, | ||
661 | { .p = cpu_all_int } }, | ||
662 | }; | ||
663 | |||
664 | static int_ptr kn03_asic_mask_nr_tbl[][2] __initdata = { | ||
665 | { { .i = IO_IRQ_DMA }, | ||
666 | { .p = asic_dma_int } }, | ||
667 | { { .i = IO_IRQ_MASK(KN03_IO_INR_SCC0) }, | ||
668 | { .i = IO_IRQ_NR(KN03_IO_INR_SCC0) } }, | ||
669 | { { .i = IO_IRQ_MASK(KN03_IO_INR_SCC1) }, | ||
670 | { .i = IO_IRQ_NR(KN03_IO_INR_SCC1) } }, | ||
671 | { { .i = IO_IRQ_MASK(KN03_IO_INR_ASC) }, | ||
672 | { .i = IO_IRQ_NR(KN03_IO_INR_ASC) } }, | ||
673 | { { .i = IO_IRQ_MASK(KN03_IO_INR_LANCE) }, | ||
674 | { .i = IO_IRQ_NR(KN03_IO_INR_LANCE) } }, | ||
675 | { { .i = IO_IRQ_MASK(KN03_IO_INR_TC2) }, | ||
676 | { .i = IO_IRQ_NR(KN03_IO_INR_TC2) } }, | ||
677 | { { .i = IO_IRQ_MASK(KN03_IO_INR_TC1) }, | ||
678 | { .i = IO_IRQ_NR(KN03_IO_INR_TC1) } }, | ||
679 | { { .i = IO_IRQ_MASK(KN03_IO_INR_TC0) }, | ||
680 | { .i = IO_IRQ_NR(KN03_IO_INR_TC0) } }, | ||
681 | { { .i = IO_IRQ_ALL }, | ||
682 | { .p = asic_all_int } }, | ||
683 | }; | ||
684 | |||
685 | static void __init dec_init_kn03(void) | ||
686 | { | ||
687 | /* IRQ routing. */ | ||
688 | memcpy(&dec_interrupt, &kn03_interrupt, | ||
689 | sizeof(kn03_interrupt)); | ||
690 | |||
691 | /* CPU IRQ priorities. */ | ||
692 | memcpy(&cpu_mask_nr_tbl, &kn03_cpu_mask_nr_tbl, | ||
693 | sizeof(kn03_cpu_mask_nr_tbl)); | ||
694 | |||
695 | /* I/O ASIC IRQ priorities. */ | ||
696 | memcpy(&asic_mask_nr_tbl, &kn03_asic_mask_nr_tbl, | ||
697 | sizeof(kn03_asic_mask_nr_tbl)); | ||
698 | |||
699 | mips_cpu_irq_init(); | ||
700 | init_ioasic_irqs(IO_IRQ_BASE); | ||
701 | |||
702 | } /* dec_init_kn03 */ | ||
703 | |||
704 | |||
705 | void __init arch_init_irq(void) | ||
706 | { | ||
707 | switch (mips_machtype) { | ||
708 | case MACH_DS23100: /* DS2100/DS3100 Pmin/Pmax */ | ||
709 | dec_init_kn01(); | ||
710 | break; | ||
711 | case MACH_DS5100: /* DS5100 MIPSmate */ | ||
712 | dec_init_kn230(); | ||
713 | break; | ||
714 | case MACH_DS5000_200: /* DS5000/200 3max */ | ||
715 | dec_init_kn02(); | ||
716 | break; | ||
717 | case MACH_DS5000_1XX: /* DS5000/1xx 3min */ | ||
718 | dec_init_kn02ba(); | ||
719 | break; | ||
720 | case MACH_DS5000_2X0: /* DS5000/240 3max+ */ | ||
721 | case MACH_DS5900: /* DS5900 bigmax */ | ||
722 | dec_init_kn03(); | ||
723 | break; | ||
724 | case MACH_DS5000_XX: /* Personal DS5000/xx */ | ||
725 | dec_init_kn02ca(); | ||
726 | break; | ||
727 | case MACH_DS5800: /* DS5800 Isis */ | ||
728 | panic("Don't know how to set this up!"); | ||
729 | break; | ||
730 | case MACH_DS5400: /* DS5400 MIPSfair */ | ||
731 | panic("Don't know how to set this up!"); | ||
732 | break; | ||
733 | case MACH_DS5500: /* DS5500 MIPSfair-2 */ | ||
734 | panic("Don't know how to set this up!"); | ||
735 | break; | ||
736 | } | ||
737 | |||
738 | /* Free the FPU interrupt if the exception is present. */ | ||
739 | if (!cpu_has_nofpuex) { | ||
740 | cpu_fpu_mask = 0; | ||
741 | dec_interrupt[DEC_IRQ_FPU] = -1; | ||
742 | } | ||
743 | /* Free the halt interrupt unused on R4k systems. */ | ||
744 | if (current_cpu_type() == CPU_R4000SC || | ||
745 | current_cpu_type() == CPU_R4400SC) | ||
746 | dec_interrupt[DEC_IRQ_HALT] = -1; | ||
747 | |||
748 | /* Register board interrupts: FPU and cascade. */ | ||
749 | if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT) && | ||
750 | dec_interrupt[DEC_IRQ_FPU] >= 0 && cpu_has_fpu) { | ||
751 | struct irq_desc *desc_fpu; | ||
752 | int irq_fpu; | ||
753 | |||
754 | irq_fpu = dec_interrupt[DEC_IRQ_FPU]; | ||
755 | if (request_irq(irq_fpu, no_action, IRQF_NO_THREAD, "fpu", | ||
756 | NULL)) | ||
757 | pr_err("Failed to register fpu interrupt\n"); | ||
758 | desc_fpu = irq_to_desc(irq_fpu); | ||
759 | fpu_kstat_irq = this_cpu_ptr(desc_fpu->kstat_irqs); | ||
760 | } | ||
761 | if (dec_interrupt[DEC_IRQ_CASCADE] >= 0) { | ||
762 | if (request_irq(dec_interrupt[DEC_IRQ_CASCADE], no_action, | ||
763 | IRQF_NO_THREAD, "cascade", NULL)) | ||
764 | pr_err("Failed to register cascade interrupt\n"); | ||
765 | } | ||
766 | /* Register the bus error interrupt. */ | ||
767 | if (dec_interrupt[DEC_IRQ_BUS] >= 0 && busirq_handler) { | ||
768 | if (request_irq(dec_interrupt[DEC_IRQ_BUS], busirq_handler, | ||
769 | busirq_flags, "bus error", busirq_handler)) | ||
770 | pr_err("Failed to register bus error interrupt\n"); | ||
771 | } | ||
772 | /* Register the HALT interrupt. */ | ||
773 | if (dec_interrupt[DEC_IRQ_HALT] >= 0) { | ||
774 | if (request_irq(dec_interrupt[DEC_IRQ_HALT], dec_intr_halt, | ||
775 | IRQF_NO_THREAD, "halt", NULL)) | ||
776 | pr_err("Failed to register halt interrupt\n"); | ||
777 | } | ||
778 | } | ||
779 | |||
780 | asmlinkage unsigned int dec_irq_dispatch(unsigned int irq) | ||
781 | { | ||
782 | do_IRQ(irq); | ||
783 | return 0; | ||
784 | } | ||