xref: /linux/arch/mips/sgi-ip22/ip22-int.c (revision 1603b5aca4f15b34848fb5594d0c7b6333b99144)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * ip22-int.c: Routines for generic manipulation of the INT[23] ASIC
31da177e4SLinus Torvalds  *             found on INDY and Indigo2 workstations.
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
61da177e4SLinus Torvalds  * Copyright (C) 1997, 1998 Ralf Baechle (ralf@gnu.org)
71da177e4SLinus Torvalds  * Copyright (C) 1999 Andrew R. Baker (andrewb@uab.edu)
81da177e4SLinus Torvalds  *                    - Indigo2 changes
91da177e4SLinus Torvalds  *                    - Interrupt handling fixes
101da177e4SLinus Torvalds  * Copyright (C) 2001, 2003 Ladislav Michl (ladis@linux-mips.org)
111da177e4SLinus Torvalds  */
121da177e4SLinus Torvalds #include <linux/types.h>
131da177e4SLinus Torvalds #include <linux/init.h>
141da177e4SLinus Torvalds #include <linux/kernel_stat.h>
151da177e4SLinus Torvalds #include <linux/signal.h>
161da177e4SLinus Torvalds #include <linux/sched.h>
171da177e4SLinus Torvalds #include <linux/interrupt.h>
181da177e4SLinus Torvalds #include <linux/irq.h>
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds #include <asm/mipsregs.h>
211da177e4SLinus Torvalds #include <asm/addrspace.h>
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds #include <asm/sgi/ioc.h>
241da177e4SLinus Torvalds #include <asm/sgi/hpc3.h>
251da177e4SLinus Torvalds #include <asm/sgi/ip22.h>
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds /* #define DEBUG_SGINT */
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds /* So far nothing hangs here */
301da177e4SLinus Torvalds #undef USE_LIO3_IRQ
311da177e4SLinus Torvalds 
321da177e4SLinus Torvalds struct sgint_regs *sgint;
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds static char lc0msk_to_irqnr[256];
351da177e4SLinus Torvalds static char lc1msk_to_irqnr[256];
361da177e4SLinus Torvalds static char lc2msk_to_irqnr[256];
371da177e4SLinus Torvalds static char lc3msk_to_irqnr[256];
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds extern int ip22_eisa_init(void);
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds static void enable_local0_irq(unsigned int irq)
421da177e4SLinus Torvalds {
431da177e4SLinus Torvalds 	/* don't allow mappable interrupt to be enabled from setup_irq,
441da177e4SLinus Torvalds 	 * we have our own way to do so */
451da177e4SLinus Torvalds 	if (irq != SGI_MAP_0_IRQ)
461da177e4SLinus Torvalds 		sgint->imask0 |= (1 << (irq - SGINT_LOCAL0));
471da177e4SLinus Torvalds }
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds static void disable_local0_irq(unsigned int irq)
501da177e4SLinus Torvalds {
511da177e4SLinus Torvalds 	sgint->imask0 &= ~(1 << (irq - SGINT_LOCAL0));
521da177e4SLinus Torvalds }
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds static void end_local0_irq (unsigned int irq)
551da177e4SLinus Torvalds {
561da177e4SLinus Torvalds 	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
571da177e4SLinus Torvalds 		enable_local0_irq(irq);
581da177e4SLinus Torvalds }
591da177e4SLinus Torvalds 
6094dee171SRalf Baechle static struct irq_chip ip22_local0_irq_type = {
611da177e4SLinus Torvalds 	.typename	= "IP22 local 0",
62*1603b5acSAtsushi Nemoto 	.ack		= disable_local0_irq,
63*1603b5acSAtsushi Nemoto 	.mask		= disable_local0_irq,
64*1603b5acSAtsushi Nemoto 	.mask_ack	= disable_local0_irq,
65*1603b5acSAtsushi Nemoto 	.unmask		= enable_local0_irq,
661da177e4SLinus Torvalds 	.end		= end_local0_irq,
671da177e4SLinus Torvalds };
681da177e4SLinus Torvalds 
691da177e4SLinus Torvalds static void enable_local1_irq(unsigned int irq)
701da177e4SLinus Torvalds {
711da177e4SLinus Torvalds 	/* don't allow mappable interrupt to be enabled from setup_irq,
721da177e4SLinus Torvalds 	 * we have our own way to do so */
731da177e4SLinus Torvalds 	if (irq != SGI_MAP_1_IRQ)
741da177e4SLinus Torvalds 		sgint->imask1 |= (1 << (irq - SGINT_LOCAL1));
751da177e4SLinus Torvalds }
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds void disable_local1_irq(unsigned int irq)
781da177e4SLinus Torvalds {
791da177e4SLinus Torvalds 	sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1));
801da177e4SLinus Torvalds }
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds static void end_local1_irq (unsigned int irq)
831da177e4SLinus Torvalds {
841da177e4SLinus Torvalds 	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
851da177e4SLinus Torvalds 		enable_local1_irq(irq);
861da177e4SLinus Torvalds }
871da177e4SLinus Torvalds 
8894dee171SRalf Baechle static struct irq_chip ip22_local1_irq_type = {
891da177e4SLinus Torvalds 	.typename	= "IP22 local 1",
90*1603b5acSAtsushi Nemoto 	.ack		= disable_local1_irq,
91*1603b5acSAtsushi Nemoto 	.mask		= disable_local1_irq,
92*1603b5acSAtsushi Nemoto 	.mask_ack	= disable_local1_irq,
93*1603b5acSAtsushi Nemoto 	.unmask		= enable_local1_irq,
941da177e4SLinus Torvalds 	.end		= end_local1_irq,
951da177e4SLinus Torvalds };
961da177e4SLinus Torvalds 
971da177e4SLinus Torvalds static void enable_local2_irq(unsigned int irq)
981da177e4SLinus Torvalds {
991da177e4SLinus Torvalds 	sgint->imask0 |= (1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0));
1001da177e4SLinus Torvalds 	sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2));
1011da177e4SLinus Torvalds }
1021da177e4SLinus Torvalds 
1031da177e4SLinus Torvalds void disable_local2_irq(unsigned int irq)
1041da177e4SLinus Torvalds {
1051da177e4SLinus Torvalds 	sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2));
1061da177e4SLinus Torvalds 	if (!sgint->cmeimask0)
1071da177e4SLinus Torvalds 		sgint->imask0 &= ~(1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0));
1081da177e4SLinus Torvalds }
1091da177e4SLinus Torvalds 
1101da177e4SLinus Torvalds static void end_local2_irq (unsigned int irq)
1111da177e4SLinus Torvalds {
1121da177e4SLinus Torvalds 	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
1131da177e4SLinus Torvalds 		enable_local2_irq(irq);
1141da177e4SLinus Torvalds }
1151da177e4SLinus Torvalds 
11694dee171SRalf Baechle static struct irq_chip ip22_local2_irq_type = {
1171da177e4SLinus Torvalds 	.typename	= "IP22 local 2",
118*1603b5acSAtsushi Nemoto 	.ack		= disable_local2_irq,
119*1603b5acSAtsushi Nemoto 	.mask		= disable_local2_irq,
120*1603b5acSAtsushi Nemoto 	.mask_ack	= disable_local2_irq,
121*1603b5acSAtsushi Nemoto 	.unmask		= enable_local2_irq,
1221da177e4SLinus Torvalds 	.end		= end_local2_irq,
1231da177e4SLinus Torvalds };
1241da177e4SLinus Torvalds 
1251da177e4SLinus Torvalds static void enable_local3_irq(unsigned int irq)
1261da177e4SLinus Torvalds {
1271da177e4SLinus Torvalds 	sgint->imask1 |= (1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1));
1281da177e4SLinus Torvalds 	sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3));
1291da177e4SLinus Torvalds }
1301da177e4SLinus Torvalds 
1311da177e4SLinus Torvalds void disable_local3_irq(unsigned int irq)
1321da177e4SLinus Torvalds {
1331da177e4SLinus Torvalds 	sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3));
1341da177e4SLinus Torvalds 	if (!sgint->cmeimask1)
1351da177e4SLinus Torvalds 		sgint->imask1 &= ~(1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1));
1361da177e4SLinus Torvalds }
1371da177e4SLinus Torvalds 
1381da177e4SLinus Torvalds static void end_local3_irq (unsigned int irq)
1391da177e4SLinus Torvalds {
1401da177e4SLinus Torvalds 	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
1411da177e4SLinus Torvalds 		enable_local3_irq(irq);
1421da177e4SLinus Torvalds }
1431da177e4SLinus Torvalds 
14494dee171SRalf Baechle static struct irq_chip ip22_local3_irq_type = {
1451da177e4SLinus Torvalds 	.typename	= "IP22 local 3",
146*1603b5acSAtsushi Nemoto 	.ack		= disable_local3_irq,
147*1603b5acSAtsushi Nemoto 	.mask		= disable_local3_irq,
148*1603b5acSAtsushi Nemoto 	.mask_ack	= disable_local3_irq,
149*1603b5acSAtsushi Nemoto 	.unmask		= enable_local3_irq,
1501da177e4SLinus Torvalds 	.end		= end_local3_irq,
1511da177e4SLinus Torvalds };
1521da177e4SLinus Torvalds 
153937a8015SRalf Baechle static void indy_local0_irqdispatch(void)
1541da177e4SLinus Torvalds {
1551da177e4SLinus Torvalds 	u8 mask = sgint->istat0 & sgint->imask0;
1561da177e4SLinus Torvalds 	u8 mask2;
1571da177e4SLinus Torvalds 	int irq;
1581da177e4SLinus Torvalds 
1591da177e4SLinus Torvalds 	if (mask & SGINT_ISTAT0_LIO2) {
1601da177e4SLinus Torvalds 		mask2 = sgint->vmeistat & sgint->cmeimask0;
1611da177e4SLinus Torvalds 		irq = lc2msk_to_irqnr[mask2];
1621da177e4SLinus Torvalds 	} else
1631da177e4SLinus Torvalds 		irq = lc0msk_to_irqnr[mask];
1641da177e4SLinus Torvalds 
1651da177e4SLinus Torvalds 	/* if irq == 0, then the interrupt has already been cleared */
1661da177e4SLinus Torvalds 	if (irq)
167937a8015SRalf Baechle 		do_IRQ(irq);
1681da177e4SLinus Torvalds }
1691da177e4SLinus Torvalds 
170937a8015SRalf Baechle static void indy_local1_irqdispatch(void)
1711da177e4SLinus Torvalds {
1721da177e4SLinus Torvalds 	u8 mask = sgint->istat1 & sgint->imask1;
1731da177e4SLinus Torvalds 	u8 mask2;
1741da177e4SLinus Torvalds 	int irq;
1751da177e4SLinus Torvalds 
1761da177e4SLinus Torvalds 	if (mask & SGINT_ISTAT1_LIO3) {
1771da177e4SLinus Torvalds 		mask2 = sgint->vmeistat & sgint->cmeimask1;
1781da177e4SLinus Torvalds 		irq = lc3msk_to_irqnr[mask2];
1791da177e4SLinus Torvalds 	} else
1801da177e4SLinus Torvalds 		irq = lc1msk_to_irqnr[mask];
1811da177e4SLinus Torvalds 
1821da177e4SLinus Torvalds 	/* if irq == 0, then the interrupt has already been cleared */
1831da177e4SLinus Torvalds 	if (irq)
184937a8015SRalf Baechle 		do_IRQ(irq);
1851da177e4SLinus Torvalds }
1861da177e4SLinus Torvalds 
187937a8015SRalf Baechle extern void ip22_be_interrupt(int irq);
1881da177e4SLinus Torvalds 
189937a8015SRalf Baechle static void indy_buserror_irq(void)
1901da177e4SLinus Torvalds {
1911da177e4SLinus Torvalds 	int irq = SGI_BUSERR_IRQ;
1921da177e4SLinus Torvalds 
1931da177e4SLinus Torvalds 	irq_enter();
1941da177e4SLinus Torvalds 	kstat_this_cpu.irqs[irq]++;
195937a8015SRalf Baechle 	ip22_be_interrupt(irq);
1961da177e4SLinus Torvalds 	irq_exit();
1971da177e4SLinus Torvalds }
1981da177e4SLinus Torvalds 
1991da177e4SLinus Torvalds static struct irqaction local0_cascade = {
2001da177e4SLinus Torvalds 	.handler	= no_action,
201f40298fdSThomas Gleixner 	.flags		= IRQF_DISABLED,
2021da177e4SLinus Torvalds 	.name		= "local0 cascade",
2031da177e4SLinus Torvalds };
2041da177e4SLinus Torvalds 
2051da177e4SLinus Torvalds static struct irqaction local1_cascade = {
2061da177e4SLinus Torvalds 	.handler	= no_action,
207f40298fdSThomas Gleixner 	.flags		= IRQF_DISABLED,
2081da177e4SLinus Torvalds 	.name		= "local1 cascade",
2091da177e4SLinus Torvalds };
2101da177e4SLinus Torvalds 
2111da177e4SLinus Torvalds static struct irqaction buserr = {
2121da177e4SLinus Torvalds 	.handler	= no_action,
213f40298fdSThomas Gleixner 	.flags		= IRQF_DISABLED,
2141da177e4SLinus Torvalds 	.name		= "Bus Error",
2151da177e4SLinus Torvalds };
2161da177e4SLinus Torvalds 
2171da177e4SLinus Torvalds static struct irqaction map0_cascade = {
2181da177e4SLinus Torvalds 	.handler	= no_action,
219f40298fdSThomas Gleixner 	.flags		= IRQF_DISABLED,
2201da177e4SLinus Torvalds 	.name		= "mapable0 cascade",
2211da177e4SLinus Torvalds };
2221da177e4SLinus Torvalds 
2231da177e4SLinus Torvalds #ifdef USE_LIO3_IRQ
2241da177e4SLinus Torvalds static struct irqaction map1_cascade = {
2251da177e4SLinus Torvalds 	.handler	= no_action,
226f40298fdSThomas Gleixner 	.flags		= IRQF_DISABLED,
2271da177e4SLinus Torvalds 	.name		= "mapable1 cascade",
2281da177e4SLinus Torvalds };
2291da177e4SLinus Torvalds #define SGI_INTERRUPTS	SGINT_END
2301da177e4SLinus Torvalds #else
2311da177e4SLinus Torvalds #define SGI_INTERRUPTS	SGINT_LOCAL3
2321da177e4SLinus Torvalds #endif
2331da177e4SLinus Torvalds 
234937a8015SRalf Baechle extern void indy_r4k_timer_interrupt(void);
235937a8015SRalf Baechle extern void indy_8254timer_irq(void);
236e4ac58afSRalf Baechle 
237e4ac58afSRalf Baechle /*
238e4ac58afSRalf Baechle  * IRQs on the INDY look basically (barring software IRQs which we don't use
239e4ac58afSRalf Baechle  * at all) like:
240e4ac58afSRalf Baechle  *
241e4ac58afSRalf Baechle  *	MIPS IRQ	Source
242e4ac58afSRalf Baechle  *      --------        ------
243e4ac58afSRalf Baechle  *             0	Software (ignored)
244e4ac58afSRalf Baechle  *             1        Software (ignored)
245e4ac58afSRalf Baechle  *             2        Local IRQ level zero
246e4ac58afSRalf Baechle  *             3        Local IRQ level one
247e4ac58afSRalf Baechle  *             4        8254 Timer zero
248e4ac58afSRalf Baechle  *             5        8254 Timer one
249e4ac58afSRalf Baechle  *             6        Bus Error
250e4ac58afSRalf Baechle  *             7        R4k timer (what we use)
251e4ac58afSRalf Baechle  *
252e4ac58afSRalf Baechle  * We handle the IRQ according to _our_ priority which is:
253e4ac58afSRalf Baechle  *
254e4ac58afSRalf Baechle  * Highest ----     R4k Timer
255e4ac58afSRalf Baechle  *                  Local IRQ zero
256e4ac58afSRalf Baechle  *                  Local IRQ one
257e4ac58afSRalf Baechle  *                  Bus Error
258e4ac58afSRalf Baechle  *                  8254 Timer zero
259e4ac58afSRalf Baechle  * Lowest  ----     8254 Timer one
260e4ac58afSRalf Baechle  *
261e4ac58afSRalf Baechle  * then we just return, if multiple IRQs are pending then we will just take
262e4ac58afSRalf Baechle  * another exception, big deal.
263e4ac58afSRalf Baechle  */
264e4ac58afSRalf Baechle 
265937a8015SRalf Baechle asmlinkage void plat_irq_dispatch(void)
266e4ac58afSRalf Baechle {
267e4ac58afSRalf Baechle 	unsigned int pending = read_c0_cause();
268e4ac58afSRalf Baechle 
269e4ac58afSRalf Baechle 	/*
270e4ac58afSRalf Baechle 	 * First we check for r4k counter/timer IRQ.
271e4ac58afSRalf Baechle 	 */
272e4ac58afSRalf Baechle 	if (pending & CAUSEF_IP7)
273937a8015SRalf Baechle 		indy_r4k_timer_interrupt();
274e4ac58afSRalf Baechle 	else if (pending & CAUSEF_IP2)
275937a8015SRalf Baechle 		indy_local0_irqdispatch();
276e4ac58afSRalf Baechle 	else if (pending & CAUSEF_IP3)
277937a8015SRalf Baechle 		indy_local1_irqdispatch();
278e4ac58afSRalf Baechle 	else if (pending & CAUSEF_IP6)
279937a8015SRalf Baechle 		indy_buserror_irq();
280e4ac58afSRalf Baechle 	else if (pending & (CAUSEF_IP4 | CAUSEF_IP5))
281937a8015SRalf Baechle 		indy_8254timer_irq();
282e4ac58afSRalf Baechle }
283e4ac58afSRalf Baechle 
2841da177e4SLinus Torvalds extern void mips_cpu_irq_init(unsigned int irq_base);
2851da177e4SLinus Torvalds 
2861da177e4SLinus Torvalds void __init arch_init_irq(void)
2871da177e4SLinus Torvalds {
2881da177e4SLinus Torvalds 	int i;
2891da177e4SLinus Torvalds 
2901da177e4SLinus Torvalds 	/* Init local mask --> irq tables. */
2911da177e4SLinus Torvalds 	for (i = 0; i < 256; i++) {
2921da177e4SLinus Torvalds 		if (i & 0x80) {
2931da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = SGINT_LOCAL0 + 7;
2941da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = SGINT_LOCAL1 + 7;
2951da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = SGINT_LOCAL2 + 7;
2961da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = SGINT_LOCAL3 + 7;
2971da177e4SLinus Torvalds 		} else if (i & 0x40) {
2981da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = SGINT_LOCAL0 + 6;
2991da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = SGINT_LOCAL1 + 6;
3001da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = SGINT_LOCAL2 + 6;
3011da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = SGINT_LOCAL3 + 6;
3021da177e4SLinus Torvalds 		} else if (i & 0x20) {
3031da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = SGINT_LOCAL0 + 5;
3041da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = SGINT_LOCAL1 + 5;
3051da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = SGINT_LOCAL2 + 5;
3061da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = SGINT_LOCAL3 + 5;
3071da177e4SLinus Torvalds 		} else if (i & 0x10) {
3081da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = SGINT_LOCAL0 + 4;
3091da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = SGINT_LOCAL1 + 4;
3101da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = SGINT_LOCAL2 + 4;
3111da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = SGINT_LOCAL3 + 4;
3121da177e4SLinus Torvalds 		} else if (i & 0x08) {
3131da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = SGINT_LOCAL0 + 3;
3141da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = SGINT_LOCAL1 + 3;
3151da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = SGINT_LOCAL2 + 3;
3161da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = SGINT_LOCAL3 + 3;
3171da177e4SLinus Torvalds 		} else if (i & 0x04) {
3181da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = SGINT_LOCAL0 + 2;
3191da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = SGINT_LOCAL1 + 2;
3201da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = SGINT_LOCAL2 + 2;
3211da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = SGINT_LOCAL3 + 2;
3221da177e4SLinus Torvalds 		} else if (i & 0x02) {
3231da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = SGINT_LOCAL0 + 1;
3241da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = SGINT_LOCAL1 + 1;
3251da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = SGINT_LOCAL2 + 1;
3261da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = SGINT_LOCAL3 + 1;
3271da177e4SLinus Torvalds 		} else if (i & 0x01) {
3281da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = SGINT_LOCAL0 + 0;
3291da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = SGINT_LOCAL1 + 0;
3301da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = SGINT_LOCAL2 + 0;
3311da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = SGINT_LOCAL3 + 0;
3321da177e4SLinus Torvalds 		} else {
3331da177e4SLinus Torvalds 			lc0msk_to_irqnr[i] = 0;
3341da177e4SLinus Torvalds 			lc1msk_to_irqnr[i] = 0;
3351da177e4SLinus Torvalds 			lc2msk_to_irqnr[i] = 0;
3361da177e4SLinus Torvalds 			lc3msk_to_irqnr[i] = 0;
3371da177e4SLinus Torvalds 		}
3381da177e4SLinus Torvalds 	}
3391da177e4SLinus Torvalds 
3401da177e4SLinus Torvalds 	/* Mask out all interrupts. */
3411da177e4SLinus Torvalds 	sgint->imask0 = 0;
3421da177e4SLinus Torvalds 	sgint->imask1 = 0;
3431da177e4SLinus Torvalds 	sgint->cmeimask0 = 0;
3441da177e4SLinus Torvalds 	sgint->cmeimask1 = 0;
3451da177e4SLinus Torvalds 
3461da177e4SLinus Torvalds 	/* init CPU irqs */
3471da177e4SLinus Torvalds 	mips_cpu_irq_init(SGINT_CPU);
3481da177e4SLinus Torvalds 
3491da177e4SLinus Torvalds 	for (i = SGINT_LOCAL0; i < SGI_INTERRUPTS; i++) {
35094dee171SRalf Baechle 		struct irq_chip *handler;
3511da177e4SLinus Torvalds 
3521da177e4SLinus Torvalds 		if (i < SGINT_LOCAL1)
3531da177e4SLinus Torvalds 			handler		= &ip22_local0_irq_type;
3541da177e4SLinus Torvalds 		else if (i < SGINT_LOCAL2)
3551da177e4SLinus Torvalds 			handler		= &ip22_local1_irq_type;
3561da177e4SLinus Torvalds 		else if (i < SGINT_LOCAL3)
3571da177e4SLinus Torvalds 			handler		= &ip22_local2_irq_type;
3581da177e4SLinus Torvalds 		else
3591da177e4SLinus Torvalds 			handler		= &ip22_local3_irq_type;
3601da177e4SLinus Torvalds 
361*1603b5acSAtsushi Nemoto 		set_irq_chip(i, handler);
3621da177e4SLinus Torvalds 	}
3631da177e4SLinus Torvalds 
3641da177e4SLinus Torvalds 	/* vector handler. this register the IRQ as non-sharable */
3651da177e4SLinus Torvalds 	setup_irq(SGI_LOCAL_0_IRQ, &local0_cascade);
3661da177e4SLinus Torvalds 	setup_irq(SGI_LOCAL_1_IRQ, &local1_cascade);
3671da177e4SLinus Torvalds 	setup_irq(SGI_BUSERR_IRQ, &buserr);
3681da177e4SLinus Torvalds 
3691da177e4SLinus Torvalds 	/* cascade in cascade. i love Indy ;-) */
3701da177e4SLinus Torvalds 	setup_irq(SGI_MAP_0_IRQ, &map0_cascade);
3711da177e4SLinus Torvalds #ifdef USE_LIO3_IRQ
3721da177e4SLinus Torvalds 	setup_irq(SGI_MAP_1_IRQ, &map1_cascade);
3731da177e4SLinus Torvalds #endif
3741da177e4SLinus Torvalds 
3751da177e4SLinus Torvalds #ifdef CONFIG_EISA
3761da177e4SLinus Torvalds 	if (ip22_is_fullhouse())	/* Only Indigo-2 has EISA stuff */
3771da177e4SLinus Torvalds 	        ip22_eisa_init ();
3781da177e4SLinus Torvalds #endif
3791da177e4SLinus Torvalds }
380