[MIPS] Fix the crime against humanity that mipsIRQ.S is.
[linux-2.6.git] / arch / mips / mips-boards / sead / sead-irq.S
1 /*
2  * Carsten Langgaard, carstenl@mips.com
3  * Copyright (C) 1999, 2000 MIPS Technologies, Inc.  All rights reserved.
4  *
5  * ########################################################################
6  *
7  *  This program is free software; you can distribute it and/or modify it
8  *  under the terms of the GNU General Public License (Version 2) as
9  *  published by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope it will be useful, but WITHOUT
12  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  *  for more details.
15  *
16  *  You should have received a copy of the GNU General Public License along
17  *  with this program; if not, write to the Free Software Foundation, Inc.,
18  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
19  *
20  * ########################################################################
21  *
22  * Interrupt exception dispatch code.
23  *
24  */
25 #include <linux/config.h>
26
27 #include <asm/asm.h>
28 #include <asm/mipsregs.h>
29 #include <asm/regdef.h>
30 #include <asm/stackframe.h>
31 #include <asm/mips-boards/seadint.h>
32
33 /*
34  * IRQs on the SEAD board look basically are combined together on hardware
35  * interrupt 0 (MIPS IRQ 2)) like:
36  *
37  *      MIPS IRQ        Source
38  *      --------        ------
39  *             0        Software (ignored)
40  *             1        Software (ignored)
41  *             2        UART0 (hw0)
42  *             3        UART1 (hw1)
43  *             4        Hardware (ignored)
44  *             5        Hardware (ignored)
45  *             6        Hardware (ignored)
46  *             7        R4k timer (what we use)
47  *
48  * We handle the IRQ according to _our_ priority which is:
49  *
50  * Highest ----     R4k Timer
51  * Lowest  ----     Combined hardware interrupt
52  *
53  * then we just return, if multiple IRQs are pending then we will just take
54  * another exception, big deal.
55  */
56
57         .text
58         .set    noreorder
59         .set    noat
60         .align  5
61         NESTED(mipsIRQ, PT_SIZE, sp)
62         SAVE_ALL
63         CLI
64         .set    at
65
66         mfc0    s0, CP0_CAUSE           # get irq bits
67         mfc0    s1, CP0_STATUS          # get irq mask
68         andi    s0, ST0_IM              # CAUSE.CE may be non-zero!
69         and     s0, s1
70
71 #if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64)
72         .set    mips32
73         clz     a0, s0
74         .set    mips0
75         negu    a0
76         addu    a0, 31-CAUSEB_IP
77         bltz    a0, spurious
78 #else
79         beqz    s0, spurious
80          li     a0, 7
81
82         and     t0, s0, 0xf000
83         sltiu   t0, t0, 1
84         sll     t0, 2
85         subu    a0, t0
86         sll     s0, t0
87
88         and     t0, s0, 0xc000
89         sltiu   t0, t0, 1
90         sll     t0, 1
91         subu    a0, t0
92         sll     s0, t0
93
94         and     t0, s0, 0x8000
95         sltiu   t0, t0, 1
96         # sll   t0, 0
97         subu    a0, t0
98         # sll   s0, t0
99 #endif
100
101          addu   a0, MIPSCPU_INT_BASE
102         jal     do_IRQ
103          move   a1, sp
104
105         j       ret_from_irq
106          nop
107
108 spurious:
109         j       spurious_interrupt
110          nop
111         END(mipsIRQ)