interrupt.c revision 1.3 1 1.3 ad /* $NetBSD: interrupt.c,v 1.3 2007/12/03 15:33:13 ad Exp $ */
2 1.1 tsutsui /* $OpenBSD: trap.c,v 1.22 1999/05/24 23:08:59 jason Exp $ */
3 1.1 tsutsui
4 1.1 tsutsui /*
5 1.1 tsutsui * Copyright (c) 1992, 1993
6 1.1 tsutsui * The Regents of the University of California. All rights reserved.
7 1.1 tsutsui *
8 1.1 tsutsui * This code is derived from software contributed to Berkeley by
9 1.1 tsutsui * the Systems Programming Group of the University of Utah Computer
10 1.1 tsutsui * Science Department and Ralph Campbell.
11 1.1 tsutsui *
12 1.1 tsutsui * Redistribution and use in source and binary forms, with or without
13 1.1 tsutsui * modification, are permitted provided that the following conditions
14 1.1 tsutsui * are met:
15 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright
16 1.1 tsutsui * notice, this list of conditions and the following disclaimer.
17 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright
18 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the
19 1.1 tsutsui * documentation and/or other materials provided with the distribution.
20 1.1 tsutsui * 3. Neither the name of the University nor the names of its contributors
21 1.1 tsutsui * may be used to endorse or promote products derived from this software
22 1.1 tsutsui * without specific prior written permission.
23 1.1 tsutsui *
24 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 1.1 tsutsui * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 1.1 tsutsui * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 1.1 tsutsui * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 1.1 tsutsui * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 1.1 tsutsui * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 1.1 tsutsui * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 1.1 tsutsui * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 1.1 tsutsui * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 1.1 tsutsui * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 1.1 tsutsui * SUCH DAMAGE.
35 1.1 tsutsui *
36 1.1 tsutsui * from: Utah Hdr: trap.c 1.32 91/04/06
37 1.1 tsutsui *
38 1.1 tsutsui * @(#)trap.c 8.5 (Berkeley) 1/11/94
39 1.1 tsutsui */
40 1.1 tsutsui /*
41 1.1 tsutsui * Copyright (c) 1988 University of Utah.
42 1.1 tsutsui *
43 1.1 tsutsui * This code is derived from software contributed to Berkeley by
44 1.1 tsutsui * the Systems Programming Group of the University of Utah Computer
45 1.1 tsutsui * Science Department and Ralph Campbell.
46 1.1 tsutsui *
47 1.1 tsutsui * Redistribution and use in source and binary forms, with or without
48 1.1 tsutsui * modification, are permitted provided that the following conditions
49 1.1 tsutsui * are met:
50 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright
51 1.1 tsutsui * notice, this list of conditions and the following disclaimer.
52 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright
53 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the
54 1.1 tsutsui * documentation and/or other materials provided with the distribution.
55 1.1 tsutsui * 3. All advertising materials mentioning features or use of this software
56 1.1 tsutsui * must display the following acknowledgement:
57 1.1 tsutsui * This product includes software developed by the University of
58 1.1 tsutsui * California, Berkeley and its contributors.
59 1.1 tsutsui * 4. Neither the name of the University nor the names of its contributors
60 1.1 tsutsui * may be used to endorse or promote products derived from this software
61 1.1 tsutsui * without specific prior written permission.
62 1.1 tsutsui *
63 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
64 1.1 tsutsui * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
65 1.1 tsutsui * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
66 1.1 tsutsui * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
67 1.1 tsutsui * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
68 1.1 tsutsui * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
69 1.1 tsutsui * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
70 1.1 tsutsui * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
71 1.1 tsutsui * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
72 1.1 tsutsui * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
73 1.1 tsutsui * SUCH DAMAGE.
74 1.1 tsutsui *
75 1.1 tsutsui * from: Utah Hdr: trap.c 1.32 91/04/06
76 1.1 tsutsui *
77 1.1 tsutsui * @(#)trap.c 8.5 (Berkeley) 1/11/94
78 1.1 tsutsui */
79 1.1 tsutsui
80 1.1 tsutsui #include <sys/cdefs.h>
81 1.3 ad __KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.3 2007/12/03 15:33:13 ad Exp $");
82 1.1 tsutsui
83 1.1 tsutsui #include <sys/param.h>
84 1.1 tsutsui #include <sys/systm.h>
85 1.1 tsutsui #include <sys/kernel.h>
86 1.3 ad #include <sys/intr.h>
87 1.3 ad #include <sys/cpu.h>
88 1.1 tsutsui
89 1.1 tsutsui #include <uvm/uvm_extern.h>
90 1.1 tsutsui
91 1.1 tsutsui #include <mips/locore.h>
92 1.1 tsutsui
93 1.1 tsutsui #include <machine/autoconf.h>
94 1.1 tsutsui #include <machine/pio.h>
95 1.1 tsutsui
96 1.1 tsutsui #include <arc/arc/timervar.h>
97 1.1 tsutsui #include <arc/jazz/pica.h>
98 1.1 tsutsui #include <arc/jazz/rd94.h>
99 1.1 tsutsui
100 1.1 tsutsui struct cpu_inttab {
101 1.1 tsutsui uint32_t int_mask;
102 1.1 tsutsui uint32_t (*int_hand)(uint32_t, struct clockframe *);
103 1.1 tsutsui };
104 1.1 tsutsui static struct cpu_inttab cpu_int_tab[ARC_NINTPRI];
105 1.1 tsutsui
106 1.1 tsutsui uint32_t cpu_int_mask; /* External cpu interrupt mask */
107 1.1 tsutsui
108 1.1 tsutsui #ifdef ENABLE_INT5_STATCLOCK
109 1.1 tsutsui struct evcnt statclock_ev =
110 1.1 tsutsui EVCNT_INITIALIZER(EVCNT_TYPE_INTR, NULL, "cpu", "statclock");
111 1.1 tsutsui #endif
112 1.1 tsutsui
113 1.1 tsutsui /*
114 1.1 tsutsui * Set up handler for external interrupt events.
115 1.1 tsutsui * Events are checked in priority order.
116 1.1 tsutsui */
117 1.1 tsutsui void
118 1.1 tsutsui arc_set_intr(uint32_t mask, uint32_t (*int_hand)(uint32_t, struct clockframe *),
119 1.1 tsutsui int prio)
120 1.1 tsutsui {
121 1.1 tsutsui
122 1.1 tsutsui if (prio >= ARC_NINTPRI)
123 1.1 tsutsui panic("arc_set_intr: too high priority");
124 1.1 tsutsui
125 1.1 tsutsui if (cpu_int_tab[prio].int_mask != 0 &&
126 1.1 tsutsui (cpu_int_tab[prio].int_mask != mask ||
127 1.1 tsutsui cpu_int_tab[prio].int_hand != int_hand)) {
128 1.1 tsutsui panic("set_intr: int already set");
129 1.1 tsutsui }
130 1.1 tsutsui
131 1.1 tsutsui cpu_int_tab[prio].int_hand = int_hand;
132 1.1 tsutsui cpu_int_tab[prio].int_mask = mask;
133 1.1 tsutsui cpu_int_mask |= mask >> 10;
134 1.1 tsutsui }
135 1.1 tsutsui
136 1.1 tsutsui /*
137 1.1 tsutsui * Handle an interrupt.
138 1.1 tsutsui * N.B., curlwp might be NULL.
139 1.1 tsutsui */
140 1.1 tsutsui void
141 1.1 tsutsui cpu_intr(uint32_t status, uint32_t cause, uint32_t pc, uint32_t ipending)
142 1.1 tsutsui {
143 1.1 tsutsui struct clockframe cf;
144 1.1 tsutsui struct cpu_inttab *inttab;
145 1.3 ad struct cpu_info *ci;
146 1.1 tsutsui u_int i;
147 1.1 tsutsui
148 1.3 ad ci = curcpu();
149 1.1 tsutsui uvmexp.intrs++;
150 1.3 ad ci->ci_idepth++;
151 1.1 tsutsui
152 1.1 tsutsui cf.pc = pc;
153 1.1 tsutsui cf.sr = status;
154 1.1 tsutsui
155 1.1 tsutsui /* check MIPS3 internal clock interrupt */
156 1.1 tsutsui if (ipending & MIPS_INT_MASK_5) {
157 1.1 tsutsui #ifdef ENABLE_INT5_STATCLOCK
158 1.1 tsutsui /* call statclock(9) handler */
159 1.1 tsutsui statclockintr(&cf);
160 1.1 tsutsui statclock_ev.ev_count++;
161 1.1 tsutsui #else
162 1.1 tsutsui /*
163 1.1 tsutsui * Writing a value to the Compare register,
164 1.1 tsutsui * as a side effect, clears the timer interrupt request.
165 1.1 tsutsui */
166 1.1 tsutsui mips3_cp0_compare_write(0);
167 1.1 tsutsui #endif
168 1.1 tsutsui cause &= ~MIPS_INT_MASK_5;
169 1.1 tsutsui }
170 1.1 tsutsui _splset((status & MIPS_INT_MASK_5) | MIPS_SR_INT_IE);
171 1.1 tsutsui
172 1.1 tsutsui /*
173 1.1 tsutsui * If there is an independent timer interrupt handler, call it first.
174 1.1 tsutsui * Called interrupt routine returns mask of interrupts to be reenabled.
175 1.1 tsutsui */
176 1.1 tsutsui inttab = &cpu_int_tab[ARC_INTPRI_TIMER_INT];
177 1.1 tsutsui if (inttab->int_mask & ipending) {
178 1.1 tsutsui cause &= (*inttab->int_hand)(ipending, &cf);
179 1.1 tsutsui }
180 1.1 tsutsui _splset((status & ~cause & MIPS_HARD_INT_MASK) | MIPS_SR_INT_IE);
181 1.1 tsutsui
182 1.1 tsutsui inttab++;
183 1.1 tsutsui
184 1.1 tsutsui /*
185 1.1 tsutsui * Check off all other enabled interrupts.
186 1.1 tsutsui * Called handlers return mask of interrupts to be reenabled.
187 1.1 tsutsui */
188 1.1 tsutsui for (i = ARC_INTPRI_TIMER_INT + 1; i < ARC_NINTPRI; i++) {
189 1.1 tsutsui if (inttab->int_mask & ipending) {
190 1.1 tsutsui cause &= (*inttab->int_hand)(ipending, &cf);
191 1.1 tsutsui }
192 1.1 tsutsui inttab++;
193 1.1 tsutsui }
194 1.1 tsutsui _splset((status & ~cause & MIPS_HARD_INT_MASK) | MIPS_SR_INT_IE);
195 1.3 ad ci->ci_idepth--;
196 1.1 tsutsui
197 1.3 ad #ifdef __HAVE_FAST_SOFTINTS
198 1.1 tsutsui /* software interrupts */
199 1.1 tsutsui ipending &= (MIPS_SOFT_INT_MASK_1|MIPS_SOFT_INT_MASK_0);
200 1.1 tsutsui if (ipending == 0)
201 1.1 tsutsui return;
202 1.1 tsutsui _clrsoftintr(ipending);
203 1.1 tsutsui softintr_dispatch(ipending);
204 1.3 ad #endif
205 1.1 tsutsui }
206