ioasic.c revision 1.1.2.7 1 1.1.2.7 nisimura /* $NetBSD: ioasic.c,v 1.1.2.7 1999/03/31 04:50:13 nisimura Exp $ */
2 1.1.2.1 nisimura
3 1.1.2.5 nisimura /*
4 1.1.2.5 nisimura * Copyright (c) 1994, 1995 Carnegie-Mellon University.
5 1.1.2.5 nisimura * All rights reserved.
6 1.1.2.5 nisimura *
7 1.1.2.5 nisimura * Author: Keith Bostic, Chris G. Demetriou, Jonathan Stone
8 1.1.2.5 nisimura *
9 1.1.2.5 nisimura * Permission to use, copy, modify and distribute this software and
10 1.1.2.5 nisimura * its documentation is hereby granted, provided that both the copyright
11 1.1.2.5 nisimura * notice and this permission notice appear in all copies of the
12 1.1.2.5 nisimura * software, derivative works or modified versions, and any portions
13 1.1.2.5 nisimura * thereof, and that both notices appear in supporting documentation.
14 1.1.2.5 nisimura *
15 1.1.2.5 nisimura * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16 1.1.2.5 nisimura * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
17 1.1.2.5 nisimura * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18 1.1.2.5 nisimura *
19 1.1.2.5 nisimura * Carnegie Mellon requests users of this software to return to
20 1.1.2.5 nisimura *
21 1.1.2.5 nisimura * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
22 1.1.2.5 nisimura * School of Computer Science
23 1.1.2.5 nisimura * Carnegie Mellon University
24 1.1.2.5 nisimura * Pittsburgh PA 15213-3890
25 1.1.2.5 nisimura *
26 1.1.2.5 nisimura * any improvements or extensions that they make and grant Carnegie the
27 1.1.2.5 nisimura * rights to redistribute these changes.
28 1.1.2.5 nisimura */
29 1.1.2.5 nisimura
30 1.1.2.1 nisimura #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
31 1.1.2.1 nisimura
32 1.1.2.7 nisimura __KERNEL_RCSID(0, "$NetBSD: ioasic.c,v 1.1.2.7 1999/03/31 04:50:13 nisimura Exp $");
33 1.1.2.1 nisimura
34 1.1.2.1 nisimura #include <sys/param.h>
35 1.1.2.1 nisimura #include <sys/systm.h>
36 1.1.2.1 nisimura #include <sys/device.h>
37 1.1.2.1 nisimura
38 1.1.2.1 nisimura #include <machine/bus.h>
39 1.1.2.1 nisimura #include <machine/intr.h>
40 1.1.2.1 nisimura
41 1.1.2.5 nisimura #include <pmax/pmax/pmaxtype.h>
42 1.1.2.1 nisimura #include <dev/tc/tcvar.h>
43 1.1.2.4 drochner #include <dev/tc/ioasicvar.h>
44 1.1.2.1 nisimura #include <pmax/tc/ioasicreg.h>
45 1.1.2.5 nisimura
46 1.1.2.5 nisimura #include "opt_dec_3min.h"
47 1.1.2.5 nisimura #include "opt_dec_maxine.h"
48 1.1.2.5 nisimura #include "opt_dec_3maxplus.h"
49 1.1.2.1 nisimura
50 1.1.2.1 nisimura int ioasicmatch __P((struct device *, struct cfdata *, void *));
51 1.1.2.1 nisimura void ioasicattach __P((struct device *, struct device *, void *));
52 1.1.2.1 nisimura
53 1.1.2.1 nisimura struct cfattach ioasic_ca = {
54 1.1.2.1 nisimura sizeof(struct ioasic_softc), ioasicmatch, ioasicattach,
55 1.1.2.1 nisimura };
56 1.1.2.1 nisimura
57 1.1.2.5 nisimura tc_addr_t ioasic_base;
58 1.1.2.5 nisimura
59 1.1.2.1 nisimura /* XXX XXX XXX */
60 1.1.2.5 nisimura #define IOASIC_INTR_SCSI 0x000e0200
61 1.1.2.5 nisimura #define IOASIC_INTR_DTOP 0x00000001
62 1.1.2.5 nisimura #define IOASIC_INTR_FDC 0x00000090
63 1.1.2.5 nisimura #define XINE_INTR_TC_0 0x00001000
64 1.1.2.5 nisimura #define XINE_INTR_TC_1 0x00000020
65 1.1.2.5 nisimura #define KN03_INTR_TC_0 0x00000800
66 1.1.2.5 nisimura #define KN03_INTR_TC_1 0x00001000
67 1.1.2.5 nisimura #define KN03_INTR_TC_2 0x00002000
68 1.1.2.5 nisimura #define KMIN_INTR_CLOCK 0x00000020
69 1.1.2.1 nisimura
70 1.1.2.1 nisimura extern u_int32_t iplmask[], oldiplmask[];
71 1.1.2.1 nisimura /* XXX XXX XXX */
72 1.1.2.1 nisimura
73 1.1.2.5 nisimura #define C(x) (void *)(x)
74 1.1.2.1 nisimura
75 1.1.2.5 nisimura #if defined(DEC_MAXINE)
76 1.1.2.1 nisimura struct ioasic_dev xine_ioasic_devs[] = {
77 1.1.2.1 nisimura { "lance", 0x0c0000, C(SYS_DEV_LANCE), IOASIC_INTR_LANCE, },
78 1.1.2.1 nisimura { "z8530 ", 0x100000, C(SYS_DEV_SCC0), IOASIC_INTR_SCC_0, },
79 1.1.2.5 nisimura { "mc146818", 0x200000, C(SYS_DEV_BOGUS), 0, },
80 1.1.2.1 nisimura { "isdn", 0x240000, C(SYS_DEV_ISDN), IOASIC_INTR_ISDN, },
81 1.1.2.1 nisimura { "dtop", 0x280000, C(SYS_DEV_DTOP), IOASIC_INTR_DTOP, },
82 1.1.2.1 nisimura { "fdc", 0x2C0000, C(SYS_DEV_FDC), IOASIC_INTR_FDC, },
83 1.1.2.1 nisimura { "asc", 0x300000, C(SYS_DEV_SCSI), IOASIC_INTR_SCSI },
84 1.1.2.1 nisimura { "(TC0)", 0x0, C(SYS_DEV_OPT0), XINE_INTR_TC_0 },
85 1.1.2.1 nisimura { "(TC1)", 0x0, C(SYS_DEV_OPT1), XINE_INTR_TC_1 },
86 1.1.2.1 nisimura };
87 1.1.2.1 nisimura int xine_builtin_ndevs = 7;
88 1.1.2.1 nisimura int xine_ioasic_ndevs = sizeof(xine_ioasic_devs)/sizeof(xine_ioasic_devs[0]);
89 1.1.2.5 nisimura #endif
90 1.1.2.1 nisimura
91 1.1.2.5 nisimura #if defined(DEC_3MIN) || defined(DEC_3MAXPLUS)
92 1.1.2.1 nisimura struct ioasic_dev kn03_ioasic_devs[] = {
93 1.1.2.1 nisimura { "lance", 0x0c0000, C(SYS_DEV_LANCE), IOASIC_INTR_LANCE, },
94 1.1.2.1 nisimura { "z8530 ", 0x100000, C(SYS_DEV_SCC0), IOASIC_INTR_SCC_0, },
95 1.1.2.1 nisimura { "z8530 ", 0x180000, C(SYS_DEV_SCC1), IOASIC_INTR_SCC_1, },
96 1.1.2.3 nisimura { "mc146818", 0x200000, C(SYS_DEV_BOGUS), KMIN_INTR_CLOCK, },
97 1.1.2.1 nisimura { "asc", 0x300000, C(SYS_DEV_SCSI), IOASIC_INTR_SCSI },
98 1.1.2.1 nisimura { "(TC0)", 0x0, C(SYS_DEV_OPT0), KN03_INTR_TC_0 },
99 1.1.2.1 nisimura { "(TC1)", 0x0, C(SYS_DEV_OPT1), KN03_INTR_TC_1 },
100 1.1.2.1 nisimura { "(TC2)", 0x0, C(SYS_DEV_OPT2), KN03_INTR_TC_2 },
101 1.1.2.1 nisimura };
102 1.1.2.1 nisimura int kn03_builtin_ndevs = 5;
103 1.1.2.1 nisimura int kn03_ioasic_ndevs = sizeof(kn03_ioasic_devs)/sizeof(kn03_ioasic_devs[0]);
104 1.1.2.5 nisimura #endif
105 1.1.2.1 nisimura
106 1.1.2.1 nisimura struct ioasic_dev *ioasic_devs;
107 1.1.2.1 nisimura int ioasic_ndevs, builtin_ndevs;
108 1.1.2.1 nisimura
109 1.1.2.1 nisimura int
110 1.1.2.1 nisimura ioasicmatch(parent, cfdata, aux)
111 1.1.2.1 nisimura struct device *parent;
112 1.1.2.1 nisimura struct cfdata *cfdata;
113 1.1.2.1 nisimura void *aux;
114 1.1.2.1 nisimura {
115 1.1.2.1 nisimura struct tc_attach_args *ta = aux;
116 1.1.2.1 nisimura
117 1.1.2.1 nisimura /* Make sure that we're looking for this type of device. */
118 1.1.2.1 nisimura if (strncmp("IOCTL ", ta->ta_modname, TC_ROM_LLEN))
119 1.1.2.1 nisimura return (0);
120 1.1.2.1 nisimura
121 1.1.2.5 nisimura if (cfdata->cf_unit > 0)
122 1.1.2.5 nisimura return (0);
123 1.1.2.5 nisimura
124 1.1.2.5 nisimura switch (systype) {
125 1.1.2.5 nisimura #if defined(DEC_MAXINE)
126 1.1.2.5 nisimura case DS_MAXINE:
127 1.1.2.1 nisimura ioasic_devs = xine_ioasic_devs;
128 1.1.2.1 nisimura ioasic_ndevs = xine_ioasic_ndevs;
129 1.1.2.1 nisimura builtin_ndevs = xine_builtin_ndevs;
130 1.1.2.5 nisimura break;
131 1.1.2.5 nisimura #endif
132 1.1.2.5 nisimura #if defined(DEC_3MIN) || defined(DS_3MAXPLUS)
133 1.1.2.5 nisimura case DS_3MIN:
134 1.1.2.5 nisimura case DS_3MAXPLUS:
135 1.1.2.1 nisimura ioasic_devs = kn03_ioasic_devs;
136 1.1.2.1 nisimura ioasic_ndevs = kn03_ioasic_ndevs;
137 1.1.2.1 nisimura builtin_ndevs = kn03_builtin_ndevs;
138 1.1.2.5 nisimura break;
139 1.1.2.5 nisimura #endif
140 1.1.2.5 nisimura default:
141 1.1.2.1 nisimura panic("ioasicmatch: how did we get here?");
142 1.1.2.5 nisimura }
143 1.1.2.1 nisimura
144 1.1.2.1 nisimura return (1);
145 1.1.2.1 nisimura }
146 1.1.2.1 nisimura
147 1.1.2.1 nisimura void
148 1.1.2.1 nisimura ioasicattach(parent, self, aux)
149 1.1.2.1 nisimura struct device *parent, *self;
150 1.1.2.1 nisimura void *aux;
151 1.1.2.1 nisimura {
152 1.1.2.1 nisimura struct ioasic_softc *sc = (struct ioasic_softc *)self;
153 1.1.2.1 nisimura struct tc_attach_args *ta = aux;
154 1.1.2.6 nisimura int i;
155 1.1.2.1 nisimura
156 1.1.2.2 nisimura sc->sc_bst = ta->ta_memt;
157 1.1.2.2 nisimura sc->sc_dmat = ta->ta_dmat;
158 1.1.2.2 nisimura if (bus_space_map(ta->ta_memt, ta->ta_addr,
159 1.1.2.5 nisimura 0x400000, 0, &sc->sc_bsh)) {
160 1.1.2.2 nisimura printf("%s: unable to map device\n", sc->sc_dv.dv_xname);
161 1.1.2.2 nisimura return;
162 1.1.2.2 nisimura }
163 1.1.2.1 nisimura sc->sc_cookie = ta->ta_cookie;
164 1.1.2.1 nisimura
165 1.1.2.2 nisimura /* XXX XXX XXX */
166 1.1.2.2 nisimura sc->sc_base = ta->ta_addr;
167 1.1.2.1 nisimura
168 1.1.2.1 nisimura printf("\n");
169 1.1.2.1 nisimura
170 1.1.2.5 nisimura #if 1 /* !!! necessary? already all-0 upon booting as documented !!! */
171 1.1.2.1 nisimura /*
172 1.1.2.1 nisimura * Turn off all device interrupt bits.
173 1.1.2.1 nisimura * (This _does_ include TC option slot bits.
174 1.1.2.1 nisimura */
175 1.1.2.1 nisimura for (i = 0; i < ioasic_ndevs; i++)
176 1.1.2.1 nisimura *(volatile u_int32_t *)(sc->sc_base + IOASIC_IMSK)
177 1.1.2.1 nisimura &= ~ioasic_devs[i].iad_intrbits;
178 1.1.2.5 nisimura tc_wmb();
179 1.1.2.1 nisimura #endif
180 1.1.2.1 nisimura
181 1.1.2.1 nisimura #if 0
182 1.1.2.5 nisimura /* XXX correct if_le_ioasic.c XXX */
183 1.1.2.1 nisimura /*
184 1.1.2.1 nisimura * Set up the LANCE DMA area.
185 1.1.2.1 nisimura */
186 1.1.2.1 nisimura ioasic_lance_dma_setup(sc);
187 1.1.2.1 nisimura #endif
188 1.1.2.1 nisimura
189 1.1.2.5 nisimura /*
190 1.1.2.5 nisimura * Try to configure each device.
191 1.1.2.5 nisimura */
192 1.1.2.7 nisimura ioasic_attach_devs(sc, ioasic_devs, builtin_ndevs);
193 1.1.2.1 nisimura }
194 1.1.2.1 nisimura
195 1.1.2.1 nisimura void
196 1.1.2.1 nisimura ioasic_intr_establish(ioa, cookie, level, func, arg)
197 1.1.2.1 nisimura struct device *ioa;
198 1.1.2.1 nisimura void *cookie, *arg;
199 1.1.2.1 nisimura tc_intrlevel_t level;
200 1.1.2.1 nisimura int (*func) __P((void *));
201 1.1.2.1 nisimura {
202 1.1.2.1 nisimura struct ioasic_softc *sc = (void *)ioasic_cd.cd_devs[0];
203 1.1.2.1 nisimura u_int dev, i, intrbits;
204 1.1.2.1 nisimura
205 1.1.2.1 nisimura dev = (u_long)cookie;
206 1.1.2.1 nisimura
207 1.1.2.1 nisimura for (i = 0; i < ioasic_ndevs; i++) {
208 1.1.2.1 nisimura if (ioasic_devs[i].iad_cookie == cookie)
209 1.1.2.5 nisimura goto found;
210 1.1.2.1 nisimura }
211 1.1.2.5 nisimura panic("ioasic_intr_establish: invalid cookie %d", dev);
212 1.1.2.5 nisimura found:
213 1.1.2.5 nisimura
214 1.1.2.5 nisimura intrtab[dev].ih_func = func;
215 1.1.2.5 nisimura intrtab[dev].ih_arg = arg;
216 1.1.2.1 nisimura
217 1.1.2.1 nisimura intrbits = ioasic_devs[i].iad_intrbits;
218 1.1.2.1 nisimura iplmask[level] |= intrbits;
219 1.1.2.1 nisimura *(volatile u_int32_t *)(sc->sc_base + IOASIC_IMSK) |= intrbits;
220 1.1.2.5 nisimura tc_wmb();
221 1.1.2.1 nisimura }
222 1.1.2.1 nisimura
223 1.1.2.1 nisimura void
224 1.1.2.1 nisimura ioasic_intr_disestablish(ioa, cookie)
225 1.1.2.1 nisimura struct device *ioa;
226 1.1.2.1 nisimura void *cookie;
227 1.1.2.1 nisimura {
228 1.1.2.1 nisimura printf("device %s with cookie %d: ", ioa->dv_xname, (int)cookie);
229 1.1.2.1 nisimura panic("ioasic_intr_disestablish called");
230 1.1.2.1 nisimura }
231 1.1.2.1 nisimura
232 1.1.2.1 nisimura char *
233 1.1.2.1 nisimura ioasic_lance_ether_address()
234 1.1.2.1 nisimura {
235 1.1.2.1 nisimura
236 1.1.2.3 nisimura return (char *)(ioasic_base + IOASIC_SLOT_2_START);
237 1.1.2.1 nisimura }
238 1.1.2.1 nisimura
239 1.1.2.1 nisimura #if 0 /* Jason's new LANCE DMA region */
240 1.1.2.1 nisimura /*
241 1.1.2.1 nisimura * DMA area for IOASIC LANCE.
242 1.1.2.1 nisimura * XXX Should be done differently, but this is better than it used to be.
243 1.1.2.1 nisimura */
244 1.1.2.5 nisimura #define LE_IOASIC_MEMSIZE (128*1024)
245 1.1.2.5 nisimura #define LE_IOASIC_MEMALIGN (128*1024)
246 1.1.2.5 nisimura caddr_t le_iomem;
247 1.1.2.1 nisimura
248 1.1.2.1 nisimura void ioasic_lance_dma_setup __P((struct ioasic_softc *));
249 1.1.2.1 nisimura
250 1.1.2.1 nisimura void
251 1.1.2.1 nisimura ioasic_lance_dma_setup(sc)
252 1.1.2.1 nisimura struct ioasic_softc *sc;
253 1.1.2.1 nisimura {
254 1.1.2.1 nisimura bus_dma_tag_t dmat = sc->sc_dmat;
255 1.1.2.1 nisimura bus_dma_segment_t seg;
256 1.1.2.2 nisimura u_int32_t csr;
257 1.1.2.1 nisimura tc_addr_t tca;
258 1.1.2.1 nisimura int rseg;
259 1.1.2.1 nisimura
260 1.1.2.1 nisimura /*
261 1.1.2.1 nisimura * Allocate a DMA area for the chip.
262 1.1.2.1 nisimura */
263 1.1.2.1 nisimura if (bus_dmamem_alloc(dmat, LE_IOASIC_MEMSIZE, LE_IOASIC_MEMALIGN,
264 1.1.2.1 nisimura 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
265 1.1.2.1 nisimura printf("%s: can't allocate DMA area for LANCE\n",
266 1.1.2.1 nisimura sc->sc_dv.dv_xname);
267 1.1.2.1 nisimura return;
268 1.1.2.1 nisimura }
269 1.1.2.1 nisimura if (bus_dmamem_map(dmat, &seg, rseg, LE_IOASIC_MEMSIZE,
270 1.1.2.1 nisimura &le_iomem, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) {
271 1.1.2.1 nisimura printf("%s: can't map DMA area for LANCE\n",
272 1.1.2.1 nisimura sc->sc_dv.dv_xname);
273 1.1.2.1 nisimura bus_dmamem_free(dmat, &seg, rseg);
274 1.1.2.1 nisimura return;
275 1.1.2.1 nisimura }
276 1.1.2.1 nisimura
277 1.1.2.1 nisimura /*
278 1.1.2.1 nisimura * Create and load the DMA map for the DMA area.
279 1.1.2.1 nisimura */
280 1.1.2.1 nisimura if (bus_dmamap_create(dmat, LE_IOASIC_MEMSIZE, 1,
281 1.1.2.1 nisimura LE_IOASIC_MEMSIZE, 0, BUS_DMA_NOWAIT, &sc->sc_lance_dmam)) {
282 1.1.2.1 nisimura printf("%s: can't create DMA map\n", sc->sc_dv.dv_xname);
283 1.1.2.1 nisimura goto bad;
284 1.1.2.1 nisimura }
285 1.1.2.1 nisimura if (bus_dmamap_load(dmat, sc->sc_lance_dmam,
286 1.1.2.1 nisimura le_iomem, LE_IOASIC_MEMSIZE, NULL, BUS_DMA_NOWAIT)) {
287 1.1.2.1 nisimura printf("%s: can't load DMA map\n", sc->sc_dv.dv_xname);
288 1.1.2.1 nisimura goto bad;
289 1.1.2.1 nisimura }
290 1.1.2.1 nisimura
291 1.1.2.1 nisimura tca = (tc_addr_t)sc->sc_lance_dmam->dm_segs[0].ds_addr;
292 1.1.2.1 nisimura if (tca != sc->sc_lance_dmam->dm_segs[0].ds_addr) {
293 1.1.2.1 nisimura printf("%s: bad LANCE DMA address\n", sc->sc_dv.dv_xname);
294 1.1.2.1 nisimura bus_dmamap_unload(dmat, sc->sc_lance_dmam);
295 1.1.2.1 nisimura goto bad;
296 1.1.2.1 nisimura }
297 1.1.2.2 nisimura bus_space_write_4(sc->sc_bst, sc->sc_bsh,
298 1.1.2.2 nisimura IOASIC_LANCE_DMAPTR,
299 1.1.2.2 nisimura ((tca << 3) & ~(tc_addr_t)0x1f) | ((tca >> 29) & 0x1f));
300 1.1.2.2 nisimura csr = bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_CSR);
301 1.1.2.2 nisimura csr |= IOASIC_CSR_DMAEN_LANCE;
302 1.1.2.2 nisimura bus_space_write_4(sc->sc_bst, sc->sc_bsh, IOASIC_CSR, csr);
303 1.1.2.1 nisimura return;
304 1.1.2.1 nisimura
305 1.1.2.1 nisimura bad:
306 1.1.2.1 nisimura bus_dmamem_unmap(dmat, le_iomem, LE_IOASIC_MEMSIZE);
307 1.1.2.1 nisimura bus_dmamem_free(dmat, &seg, rseg);
308 1.1.2.1 nisimura le_iomem = 0;
309 1.1.2.1 nisimura }
310 1.1.2.1 nisimura #else /* old NetBSD/pmax code */
311 1.1.2.1 nisimura void ioasic_lance_dma_setup __P((void *));
312 1.1.2.1 nisimura
313 1.1.2.1 nisimura void
314 1.1.2.1 nisimura ioasic_lance_dma_setup(v)
315 1.1.2.1 nisimura void *v;
316 1.1.2.1 nisimura {
317 1.1.2.1 nisimura volatile u_int32_t *ldp;
318 1.1.2.1 nisimura tc_addr_t tca;
319 1.1.2.1 nisimura
320 1.1.2.1 nisimura tca = (tc_addr_t)v;
321 1.1.2.1 nisimura
322 1.1.2.1 nisimura ldp = (volatile u_int *)IOASIC_REG_LANCE_DMAPTR(ioasic_base);
323 1.1.2.1 nisimura *ldp = ((tca << 3) & ~(tc_addr_t)0x1f) | ((tca >> 29) & 0x1f);
324 1.1.2.1 nisimura tc_wmb();
325 1.1.2.1 nisimura
326 1.1.2.1 nisimura *(volatile u_int32_t *)IOASIC_REG_CSR(ioasic_base) |=
327 1.1.2.1 nisimura IOASIC_CSR_DMAEN_LANCE;
328 1.1.2.5 nisimura tc_wmb();
329 1.1.2.1 nisimura }
330 1.1.2.1 nisimura #endif
331 1.1.2.1 nisimura
332 1.1.2.1 nisimura /*
333 1.1.2.1 nisimura * spl(9) for IOASIC DECstations
334 1.1.2.1 nisimura */
335 1.1.2.1 nisimura
336 1.1.2.1 nisimura int _splraise_ioasic __P((int));
337 1.1.2.1 nisimura int _spllower_ioasic __P((int));
338 1.1.2.1 nisimura int _splx_ioasic __P((int));
339 1.1.2.1 nisimura
340 1.1.2.1 nisimura int
341 1.1.2.1 nisimura _splraise_ioasic(lvl)
342 1.1.2.1 nisimura int lvl;
343 1.1.2.1 nisimura {
344 1.1.2.1 nisimura u_int32_t new;
345 1.1.2.1 nisimura
346 1.1.2.1 nisimura new = oldiplmask[lvl] = *(u_int32_t *)(ioasic_base + IOASIC_IMSK);
347 1.1.2.1 nisimura new &= ~iplmask[lvl];
348 1.1.2.1 nisimura *(u_int32_t *)(ioasic_base + IOASIC_IMSK) = new;
349 1.1.2.1 nisimura tc_wmb();
350 1.1.2.1 nisimura return lvl | _splraise(MIPS_SOFT_INT_MASK_0|MIPS_SOFT_INT_MASK_1);
351 1.1.2.1 nisimura }
352 1.1.2.1 nisimura
353 1.1.2.1 nisimura int
354 1.1.2.1 nisimura _spllower_ioasic(mask)
355 1.1.2.1 nisimura {
356 1.1.2.1 nisimura int s;
357 1.1.2.1 nisimura
358 1.1.2.1 nisimura s = IPL_NONE | _spllower(mask);
359 1.1.2.5 nisimura oldiplmask[IPL_NONE] = *(u_int32_t *)(ioasic_base + IOASIC_IMSK);
360 1.1.2.1 nisimura *(u_int32_t *)(ioasic_base + IOASIC_IMSK) = iplmask[IPL_HIGH];
361 1.1.2.1 nisimura tc_wmb();
362 1.1.2.1 nisimura return s;
363 1.1.2.1 nisimura }
364 1.1.2.1 nisimura
365 1.1.2.1 nisimura int
366 1.1.2.1 nisimura _splx_ioasic(lvl)
367 1.1.2.1 nisimura int lvl;
368 1.1.2.1 nisimura {
369 1.1.2.1 nisimura (void)_splset(lvl & MIPS_INT_MASK);
370 1.1.2.1 nisimura if (lvl & 0xff) {
371 1.1.2.1 nisimura *(u_int32_t *)(ioasic_base + IOASIC_IMSK) =
372 1.1.2.1 nisimura oldiplmask[lvl & 0xff];
373 1.1.2.1 nisimura tc_wmb();
374 1.1.2.1 nisimura }
375 1.1.2.1 nisimura return 0;
376 1.1.2.1 nisimura }
377