xref: /openbmc/linux/arch/mips/dec/setup.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
11da177e4SLinus Torvalds /*
2902d21d5SMaciej W. Rozycki  * System-specific setup, especially interrupts.
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * This file is subject to the terms and conditions of the GNU General Public
51da177e4SLinus Torvalds  * License.  See the file "COPYING" in the main directory of this archive
61da177e4SLinus Torvalds  * for more details.
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  * Copyright (C) 1998 Harald Koerfgen
9cf3af0a4SMaciej W. Rozycki  * Copyright (C) 2000, 2001, 2002, 2003, 2005, 2020  Maciej W. Rozycki
101da177e4SLinus Torvalds  */
111da177e4SLinus Torvalds #include <linux/console.h>
1226dd3e4fSPaul Gortmaker #include <linux/export.h>
131da177e4SLinus Torvalds #include <linux/init.h>
14902d21d5SMaciej W. Rozycki #include <linux/interrupt.h>
15902d21d5SMaciej W. Rozycki #include <linux/ioport.h>
16f02cf469SMaciej W. Rozycki #include <linux/irq.h>
17f02cf469SMaciej W. Rozycki #include <linux/irqnr.h>
18cf3af0a4SMaciej W. Rozycki #include <linux/memblock.h>
19902d21d5SMaciej W. Rozycki #include <linux/param.h>
20f02cf469SMaciej W. Rozycki #include <linux/percpu-defs.h>
21902d21d5SMaciej W. Rozycki #include <linux/sched.h>
221da177e4SLinus Torvalds #include <linux/spinlock.h>
231da177e4SLinus Torvalds #include <linux/types.h>
24fcdb27adSRalf Baechle #include <linux/pm.h>
251da177e4SLinus Torvalds 
26cf3af0a4SMaciej W. Rozycki #include <asm/addrspace.h>
271da177e4SLinus Torvalds #include <asm/bootinfo.h>
281da177e4SLinus Torvalds #include <asm/cpu.h>
291da177e4SLinus Torvalds #include <asm/cpu-features.h>
3076ad023bSMaciej W. Rozycki #include <asm/cpu-type.h>
311da177e4SLinus Torvalds #include <asm/irq.h>
321da177e4SLinus Torvalds #include <asm/irq_cpu.h>
331da177e4SLinus Torvalds #include <asm/mipsregs.h>
34cf3af0a4SMaciej W. Rozycki #include <asm/page.h>
351da177e4SLinus Torvalds #include <asm/reboot.h>
36cf3af0a4SMaciej W. Rozycki #include <asm/sections.h>
371da177e4SLinus Torvalds #include <asm/time.h>
381da177e4SLinus Torvalds #include <asm/traps.h>
391da177e4SLinus Torvalds #include <asm/wbflush.h>
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds #include <asm/dec/interrupts.h>
421da177e4SLinus Torvalds #include <asm/dec/ioasic.h>
431da177e4SLinus Torvalds #include <asm/dec/ioasic_addrs.h>
441da177e4SLinus Torvalds #include <asm/dec/ioasic_ints.h>
451da177e4SLinus Torvalds #include <asm/dec/kn01.h>
461da177e4SLinus Torvalds #include <asm/dec/kn02.h>
471da177e4SLinus Torvalds #include <asm/dec/kn02ba.h>
481da177e4SLinus Torvalds #include <asm/dec/kn02ca.h>
491da177e4SLinus Torvalds #include <asm/dec/kn03.h>
501da177e4SLinus Torvalds #include <asm/dec/kn230.h>
51a5fc9c0bSMaciej W. Rozycki #include <asm/dec/system.h>
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds extern void dec_machine_restart(char *command);
551da177e4SLinus Torvalds extern void dec_machine_halt(void);
561da177e4SLinus Torvalds extern void dec_machine_power_off(void);
57d62801e9SRalf Baechle extern irqreturn_t dec_intr_halt(int irq, void *dev_id);
581da177e4SLinus Torvalds 
59a5fc9c0bSMaciej W. Rozycki unsigned long dec_kn_slot_base, dec_kn_slot_size;
60a5fc9c0bSMaciej W. Rozycki 
61a5fc9c0bSMaciej W. Rozycki EXPORT_SYMBOL(dec_kn_slot_base);
62a5fc9c0bSMaciej W. Rozycki EXPORT_SYMBOL(dec_kn_slot_size);
63a5fc9c0bSMaciej W. Rozycki 
6433cf45b9SMaciej W. Rozycki int dec_tc_bus;
6533cf45b9SMaciej W. Rozycki 
6668835999SMaciej W. Rozycki DEFINE_SPINLOCK(ioasic_ssr_lock);
67e48b4dacSMaciej W. Rozycki EXPORT_SYMBOL(ioasic_ssr_lock);
681da177e4SLinus Torvalds 
691da177e4SLinus Torvalds volatile u32 *ioasic_base;
70a5fc9c0bSMaciej W. Rozycki 
71a5fc9c0bSMaciej W. Rozycki EXPORT_SYMBOL(ioasic_base);
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds /*
74*94bd83e4SJulia Lawall  * IRQ routing and priority tables.  Priorities are set as follows:
751da177e4SLinus Torvalds  *
761da177e4SLinus Torvalds  *		KN01	KN230	KN02	KN02-BA	KN02-CA	KN03
771da177e4SLinus Torvalds  *
781da177e4SLinus Torvalds  * MEMORY	CPU	CPU	CPU	ASIC	CPU	CPU
791da177e4SLinus Torvalds  * RTC		CPU	CPU	CPU	ASIC	CPU	CPU
801da177e4SLinus Torvalds  * DMA		-	-	-	ASIC	ASIC	ASIC
811da177e4SLinus Torvalds  * SERIAL0	CPU	CPU	CSR	ASIC	ASIC	ASIC
821da177e4SLinus Torvalds  * SERIAL1	-	-	-	ASIC	-	ASIC
831da177e4SLinus Torvalds  * SCSI		CPU	CPU	CSR	ASIC	ASIC	ASIC
841da177e4SLinus Torvalds  * ETHERNET	CPU	*	CSR	ASIC	ASIC	ASIC
851da177e4SLinus Torvalds  * other	-	-	-	ASIC	-	-
861da177e4SLinus Torvalds  * TC2		-	-	CSR	CPU	ASIC	ASIC
871da177e4SLinus Torvalds  * TC1		-	-	CSR	CPU	ASIC	ASIC
881da177e4SLinus Torvalds  * TC0		-	-	CSR	CPU	ASIC	ASIC
891da177e4SLinus Torvalds  * other	-	CPU	-	CPU	ASIC	ASIC
901da177e4SLinus Torvalds  * other	-	-	-	-	CPU	CPU
911da177e4SLinus Torvalds  *
921da177e4SLinus Torvalds  * * -- shared with SCSI
931da177e4SLinus Torvalds  */
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds int dec_interrupt[DEC_NR_INTS] = {
961da177e4SLinus Torvalds 	[0 ... DEC_NR_INTS - 1] = -1
971da177e4SLinus Torvalds };
98a5fc9c0bSMaciej W. Rozycki 
99a5fc9c0bSMaciej W. Rozycki EXPORT_SYMBOL(dec_interrupt);
100a5fc9c0bSMaciej W. Rozycki 
1011da177e4SLinus Torvalds int_ptr cpu_mask_nr_tbl[DEC_MAX_CPU_INTS][2] = {
1021da177e4SLinus Torvalds 	{ { .i = ~0 }, { .p = dec_intr_unimplemented } },
1031da177e4SLinus Torvalds };
1041da177e4SLinus Torvalds int_ptr asic_mask_nr_tbl[DEC_MAX_ASIC_INTS][2] = {
1051da177e4SLinus Torvalds 	{ { .i = ~0 }, { .p = asic_intr_unimplemented } },
1061da177e4SLinus Torvalds };
1071da177e4SLinus Torvalds int cpu_fpu_mask = DEC_CPU_IRQ_MASK(DEC_CPU_INR_FPU);
108f02cf469SMaciej W. Rozycki int *fpu_kstat_irq;
1091da177e4SLinus Torvalds 
110ac8fd122Safzal mohammed static irq_handler_t busirq_handler;
111ac8fd122Safzal mohammed static unsigned int busirq_flags = IRQF_NO_THREAD;
1121da177e4SLinus Torvalds 
1131da177e4SLinus Torvalds /*
1141da177e4SLinus Torvalds  * Bus error (DBE/IBE exceptions and bus interrupts) handling setup.
1151da177e4SLinus Torvalds  */
dec_be_init(void)11623bbbaf8SMaciej W. Rozycki static void __init dec_be_init(void)
1171da177e4SLinus Torvalds {
1181da177e4SLinus Torvalds 	switch (mips_machtype) {
1191da177e4SLinus Torvalds 	case MACH_DS23100:	/* DS2100/DS3100 Pmin/Pmax */
1201f761b3eSFlorian Fainelli 		mips_set_be_handler(dec_kn01_be_handler);
121ac8fd122Safzal mohammed 		busirq_handler = dec_kn01_be_interrupt;
122ac8fd122Safzal mohammed 		busirq_flags |= IRQF_SHARED;
12364dac503SMaciej W. Rozycki 		dec_kn01_be_init();
12464dac503SMaciej W. Rozycki 		break;
12564dac503SMaciej W. Rozycki 	case MACH_DS5000_1XX:	/* DS5000/1xx 3min */
12664dac503SMaciej W. Rozycki 	case MACH_DS5000_XX:	/* DS5000/xx Maxine */
1271f761b3eSFlorian Fainelli 		mips_set_be_handler(dec_kn02xa_be_handler);
128ac8fd122Safzal mohammed 		busirq_handler = dec_kn02xa_be_interrupt;
12964dac503SMaciej W. Rozycki 		dec_kn02xa_be_init();
1301da177e4SLinus Torvalds 		break;
1311da177e4SLinus Torvalds 	case MACH_DS5000_200:	/* DS5000/200 3max */
1321da177e4SLinus Torvalds 	case MACH_DS5000_2X0:	/* DS5000/240 3max+ */
1331da177e4SLinus Torvalds 	case MACH_DS5900:	/* DS5900 bigmax */
1341f761b3eSFlorian Fainelli 		mips_set_be_handler(dec_ecc_be_handler);
135ac8fd122Safzal mohammed 		busirq_handler = dec_ecc_be_interrupt;
1361da177e4SLinus Torvalds 		dec_ecc_be_init();
1371da177e4SLinus Torvalds 		break;
1381da177e4SLinus Torvalds 	}
1391da177e4SLinus Torvalds }
1401da177e4SLinus Torvalds 
plat_mem_setup(void)1412925aba4SRalf Baechle void __init plat_mem_setup(void)
1421da177e4SLinus Torvalds {
1431da177e4SLinus Torvalds 	board_be_init = dec_be_init;
1441da177e4SLinus Torvalds 
1451da177e4SLinus Torvalds 	wbflush_setup();
1461da177e4SLinus Torvalds 
1471da177e4SLinus Torvalds 	_machine_restart = dec_machine_restart;
1481da177e4SLinus Torvalds 	_machine_halt = dec_machine_halt;
149fcdb27adSRalf Baechle 	pm_power_off = dec_machine_power_off;
150902d21d5SMaciej W. Rozycki 
151902d21d5SMaciej W. Rozycki 	ioport_resource.start = ~0UL;
152902d21d5SMaciej W. Rozycki 	ioport_resource.end = 0UL;
153cf3af0a4SMaciej W. Rozycki 
154cf3af0a4SMaciej W. Rozycki 	/* Stay away from the firmware working memory area for now. */
155cf3af0a4SMaciej W. Rozycki 	memblock_reserve(PHYS_OFFSET, __pa_symbol(&_text) - PHYS_OFFSET);
1561da177e4SLinus Torvalds }
1571da177e4SLinus Torvalds 
1581da177e4SLinus Torvalds /*
1591da177e4SLinus Torvalds  * Machine-specific initialisation for KN01, aka DS2100 (aka Pmin)
1601da177e4SLinus Torvalds  * or DS3100 (aka Pmax).
1611da177e4SLinus Torvalds  */
1621da177e4SLinus Torvalds static int kn01_interrupt[DEC_NR_INTS] __initdata = {
1631da177e4SLinus Torvalds 	[DEC_IRQ_CASCADE]	= -1,
1641da177e4SLinus Torvalds 	[DEC_IRQ_AB_RECV]	= -1,
1651da177e4SLinus Torvalds 	[DEC_IRQ_AB_XMIT]	= -1,
1661da177e4SLinus Torvalds 	[DEC_IRQ_DZ11]		= DEC_CPU_IRQ_NR(KN01_CPU_INR_DZ11),
1671da177e4SLinus Torvalds 	[DEC_IRQ_ASC]		= -1,
1681da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY]	= -1,
1691da177e4SLinus Torvalds 	[DEC_IRQ_FPU]		= DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
1701da177e4SLinus Torvalds 	[DEC_IRQ_HALT]		= -1,
1711da177e4SLinus Torvalds 	[DEC_IRQ_ISDN]		= -1,
1721da177e4SLinus Torvalds 	[DEC_IRQ_LANCE]		= DEC_CPU_IRQ_NR(KN01_CPU_INR_LANCE),
1731da177e4SLinus Torvalds 	[DEC_IRQ_BUS]		= DEC_CPU_IRQ_NR(KN01_CPU_INR_BUS),
1741da177e4SLinus Torvalds 	[DEC_IRQ_PSU]		= -1,
1751da177e4SLinus Torvalds 	[DEC_IRQ_RTC]		= DEC_CPU_IRQ_NR(KN01_CPU_INR_RTC),
1761da177e4SLinus Torvalds 	[DEC_IRQ_SCC0]		= -1,
1771da177e4SLinus Torvalds 	[DEC_IRQ_SCC1]		= -1,
1781da177e4SLinus Torvalds 	[DEC_IRQ_SII]		= DEC_CPU_IRQ_NR(KN01_CPU_INR_SII),
1791da177e4SLinus Torvalds 	[DEC_IRQ_TC0]		= -1,
1801da177e4SLinus Torvalds 	[DEC_IRQ_TC1]		= -1,
1811da177e4SLinus Torvalds 	[DEC_IRQ_TC2]		= -1,
1821da177e4SLinus Torvalds 	[DEC_IRQ_TIMER]		= -1,
1831da177e4SLinus Torvalds 	[DEC_IRQ_VIDEO]		= DEC_CPU_IRQ_NR(KN01_CPU_INR_VIDEO),
1841da177e4SLinus Torvalds 	[DEC_IRQ_ASC_MERR]	= -1,
1851da177e4SLinus Torvalds 	[DEC_IRQ_ASC_ERR]	= -1,
1861da177e4SLinus Torvalds 	[DEC_IRQ_ASC_DMA]	= -1,
1871da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY_ERR]	= -1,
1881da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_ERR]	= -1,
1891da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_RXDMA]	= -1,
1901da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_TXDMA]	= -1,
1911da177e4SLinus Torvalds 	[DEC_IRQ_LANCE_MERR]	= -1,
1921da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXERR]	= -1,
1931da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXDMA]	= -1,
1941da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXERR]	= -1,
1951da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXDMA]	= -1,
1961da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXERR]	= -1,
1971da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXDMA]	= -1,
1981da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXERR]	= -1,
1991da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXDMA]	= -1,
2001da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXERR]	= -1,
2011da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXDMA]	= -1,
2021da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXERR]	= -1,
2031da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXDMA]	= -1,
2041da177e4SLinus Torvalds };
2051da177e4SLinus Torvalds 
2061da177e4SLinus Torvalds static int_ptr kn01_cpu_mask_nr_tbl[][2] __initdata = {
2071da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_BUS) },
2081da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_BUS) } },
2091da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_RTC) },
2101da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_RTC) } },
2111da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_DZ11) },
2121da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_DZ11) } },
2131da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_SII) },
2141da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_SII) } },
2151da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_LANCE) },
2161da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_LANCE) } },
2171da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_ALL },
2181da177e4SLinus Torvalds 		{ .p = cpu_all_int } },
2191da177e4SLinus Torvalds };
2201da177e4SLinus Torvalds 
dec_init_kn01(void)22123bbbaf8SMaciej W. Rozycki static void __init dec_init_kn01(void)
2221da177e4SLinus Torvalds {
2231da177e4SLinus Torvalds 	/* IRQ routing. */
2241da177e4SLinus Torvalds 	memcpy(&dec_interrupt, &kn01_interrupt,
2251da177e4SLinus Torvalds 		sizeof(kn01_interrupt));
2261da177e4SLinus Torvalds 
2271da177e4SLinus Torvalds 	/* CPU IRQ priorities. */
2281da177e4SLinus Torvalds 	memcpy(&cpu_mask_nr_tbl, &kn01_cpu_mask_nr_tbl,
2291da177e4SLinus Torvalds 		sizeof(kn01_cpu_mask_nr_tbl));
2301da177e4SLinus Torvalds 
23197dcb82dSAtsushi Nemoto 	mips_cpu_irq_init();
2321da177e4SLinus Torvalds 
2331da177e4SLinus Torvalds }				/* dec_init_kn01 */
2341da177e4SLinus Torvalds 
2351da177e4SLinus Torvalds 
2361da177e4SLinus Torvalds /*
2371da177e4SLinus Torvalds  * Machine-specific initialisation for KN230, aka DS5100, aka MIPSmate.
2381da177e4SLinus Torvalds  */
2391da177e4SLinus Torvalds static int kn230_interrupt[DEC_NR_INTS] __initdata = {
2401da177e4SLinus Torvalds 	[DEC_IRQ_CASCADE]	= -1,
2411da177e4SLinus Torvalds 	[DEC_IRQ_AB_RECV]	= -1,
2421da177e4SLinus Torvalds 	[DEC_IRQ_AB_XMIT]	= -1,
2431da177e4SLinus Torvalds 	[DEC_IRQ_DZ11]		= DEC_CPU_IRQ_NR(KN230_CPU_INR_DZ11),
2441da177e4SLinus Torvalds 	[DEC_IRQ_ASC]		= -1,
2451da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY]	= -1,
2461da177e4SLinus Torvalds 	[DEC_IRQ_FPU]		= DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
2471da177e4SLinus Torvalds 	[DEC_IRQ_HALT]		= DEC_CPU_IRQ_NR(KN230_CPU_INR_HALT),
2481da177e4SLinus Torvalds 	[DEC_IRQ_ISDN]		= -1,
2491da177e4SLinus Torvalds 	[DEC_IRQ_LANCE]		= DEC_CPU_IRQ_NR(KN230_CPU_INR_LANCE),
2501da177e4SLinus Torvalds 	[DEC_IRQ_BUS]		= DEC_CPU_IRQ_NR(KN230_CPU_INR_BUS),
2511da177e4SLinus Torvalds 	[DEC_IRQ_PSU]		= -1,
2521da177e4SLinus Torvalds 	[DEC_IRQ_RTC]		= DEC_CPU_IRQ_NR(KN230_CPU_INR_RTC),
2531da177e4SLinus Torvalds 	[DEC_IRQ_SCC0]		= -1,
2541da177e4SLinus Torvalds 	[DEC_IRQ_SCC1]		= -1,
2551da177e4SLinus Torvalds 	[DEC_IRQ_SII]		= DEC_CPU_IRQ_NR(KN230_CPU_INR_SII),
2561da177e4SLinus Torvalds 	[DEC_IRQ_TC0]		= -1,
2571da177e4SLinus Torvalds 	[DEC_IRQ_TC1]		= -1,
2581da177e4SLinus Torvalds 	[DEC_IRQ_TC2]		= -1,
2591da177e4SLinus Torvalds 	[DEC_IRQ_TIMER]		= -1,
2601da177e4SLinus Torvalds 	[DEC_IRQ_VIDEO]		= -1,
2611da177e4SLinus Torvalds 	[DEC_IRQ_ASC_MERR]	= -1,
2621da177e4SLinus Torvalds 	[DEC_IRQ_ASC_ERR]	= -1,
2631da177e4SLinus Torvalds 	[DEC_IRQ_ASC_DMA]	= -1,
2641da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY_ERR]	= -1,
2651da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_ERR]	= -1,
2661da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_RXDMA]	= -1,
2671da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_TXDMA]	= -1,
2681da177e4SLinus Torvalds 	[DEC_IRQ_LANCE_MERR]	= -1,
2691da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXERR]	= -1,
2701da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXDMA]	= -1,
2711da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXERR]	= -1,
2721da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXDMA]	= -1,
2731da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXERR]	= -1,
2741da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXDMA]	= -1,
2751da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXERR]	= -1,
2761da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXDMA]	= -1,
2771da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXERR]	= -1,
2781da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXDMA]	= -1,
2791da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXERR]	= -1,
2801da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXDMA]	= -1,
2811da177e4SLinus Torvalds };
2821da177e4SLinus Torvalds 
2831da177e4SLinus Torvalds static int_ptr kn230_cpu_mask_nr_tbl[][2] __initdata = {
2841da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_BUS) },
2851da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_BUS) } },
2861da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_RTC) },
2871da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_RTC) } },
2881da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_DZ11) },
2891da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_DZ11) } },
2901da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_SII) },
2911da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_SII) } },
2921da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_ALL },
2931da177e4SLinus Torvalds 		{ .p = cpu_all_int } },
2941da177e4SLinus Torvalds };
2951da177e4SLinus Torvalds 
dec_init_kn230(void)29623bbbaf8SMaciej W. Rozycki static void __init dec_init_kn230(void)
2971da177e4SLinus Torvalds {
2981da177e4SLinus Torvalds 	/* IRQ routing. */
2991da177e4SLinus Torvalds 	memcpy(&dec_interrupt, &kn230_interrupt,
3001da177e4SLinus Torvalds 		sizeof(kn230_interrupt));
3011da177e4SLinus Torvalds 
3021da177e4SLinus Torvalds 	/* CPU IRQ priorities. */
3031da177e4SLinus Torvalds 	memcpy(&cpu_mask_nr_tbl, &kn230_cpu_mask_nr_tbl,
3041da177e4SLinus Torvalds 		sizeof(kn230_cpu_mask_nr_tbl));
3051da177e4SLinus Torvalds 
30697dcb82dSAtsushi Nemoto 	mips_cpu_irq_init();
3071da177e4SLinus Torvalds 
3081da177e4SLinus Torvalds }				/* dec_init_kn230 */
3091da177e4SLinus Torvalds 
3101da177e4SLinus Torvalds 
3111da177e4SLinus Torvalds /*
3121da177e4SLinus Torvalds  * Machine-specific initialisation for KN02, aka DS5000/200, aka 3max.
3131da177e4SLinus Torvalds  */
3141da177e4SLinus Torvalds static int kn02_interrupt[DEC_NR_INTS] __initdata = {
3151da177e4SLinus Torvalds 	[DEC_IRQ_CASCADE]	= DEC_CPU_IRQ_NR(KN02_CPU_INR_CASCADE),
3161da177e4SLinus Torvalds 	[DEC_IRQ_AB_RECV]	= -1,
3171da177e4SLinus Torvalds 	[DEC_IRQ_AB_XMIT]	= -1,
3181da177e4SLinus Torvalds 	[DEC_IRQ_DZ11]		= KN02_IRQ_NR(KN02_CSR_INR_DZ11),
3191da177e4SLinus Torvalds 	[DEC_IRQ_ASC]		= KN02_IRQ_NR(KN02_CSR_INR_ASC),
3201da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY]	= -1,
3211da177e4SLinus Torvalds 	[DEC_IRQ_FPU]		= DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
3221da177e4SLinus Torvalds 	[DEC_IRQ_HALT]		= -1,
3231da177e4SLinus Torvalds 	[DEC_IRQ_ISDN]		= -1,
3241da177e4SLinus Torvalds 	[DEC_IRQ_LANCE]		= KN02_IRQ_NR(KN02_CSR_INR_LANCE),
3251da177e4SLinus Torvalds 	[DEC_IRQ_BUS]		= DEC_CPU_IRQ_NR(KN02_CPU_INR_BUS),
3261da177e4SLinus Torvalds 	[DEC_IRQ_PSU]		= -1,
3271da177e4SLinus Torvalds 	[DEC_IRQ_RTC]		= DEC_CPU_IRQ_NR(KN02_CPU_INR_RTC),
3281da177e4SLinus Torvalds 	[DEC_IRQ_SCC0]		= -1,
3291da177e4SLinus Torvalds 	[DEC_IRQ_SCC1]		= -1,
3301da177e4SLinus Torvalds 	[DEC_IRQ_SII]		= -1,
3311da177e4SLinus Torvalds 	[DEC_IRQ_TC0]		= KN02_IRQ_NR(KN02_CSR_INR_TC0),
3321da177e4SLinus Torvalds 	[DEC_IRQ_TC1]		= KN02_IRQ_NR(KN02_CSR_INR_TC1),
3331da177e4SLinus Torvalds 	[DEC_IRQ_TC2]		= KN02_IRQ_NR(KN02_CSR_INR_TC2),
3341da177e4SLinus Torvalds 	[DEC_IRQ_TIMER]		= -1,
3351da177e4SLinus Torvalds 	[DEC_IRQ_VIDEO]		= -1,
3361da177e4SLinus Torvalds 	[DEC_IRQ_ASC_MERR]	= -1,
3371da177e4SLinus Torvalds 	[DEC_IRQ_ASC_ERR]	= -1,
3381da177e4SLinus Torvalds 	[DEC_IRQ_ASC_DMA]	= -1,
3391da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY_ERR]	= -1,
3401da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_ERR]	= -1,
3411da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_RXDMA]	= -1,
3421da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_TXDMA]	= -1,
3431da177e4SLinus Torvalds 	[DEC_IRQ_LANCE_MERR]	= -1,
3441da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXERR]	= -1,
3451da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXDMA]	= -1,
3461da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXERR]	= -1,
3471da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXDMA]	= -1,
3481da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXERR]	= -1,
3491da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXDMA]	= -1,
3501da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXERR]	= -1,
3511da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXDMA]	= -1,
3521da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXERR]	= -1,
3531da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXDMA]	= -1,
3541da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXERR]	= -1,
3551da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXDMA]	= -1,
3561da177e4SLinus Torvalds };
3571da177e4SLinus Torvalds 
3581da177e4SLinus Torvalds static int_ptr kn02_cpu_mask_nr_tbl[][2] __initdata = {
3591da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_BUS) },
3601da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN02_CPU_INR_BUS) } },
3611da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_RTC) },
3621da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN02_CPU_INR_RTC) } },
3631da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_CASCADE) },
3641da177e4SLinus Torvalds 		{ .p = kn02_io_int } },
3651da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_ALL },
3661da177e4SLinus Torvalds 		{ .p = cpu_all_int } },
3671da177e4SLinus Torvalds };
3681da177e4SLinus Torvalds 
3691da177e4SLinus Torvalds static int_ptr kn02_asic_mask_nr_tbl[][2] __initdata = {
3701da177e4SLinus Torvalds 	{ { .i = KN02_IRQ_MASK(KN02_CSR_INR_DZ11) },
3711da177e4SLinus Torvalds 		{ .i = KN02_IRQ_NR(KN02_CSR_INR_DZ11) } },
3721da177e4SLinus Torvalds 	{ { .i = KN02_IRQ_MASK(KN02_CSR_INR_ASC) },
3731da177e4SLinus Torvalds 		{ .i = KN02_IRQ_NR(KN02_CSR_INR_ASC) } },
3741da177e4SLinus Torvalds 	{ { .i = KN02_IRQ_MASK(KN02_CSR_INR_LANCE) },
3751da177e4SLinus Torvalds 		{ .i = KN02_IRQ_NR(KN02_CSR_INR_LANCE) } },
3761da177e4SLinus Torvalds 	{ { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC2) },
3771da177e4SLinus Torvalds 		{ .i = KN02_IRQ_NR(KN02_CSR_INR_TC2) } },
3781da177e4SLinus Torvalds 	{ { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC1) },
3791da177e4SLinus Torvalds 		{ .i = KN02_IRQ_NR(KN02_CSR_INR_TC1) } },
3801da177e4SLinus Torvalds 	{ { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC0) },
3811da177e4SLinus Torvalds 		{ .i = KN02_IRQ_NR(KN02_CSR_INR_TC0) } },
3821da177e4SLinus Torvalds 	{ { .i = KN02_IRQ_ALL },
3831da177e4SLinus Torvalds 		{ .p = kn02_all_int } },
3841da177e4SLinus Torvalds };
3851da177e4SLinus Torvalds 
dec_init_kn02(void)38623bbbaf8SMaciej W. Rozycki static void __init dec_init_kn02(void)
3871da177e4SLinus Torvalds {
3881da177e4SLinus Torvalds 	/* IRQ routing. */
3891da177e4SLinus Torvalds 	memcpy(&dec_interrupt, &kn02_interrupt,
3901da177e4SLinus Torvalds 		sizeof(kn02_interrupt));
3911da177e4SLinus Torvalds 
3921da177e4SLinus Torvalds 	/* CPU IRQ priorities. */
3931da177e4SLinus Torvalds 	memcpy(&cpu_mask_nr_tbl, &kn02_cpu_mask_nr_tbl,
3941da177e4SLinus Torvalds 		sizeof(kn02_cpu_mask_nr_tbl));
3951da177e4SLinus Torvalds 
3961da177e4SLinus Torvalds 	/* KN02 CSR IRQ priorities. */
3971da177e4SLinus Torvalds 	memcpy(&asic_mask_nr_tbl, &kn02_asic_mask_nr_tbl,
3981da177e4SLinus Torvalds 		sizeof(kn02_asic_mask_nr_tbl));
3991da177e4SLinus Torvalds 
40097dcb82dSAtsushi Nemoto 	mips_cpu_irq_init();
4011da177e4SLinus Torvalds 	init_kn02_irqs(KN02_IRQ_BASE);
4021da177e4SLinus Torvalds 
4031da177e4SLinus Torvalds }				/* dec_init_kn02 */
4041da177e4SLinus Torvalds 
4051da177e4SLinus Torvalds 
4061da177e4SLinus Torvalds /*
4071da177e4SLinus Torvalds  * Machine-specific initialisation for KN02-BA, aka DS5000/1xx
4081da177e4SLinus Torvalds  * (xx = 20, 25, 33), aka 3min.  Also applies to KN04(-BA), aka
4091da177e4SLinus Torvalds  * DS5000/150, aka 4min.
4101da177e4SLinus Torvalds  */
4111da177e4SLinus Torvalds static int kn02ba_interrupt[DEC_NR_INTS] __initdata = {
4121da177e4SLinus Torvalds 	[DEC_IRQ_CASCADE]	= DEC_CPU_IRQ_NR(KN02BA_CPU_INR_CASCADE),
4131da177e4SLinus Torvalds 	[DEC_IRQ_AB_RECV]	= -1,
4141da177e4SLinus Torvalds 	[DEC_IRQ_AB_XMIT]	= -1,
4151da177e4SLinus Torvalds 	[DEC_IRQ_DZ11]		= -1,
4161da177e4SLinus Torvalds 	[DEC_IRQ_ASC]		= IO_IRQ_NR(KN02BA_IO_INR_ASC),
4171da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY]	= -1,
4181da177e4SLinus Torvalds 	[DEC_IRQ_FPU]		= DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
4191da177e4SLinus Torvalds 	[DEC_IRQ_HALT]		= DEC_CPU_IRQ_NR(KN02BA_CPU_INR_HALT),
4201da177e4SLinus Torvalds 	[DEC_IRQ_ISDN]		= -1,
4211da177e4SLinus Torvalds 	[DEC_IRQ_LANCE]		= IO_IRQ_NR(KN02BA_IO_INR_LANCE),
4221da177e4SLinus Torvalds 	[DEC_IRQ_BUS]		= IO_IRQ_NR(KN02BA_IO_INR_BUS),
4231da177e4SLinus Torvalds 	[DEC_IRQ_PSU]		= IO_IRQ_NR(KN02BA_IO_INR_PSU),
4241da177e4SLinus Torvalds 	[DEC_IRQ_RTC]		= IO_IRQ_NR(KN02BA_IO_INR_RTC),
4251da177e4SLinus Torvalds 	[DEC_IRQ_SCC0]		= IO_IRQ_NR(KN02BA_IO_INR_SCC0),
4261da177e4SLinus Torvalds 	[DEC_IRQ_SCC1]		= IO_IRQ_NR(KN02BA_IO_INR_SCC1),
4271da177e4SLinus Torvalds 	[DEC_IRQ_SII]		= -1,
4281da177e4SLinus Torvalds 	[DEC_IRQ_TC0]		= DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC0),
4291da177e4SLinus Torvalds 	[DEC_IRQ_TC1]		= DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC1),
4301da177e4SLinus Torvalds 	[DEC_IRQ_TC2]		= DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC2),
4311da177e4SLinus Torvalds 	[DEC_IRQ_TIMER]		= -1,
4321da177e4SLinus Torvalds 	[DEC_IRQ_VIDEO]		= -1,
4331da177e4SLinus Torvalds 	[DEC_IRQ_ASC_MERR]	= IO_IRQ_NR(IO_INR_ASC_MERR),
4341da177e4SLinus Torvalds 	[DEC_IRQ_ASC_ERR]	= IO_IRQ_NR(IO_INR_ASC_ERR),
4351da177e4SLinus Torvalds 	[DEC_IRQ_ASC_DMA]	= IO_IRQ_NR(IO_INR_ASC_DMA),
4361da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY_ERR]	= -1,
4371da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_ERR]	= -1,
4381da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_RXDMA]	= -1,
4391da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_TXDMA]	= -1,
4401da177e4SLinus Torvalds 	[DEC_IRQ_LANCE_MERR]	= IO_IRQ_NR(IO_INR_LANCE_MERR),
4411da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXERR]	= IO_IRQ_NR(IO_INR_SCC0A_RXERR),
4421da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXDMA]	= IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
4431da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXERR]	= IO_IRQ_NR(IO_INR_SCC0A_TXERR),
4441da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXDMA]	= IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
4451da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXERR]	= -1,
4461da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXDMA]	= -1,
4471da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXERR]	= -1,
4481da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXDMA]	= -1,
4491da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXERR]	= IO_IRQ_NR(IO_INR_SCC1A_RXERR),
4501da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXDMA]	= IO_IRQ_NR(IO_INR_SCC1A_RXDMA),
4511da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXERR]	= IO_IRQ_NR(IO_INR_SCC1A_TXERR),
4521da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXDMA]	= IO_IRQ_NR(IO_INR_SCC1A_TXDMA),
4531da177e4SLinus Torvalds };
4541da177e4SLinus Torvalds 
4551da177e4SLinus Torvalds static int_ptr kn02ba_cpu_mask_nr_tbl[][2] __initdata = {
4561da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_CASCADE) },
4571da177e4SLinus Torvalds 		{ .p = kn02xa_io_int } },
4581da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC2) },
4591da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC2) } },
4601da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC1) },
4611da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC1) } },
4621da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC0) },
4631da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC0) } },
4641da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_ALL },
4651da177e4SLinus Torvalds 		{ .p = cpu_all_int } },
4661da177e4SLinus Torvalds };
4671da177e4SLinus Torvalds 
4681da177e4SLinus Torvalds static int_ptr kn02ba_asic_mask_nr_tbl[][2] __initdata = {
4691da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02BA_IO_INR_BUS) },
4701da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02BA_IO_INR_BUS) } },
4711da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02BA_IO_INR_RTC) },
4721da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02BA_IO_INR_RTC) } },
4731da177e4SLinus Torvalds 	{ { .i = IO_IRQ_DMA },
4741da177e4SLinus Torvalds 		{ .p = asic_dma_int } },
4751da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02BA_IO_INR_SCC0) },
4761da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02BA_IO_INR_SCC0) } },
4771da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02BA_IO_INR_SCC1) },
4781da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02BA_IO_INR_SCC1) } },
4791da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02BA_IO_INR_ASC) },
4801da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02BA_IO_INR_ASC) } },
4811da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02BA_IO_INR_LANCE) },
4821da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02BA_IO_INR_LANCE) } },
4831da177e4SLinus Torvalds 	{ { .i = IO_IRQ_ALL },
4841da177e4SLinus Torvalds 		{ .p = asic_all_int } },
4851da177e4SLinus Torvalds };
4861da177e4SLinus Torvalds 
dec_init_kn02ba(void)48723bbbaf8SMaciej W. Rozycki static void __init dec_init_kn02ba(void)
4881da177e4SLinus Torvalds {
4891da177e4SLinus Torvalds 	/* IRQ routing. */
4901da177e4SLinus Torvalds 	memcpy(&dec_interrupt, &kn02ba_interrupt,
4911da177e4SLinus Torvalds 		sizeof(kn02ba_interrupt));
4921da177e4SLinus Torvalds 
4931da177e4SLinus Torvalds 	/* CPU IRQ priorities. */
4941da177e4SLinus Torvalds 	memcpy(&cpu_mask_nr_tbl, &kn02ba_cpu_mask_nr_tbl,
4951da177e4SLinus Torvalds 		sizeof(kn02ba_cpu_mask_nr_tbl));
4961da177e4SLinus Torvalds 
4971da177e4SLinus Torvalds 	/* I/O ASIC IRQ priorities. */
4981da177e4SLinus Torvalds 	memcpy(&asic_mask_nr_tbl, &kn02ba_asic_mask_nr_tbl,
4991da177e4SLinus Torvalds 		sizeof(kn02ba_asic_mask_nr_tbl));
5001da177e4SLinus Torvalds 
50197dcb82dSAtsushi Nemoto 	mips_cpu_irq_init();
5021da177e4SLinus Torvalds 	init_ioasic_irqs(IO_IRQ_BASE);
5031da177e4SLinus Torvalds 
5041da177e4SLinus Torvalds }				/* dec_init_kn02ba */
5051da177e4SLinus Torvalds 
5061da177e4SLinus Torvalds 
5071da177e4SLinus Torvalds /*
5081da177e4SLinus Torvalds  * Machine-specific initialisation for KN02-CA, aka DS5000/xx,
5091da177e4SLinus Torvalds  * (xx = 20, 25, 33), aka MAXine.  Also applies to KN04(-CA), aka
5101da177e4SLinus Torvalds  * DS5000/50, aka 4MAXine.
5111da177e4SLinus Torvalds  */
5121da177e4SLinus Torvalds static int kn02ca_interrupt[DEC_NR_INTS] __initdata = {
5131da177e4SLinus Torvalds 	[DEC_IRQ_CASCADE]	= DEC_CPU_IRQ_NR(KN02CA_CPU_INR_CASCADE),
5141da177e4SLinus Torvalds 	[DEC_IRQ_AB_RECV]	= IO_IRQ_NR(KN02CA_IO_INR_AB_RECV),
5151da177e4SLinus Torvalds 	[DEC_IRQ_AB_XMIT]	= IO_IRQ_NR(KN02CA_IO_INR_AB_XMIT),
5161da177e4SLinus Torvalds 	[DEC_IRQ_DZ11]		= -1,
5171da177e4SLinus Torvalds 	[DEC_IRQ_ASC]		= IO_IRQ_NR(KN02CA_IO_INR_ASC),
5181da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY]	= IO_IRQ_NR(KN02CA_IO_INR_FLOPPY),
5191da177e4SLinus Torvalds 	[DEC_IRQ_FPU]		= DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
5201da177e4SLinus Torvalds 	[DEC_IRQ_HALT]		= DEC_CPU_IRQ_NR(KN02CA_CPU_INR_HALT),
5211da177e4SLinus Torvalds 	[DEC_IRQ_ISDN]		= IO_IRQ_NR(KN02CA_IO_INR_ISDN),
5221da177e4SLinus Torvalds 	[DEC_IRQ_LANCE]		= IO_IRQ_NR(KN02CA_IO_INR_LANCE),
5231da177e4SLinus Torvalds 	[DEC_IRQ_BUS]		= DEC_CPU_IRQ_NR(KN02CA_CPU_INR_BUS),
5241da177e4SLinus Torvalds 	[DEC_IRQ_PSU]		= -1,
5251da177e4SLinus Torvalds 	[DEC_IRQ_RTC]		= DEC_CPU_IRQ_NR(KN02CA_CPU_INR_RTC),
5261da177e4SLinus Torvalds 	[DEC_IRQ_SCC0]		= IO_IRQ_NR(KN02CA_IO_INR_SCC0),
5271da177e4SLinus Torvalds 	[DEC_IRQ_SCC1]		= -1,
5281da177e4SLinus Torvalds 	[DEC_IRQ_SII]		= -1,
5291da177e4SLinus Torvalds 	[DEC_IRQ_TC0]		= IO_IRQ_NR(KN02CA_IO_INR_TC0),
5301da177e4SLinus Torvalds 	[DEC_IRQ_TC1]		= IO_IRQ_NR(KN02CA_IO_INR_TC1),
5311da177e4SLinus Torvalds 	[DEC_IRQ_TC2]		= -1,
5321da177e4SLinus Torvalds 	[DEC_IRQ_TIMER]		= DEC_CPU_IRQ_NR(KN02CA_CPU_INR_TIMER),
5331da177e4SLinus Torvalds 	[DEC_IRQ_VIDEO]		= IO_IRQ_NR(KN02CA_IO_INR_VIDEO),
5341da177e4SLinus Torvalds 	[DEC_IRQ_ASC_MERR]	= IO_IRQ_NR(IO_INR_ASC_MERR),
5351da177e4SLinus Torvalds 	[DEC_IRQ_ASC_ERR]	= IO_IRQ_NR(IO_INR_ASC_ERR),
5361da177e4SLinus Torvalds 	[DEC_IRQ_ASC_DMA]	= IO_IRQ_NR(IO_INR_ASC_DMA),
5371da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY_ERR]	= IO_IRQ_NR(IO_INR_FLOPPY_ERR),
5381da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_ERR]	= IO_IRQ_NR(IO_INR_ISDN_ERR),
5391da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_RXDMA]	= IO_IRQ_NR(IO_INR_ISDN_RXDMA),
5401da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_TXDMA]	= IO_IRQ_NR(IO_INR_ISDN_TXDMA),
5411da177e4SLinus Torvalds 	[DEC_IRQ_LANCE_MERR]	= IO_IRQ_NR(IO_INR_LANCE_MERR),
5421da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXERR]	= IO_IRQ_NR(IO_INR_SCC0A_RXERR),
5431da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXDMA]	= IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
5441da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXERR]	= IO_IRQ_NR(IO_INR_SCC0A_TXERR),
5451da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXDMA]	= IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
5461da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXERR]	= IO_IRQ_NR(IO_INR_AB_RXERR),
5471da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXDMA]	= IO_IRQ_NR(IO_INR_AB_RXDMA),
5481da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXERR]	= IO_IRQ_NR(IO_INR_AB_TXERR),
5491da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXDMA]	= IO_IRQ_NR(IO_INR_AB_TXDMA),
5501da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXERR]	= -1,
5511da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXDMA]	= -1,
5521da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXERR]	= -1,
5531da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXDMA]	= -1,
5541da177e4SLinus Torvalds };
5551da177e4SLinus Torvalds 
5561da177e4SLinus Torvalds static int_ptr kn02ca_cpu_mask_nr_tbl[][2] __initdata = {
5571da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_BUS) },
5581da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_BUS) } },
5591da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_RTC) },
5601da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_RTC) } },
5611da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_CASCADE) },
5621da177e4SLinus Torvalds 		{ .p = kn02xa_io_int } },
5631da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_ALL },
5641da177e4SLinus Torvalds 		{ .p = cpu_all_int } },
5651da177e4SLinus Torvalds };
5661da177e4SLinus Torvalds 
5671da177e4SLinus Torvalds static int_ptr kn02ca_asic_mask_nr_tbl[][2] __initdata = {
5681da177e4SLinus Torvalds 	{ { .i = IO_IRQ_DMA },
5691da177e4SLinus Torvalds 		{ .p = asic_dma_int } },
5701da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02CA_IO_INR_SCC0) },
5711da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02CA_IO_INR_SCC0) } },
5721da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02CA_IO_INR_ASC) },
5731da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02CA_IO_INR_ASC) } },
5741da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02CA_IO_INR_LANCE) },
5751da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02CA_IO_INR_LANCE) } },
5761da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02CA_IO_INR_TC1) },
5771da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02CA_IO_INR_TC1) } },
5781da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN02CA_IO_INR_TC0) },
5791da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN02CA_IO_INR_TC0) } },
5801da177e4SLinus Torvalds 	{ { .i = IO_IRQ_ALL },
5811da177e4SLinus Torvalds 		{ .p = asic_all_int } },
5821da177e4SLinus Torvalds };
5831da177e4SLinus Torvalds 
dec_init_kn02ca(void)58423bbbaf8SMaciej W. Rozycki static void __init dec_init_kn02ca(void)
5851da177e4SLinus Torvalds {
5861da177e4SLinus Torvalds 	/* IRQ routing. */
5871da177e4SLinus Torvalds 	memcpy(&dec_interrupt, &kn02ca_interrupt,
5881da177e4SLinus Torvalds 		sizeof(kn02ca_interrupt));
5891da177e4SLinus Torvalds 
5901da177e4SLinus Torvalds 	/* CPU IRQ priorities. */
5911da177e4SLinus Torvalds 	memcpy(&cpu_mask_nr_tbl, &kn02ca_cpu_mask_nr_tbl,
5921da177e4SLinus Torvalds 		sizeof(kn02ca_cpu_mask_nr_tbl));
5931da177e4SLinus Torvalds 
5941da177e4SLinus Torvalds 	/* I/O ASIC IRQ priorities. */
5951da177e4SLinus Torvalds 	memcpy(&asic_mask_nr_tbl, &kn02ca_asic_mask_nr_tbl,
5961da177e4SLinus Torvalds 		sizeof(kn02ca_asic_mask_nr_tbl));
5971da177e4SLinus Torvalds 
59897dcb82dSAtsushi Nemoto 	mips_cpu_irq_init();
5991da177e4SLinus Torvalds 	init_ioasic_irqs(IO_IRQ_BASE);
6001da177e4SLinus Torvalds 
6011da177e4SLinus Torvalds }				/* dec_init_kn02ca */
6021da177e4SLinus Torvalds 
6031da177e4SLinus Torvalds 
6041da177e4SLinus Torvalds /*
6051da177e4SLinus Torvalds  * Machine-specific initialisation for KN03, aka DS5000/240,
6061da177e4SLinus Torvalds  * aka 3max+ and DS5900, aka BIGmax.  Also applies to KN05, aka
6071da177e4SLinus Torvalds  * DS5000/260, aka 4max+ and DS5900/260.
6081da177e4SLinus Torvalds  */
6091da177e4SLinus Torvalds static int kn03_interrupt[DEC_NR_INTS] __initdata = {
6101da177e4SLinus Torvalds 	[DEC_IRQ_CASCADE]	= DEC_CPU_IRQ_NR(KN03_CPU_INR_CASCADE),
6111da177e4SLinus Torvalds 	[DEC_IRQ_AB_RECV]	= -1,
6121da177e4SLinus Torvalds 	[DEC_IRQ_AB_XMIT]	= -1,
6131da177e4SLinus Torvalds 	[DEC_IRQ_DZ11]		= -1,
6141da177e4SLinus Torvalds 	[DEC_IRQ_ASC]		= IO_IRQ_NR(KN03_IO_INR_ASC),
6151da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY]	= -1,
6161da177e4SLinus Torvalds 	[DEC_IRQ_FPU]		= DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
6171da177e4SLinus Torvalds 	[DEC_IRQ_HALT]		= DEC_CPU_IRQ_NR(KN03_CPU_INR_HALT),
6181da177e4SLinus Torvalds 	[DEC_IRQ_ISDN]		= -1,
6191da177e4SLinus Torvalds 	[DEC_IRQ_LANCE]		= IO_IRQ_NR(KN03_IO_INR_LANCE),
6201da177e4SLinus Torvalds 	[DEC_IRQ_BUS]		= DEC_CPU_IRQ_NR(KN03_CPU_INR_BUS),
6211da177e4SLinus Torvalds 	[DEC_IRQ_PSU]		= IO_IRQ_NR(KN03_IO_INR_PSU),
6221da177e4SLinus Torvalds 	[DEC_IRQ_RTC]		= DEC_CPU_IRQ_NR(KN03_CPU_INR_RTC),
6231da177e4SLinus Torvalds 	[DEC_IRQ_SCC0]		= IO_IRQ_NR(KN03_IO_INR_SCC0),
6241da177e4SLinus Torvalds 	[DEC_IRQ_SCC1]		= IO_IRQ_NR(KN03_IO_INR_SCC1),
6251da177e4SLinus Torvalds 	[DEC_IRQ_SII]		= -1,
6261da177e4SLinus Torvalds 	[DEC_IRQ_TC0]		= IO_IRQ_NR(KN03_IO_INR_TC0),
6271da177e4SLinus Torvalds 	[DEC_IRQ_TC1]		= IO_IRQ_NR(KN03_IO_INR_TC1),
6281da177e4SLinus Torvalds 	[DEC_IRQ_TC2]		= IO_IRQ_NR(KN03_IO_INR_TC2),
6291da177e4SLinus Torvalds 	[DEC_IRQ_TIMER]		= -1,
6301da177e4SLinus Torvalds 	[DEC_IRQ_VIDEO]		= -1,
6311da177e4SLinus Torvalds 	[DEC_IRQ_ASC_MERR]	= IO_IRQ_NR(IO_INR_ASC_MERR),
6321da177e4SLinus Torvalds 	[DEC_IRQ_ASC_ERR]	= IO_IRQ_NR(IO_INR_ASC_ERR),
6331da177e4SLinus Torvalds 	[DEC_IRQ_ASC_DMA]	= IO_IRQ_NR(IO_INR_ASC_DMA),
6341da177e4SLinus Torvalds 	[DEC_IRQ_FLOPPY_ERR]	= -1,
6351da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_ERR]	= -1,
6361da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_RXDMA]	= -1,
6371da177e4SLinus Torvalds 	[DEC_IRQ_ISDN_TXDMA]	= -1,
6381da177e4SLinus Torvalds 	[DEC_IRQ_LANCE_MERR]	= IO_IRQ_NR(IO_INR_LANCE_MERR),
6391da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXERR]	= IO_IRQ_NR(IO_INR_SCC0A_RXERR),
6401da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_RXDMA]	= IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
6411da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXERR]	= IO_IRQ_NR(IO_INR_SCC0A_TXERR),
6421da177e4SLinus Torvalds 	[DEC_IRQ_SCC0A_TXDMA]	= IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
6431da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXERR]	= -1,
6441da177e4SLinus Torvalds 	[DEC_IRQ_AB_RXDMA]	= -1,
6451da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXERR]	= -1,
6461da177e4SLinus Torvalds 	[DEC_IRQ_AB_TXDMA]	= -1,
6471da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXERR]	= IO_IRQ_NR(IO_INR_SCC1A_RXERR),
6481da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_RXDMA]	= IO_IRQ_NR(IO_INR_SCC1A_RXDMA),
6491da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXERR]	= IO_IRQ_NR(IO_INR_SCC1A_TXERR),
6501da177e4SLinus Torvalds 	[DEC_IRQ_SCC1A_TXDMA]	= IO_IRQ_NR(IO_INR_SCC1A_TXDMA),
6511da177e4SLinus Torvalds };
6521da177e4SLinus Torvalds 
6531da177e4SLinus Torvalds static int_ptr kn03_cpu_mask_nr_tbl[][2] __initdata = {
6541da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_BUS) },
6551da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN03_CPU_INR_BUS) } },
6561da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_RTC) },
6571da177e4SLinus Torvalds 		{ .i = DEC_CPU_IRQ_NR(KN03_CPU_INR_RTC) } },
6581da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_CASCADE) },
6591da177e4SLinus Torvalds 		{ .p = kn03_io_int } },
6601da177e4SLinus Torvalds 	{ { .i = DEC_CPU_IRQ_ALL },
6611da177e4SLinus Torvalds 		{ .p = cpu_all_int } },
6621da177e4SLinus Torvalds };
6631da177e4SLinus Torvalds 
6641da177e4SLinus Torvalds static int_ptr kn03_asic_mask_nr_tbl[][2] __initdata = {
6651da177e4SLinus Torvalds 	{ { .i = IO_IRQ_DMA },
6661da177e4SLinus Torvalds 		{ .p = asic_dma_int } },
6671da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN03_IO_INR_SCC0) },
6681da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN03_IO_INR_SCC0) } },
6691da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN03_IO_INR_SCC1) },
6701da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN03_IO_INR_SCC1) } },
6711da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN03_IO_INR_ASC) },
6721da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN03_IO_INR_ASC) } },
6731da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN03_IO_INR_LANCE) },
6741da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN03_IO_INR_LANCE) } },
6751da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN03_IO_INR_TC2) },
6761da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN03_IO_INR_TC2) } },
6771da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN03_IO_INR_TC1) },
6781da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN03_IO_INR_TC1) } },
6791da177e4SLinus Torvalds 	{ { .i = IO_IRQ_MASK(KN03_IO_INR_TC0) },
6801da177e4SLinus Torvalds 		{ .i = IO_IRQ_NR(KN03_IO_INR_TC0) } },
6811da177e4SLinus Torvalds 	{ { .i = IO_IRQ_ALL },
6821da177e4SLinus Torvalds 		{ .p = asic_all_int } },
6831da177e4SLinus Torvalds };
6841da177e4SLinus Torvalds 
dec_init_kn03(void)68523bbbaf8SMaciej W. Rozycki static void __init dec_init_kn03(void)
6861da177e4SLinus Torvalds {
6871da177e4SLinus Torvalds 	/* IRQ routing. */
6881da177e4SLinus Torvalds 	memcpy(&dec_interrupt, &kn03_interrupt,
6891da177e4SLinus Torvalds 		sizeof(kn03_interrupt));
6901da177e4SLinus Torvalds 
6911da177e4SLinus Torvalds 	/* CPU IRQ priorities. */
6921da177e4SLinus Torvalds 	memcpy(&cpu_mask_nr_tbl, &kn03_cpu_mask_nr_tbl,
6931da177e4SLinus Torvalds 		sizeof(kn03_cpu_mask_nr_tbl));
6941da177e4SLinus Torvalds 
6951da177e4SLinus Torvalds 	/* I/O ASIC IRQ priorities. */
6961da177e4SLinus Torvalds 	memcpy(&asic_mask_nr_tbl, &kn03_asic_mask_nr_tbl,
6971da177e4SLinus Torvalds 		sizeof(kn03_asic_mask_nr_tbl));
6981da177e4SLinus Torvalds 
69997dcb82dSAtsushi Nemoto 	mips_cpu_irq_init();
7001da177e4SLinus Torvalds 	init_ioasic_irqs(IO_IRQ_BASE);
7011da177e4SLinus Torvalds 
7021da177e4SLinus Torvalds }				/* dec_init_kn03 */
7031da177e4SLinus Torvalds 
7041da177e4SLinus Torvalds 
arch_init_irq(void)7051da177e4SLinus Torvalds void __init arch_init_irq(void)
7061da177e4SLinus Torvalds {
7071da177e4SLinus Torvalds 	switch (mips_machtype) {
7081da177e4SLinus Torvalds 	case MACH_DS23100:	/* DS2100/DS3100 Pmin/Pmax */
7091da177e4SLinus Torvalds 		dec_init_kn01();
7101da177e4SLinus Torvalds 		break;
7111da177e4SLinus Torvalds 	case MACH_DS5100:	/* DS5100 MIPSmate */
7121da177e4SLinus Torvalds 		dec_init_kn230();
7131da177e4SLinus Torvalds 		break;
7141da177e4SLinus Torvalds 	case MACH_DS5000_200:	/* DS5000/200 3max */
7151da177e4SLinus Torvalds 		dec_init_kn02();
7161da177e4SLinus Torvalds 		break;
7171da177e4SLinus Torvalds 	case MACH_DS5000_1XX:	/* DS5000/1xx 3min */
7181da177e4SLinus Torvalds 		dec_init_kn02ba();
7191da177e4SLinus Torvalds 		break;
7201da177e4SLinus Torvalds 	case MACH_DS5000_2X0:	/* DS5000/240 3max+ */
7211da177e4SLinus Torvalds 	case MACH_DS5900:	/* DS5900 bigmax */
7221da177e4SLinus Torvalds 		dec_init_kn03();
7231da177e4SLinus Torvalds 		break;
7241da177e4SLinus Torvalds 	case MACH_DS5000_XX:	/* Personal DS5000/xx */
7251da177e4SLinus Torvalds 		dec_init_kn02ca();
7261da177e4SLinus Torvalds 		break;
7271da177e4SLinus Torvalds 	case MACH_DS5800:	/* DS5800 Isis */
7281da177e4SLinus Torvalds 		panic("Don't know how to set this up!");
7291da177e4SLinus Torvalds 		break;
7301da177e4SLinus Torvalds 	case MACH_DS5400:	/* DS5400 MIPSfair */
7311da177e4SLinus Torvalds 		panic("Don't know how to set this up!");
7321da177e4SLinus Torvalds 		break;
7331da177e4SLinus Torvalds 	case MACH_DS5500:	/* DS5500 MIPSfair-2 */
7341da177e4SLinus Torvalds 		panic("Don't know how to set this up!");
7351da177e4SLinus Torvalds 		break;
7361da177e4SLinus Torvalds 	}
7371da177e4SLinus Torvalds 
7381da177e4SLinus Torvalds 	/* Free the FPU interrupt if the exception is present. */
7391da177e4SLinus Torvalds 	if (!cpu_has_nofpuex) {
7401da177e4SLinus Torvalds 		cpu_fpu_mask = 0;
7411da177e4SLinus Torvalds 		dec_interrupt[DEC_IRQ_FPU] = -1;
7421da177e4SLinus Torvalds 	}
74376ad023bSMaciej W. Rozycki 	/* Free the halt interrupt unused on R4k systems.  */
74476ad023bSMaciej W. Rozycki 	if (current_cpu_type() == CPU_R4000SC ||
74576ad023bSMaciej W. Rozycki 	    current_cpu_type() == CPU_R4400SC)
74676ad023bSMaciej W. Rozycki 		dec_interrupt[DEC_IRQ_HALT] = -1;
7471da177e4SLinus Torvalds 
7481da177e4SLinus Torvalds 	/* Register board interrupts: FPU and cascade. */
74997bf0395SRandy Dunlap 	if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT) &&
75097bf0395SRandy Dunlap 	    dec_interrupt[DEC_IRQ_FPU] >= 0 && cpu_has_fpu) {
751f02cf469SMaciej W. Rozycki 		struct irq_desc *desc_fpu;
752f02cf469SMaciej W. Rozycki 		int irq_fpu;
753f02cf469SMaciej W. Rozycki 
754f02cf469SMaciej W. Rozycki 		irq_fpu = dec_interrupt[DEC_IRQ_FPU];
755ac8fd122Safzal mohammed 		if (request_irq(irq_fpu, no_action, IRQF_NO_THREAD, "fpu",
756ac8fd122Safzal mohammed 				NULL))
757ac8fd122Safzal mohammed 			pr_err("Failed to register fpu interrupt\n");
758f02cf469SMaciej W. Rozycki 		desc_fpu = irq_to_desc(irq_fpu);
759f02cf469SMaciej W. Rozycki 		fpu_kstat_irq = this_cpu_ptr(desc_fpu->kstat_irqs);
760f02cf469SMaciej W. Rozycki 	}
761ac8fd122Safzal mohammed 	if (dec_interrupt[DEC_IRQ_CASCADE] >= 0) {
762ac8fd122Safzal mohammed 		if (request_irq(dec_interrupt[DEC_IRQ_CASCADE], no_action,
763ac8fd122Safzal mohammed 				IRQF_NO_THREAD, "cascade", NULL))
764ac8fd122Safzal mohammed 			pr_err("Failed to register cascade interrupt\n");
765ac8fd122Safzal mohammed 	}
7661da177e4SLinus Torvalds 	/* Register the bus error interrupt. */
767ac8fd122Safzal mohammed 	if (dec_interrupt[DEC_IRQ_BUS] >= 0 && busirq_handler) {
768ac8fd122Safzal mohammed 		if (request_irq(dec_interrupt[DEC_IRQ_BUS], busirq_handler,
76949e6e07eSafzal mohammed 				busirq_flags, "bus error", busirq_handler))
770ac8fd122Safzal mohammed 			pr_err("Failed to register bus error interrupt\n");
771ac8fd122Safzal mohammed 	}
7721da177e4SLinus Torvalds 	/* Register the HALT interrupt. */
773ac8fd122Safzal mohammed 	if (dec_interrupt[DEC_IRQ_HALT] >= 0) {
774ac8fd122Safzal mohammed 		if (request_irq(dec_interrupt[DEC_IRQ_HALT], dec_intr_halt,
775ac8fd122Safzal mohammed 				IRQF_NO_THREAD, "halt", NULL))
776ac8fd122Safzal mohammed 			pr_err("Failed to register halt interrupt\n");
777ac8fd122Safzal mohammed 	}
7781da177e4SLinus Torvalds }
779187933f2SAtsushi Nemoto 
dec_irq_dispatch(unsigned int irq)780187933f2SAtsushi Nemoto asmlinkage unsigned int dec_irq_dispatch(unsigned int irq)
781187933f2SAtsushi Nemoto {
782187933f2SAtsushi Nemoto 	do_IRQ(irq);
783187933f2SAtsushi Nemoto 	return 0;
784187933f2SAtsushi Nemoto }
785