interrupt.c revision 1.6 1 1.6 matt /* $NetBSD: interrupt.c,v 1.6 2010/12/20 00:25:26 matt 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.6 matt __KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.6 2010/12/20 00:25:26 matt 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 <mips/locore.h>
90 1.1 tsutsui
91 1.1 tsutsui #include <machine/autoconf.h>
92 1.1 tsutsui #include <machine/pio.h>
93 1.1 tsutsui
94 1.1 tsutsui #include <arc/arc/timervar.h>
95 1.1 tsutsui #include <arc/jazz/pica.h>
96 1.1 tsutsui #include <arc/jazz/rd94.h>
97 1.1 tsutsui
98 1.1 tsutsui struct cpu_inttab {
99 1.1 tsutsui uint32_t int_mask;
100 1.1 tsutsui uint32_t (*int_hand)(uint32_t, struct clockframe *);
101 1.1 tsutsui };
102 1.1 tsutsui static struct cpu_inttab cpu_int_tab[ARC_NINTPRI];
103 1.1 tsutsui
104 1.1 tsutsui uint32_t cpu_int_mask; /* External cpu interrupt mask */
105 1.1 tsutsui
106 1.1 tsutsui #ifdef ENABLE_INT5_STATCLOCK
107 1.1 tsutsui struct evcnt statclock_ev =
108 1.1 tsutsui EVCNT_INITIALIZER(EVCNT_TYPE_INTR, NULL, "cpu", "statclock");
109 1.1 tsutsui #endif
110 1.1 tsutsui
111 1.1 tsutsui /*
112 1.1 tsutsui * Set up handler for external interrupt events.
113 1.1 tsutsui * Events are checked in priority order.
114 1.1 tsutsui */
115 1.1 tsutsui void
116 1.1 tsutsui arc_set_intr(uint32_t mask, uint32_t (*int_hand)(uint32_t, struct clockframe *),
117 1.1 tsutsui int prio)
118 1.1 tsutsui {
119 1.1 tsutsui
120 1.1 tsutsui if (prio >= ARC_NINTPRI)
121 1.1 tsutsui panic("arc_set_intr: too high priority");
122 1.1 tsutsui
123 1.1 tsutsui if (cpu_int_tab[prio].int_mask != 0 &&
124 1.1 tsutsui (cpu_int_tab[prio].int_mask != mask ||
125 1.1 tsutsui cpu_int_tab[prio].int_hand != int_hand)) {
126 1.1 tsutsui panic("set_intr: int already set");
127 1.1 tsutsui }
128 1.1 tsutsui
129 1.1 tsutsui cpu_int_tab[prio].int_hand = int_hand;
130 1.1 tsutsui cpu_int_tab[prio].int_mask = mask;
131 1.1 tsutsui cpu_int_mask |= mask >> 10;
132 1.1 tsutsui }
133 1.1 tsutsui
134 1.1 tsutsui /*
135 1.1 tsutsui * Handle an interrupt.
136 1.1 tsutsui * N.B., curlwp might be NULL.
137 1.1 tsutsui */
138 1.1 tsutsui void
139 1.5 matt cpu_intr(uint32_t status, uint32_t cause, vaddr_t pc, uint32_t ipending)
140 1.1 tsutsui {
141 1.1 tsutsui struct clockframe cf;
142 1.1 tsutsui struct cpu_inttab *inttab;
143 1.3 ad struct cpu_info *ci;
144 1.4 tsutsui uint32_t handled;
145 1.1 tsutsui u_int i;
146 1.1 tsutsui
147 1.4 tsutsui handled = 0;
148 1.3 ad ci = curcpu();
149 1.6 matt ci->ci_data.cpu_nintr++;
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.4 tsutsui handled |= MIPS_INT_MASK_5;
169 1.1 tsutsui }
170 1.4 tsutsui _splset((status & handled) | 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.4 tsutsui handled |= (*inttab->int_hand)(ipending, &cf);
179 1.1 tsutsui }
180 1.4 tsutsui _splset((status & handled) | 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.4 tsutsui handled |= (*inttab->int_hand)(ipending, &cf);
191 1.1 tsutsui }
192 1.1 tsutsui inttab++;
193 1.1 tsutsui }
194 1.4 tsutsui cause &= ~handled;
195 1.1 tsutsui _splset((status & ~cause & MIPS_HARD_INT_MASK) | MIPS_SR_INT_IE);
196 1.3 ad ci->ci_idepth--;
197 1.1 tsutsui
198 1.3 ad #ifdef __HAVE_FAST_SOFTINTS
199 1.1 tsutsui /* software interrupts */
200 1.1 tsutsui ipending &= (MIPS_SOFT_INT_MASK_1|MIPS_SOFT_INT_MASK_0);
201 1.1 tsutsui if (ipending == 0)
202 1.1 tsutsui return;
203 1.1 tsutsui _clrsoftintr(ipending);
204 1.1 tsutsui softintr_dispatch(ipending);
205 1.3 ad #endif
206 1.1 tsutsui }
207