ioasic.c revision 1.1.2.10 1 1.1.2.10 nisimura /* $NetBSD: ioasic.c,v 1.1.2.10 1999/05/11 06:43:14 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.10 nisimura __KERNEL_RCSID(0, "$NetBSD: ioasic.c,v 1.1.2.10 1999/05/11 06:43:14 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.10 nisimura #define XINE_INTR_FDC 0x00000090
62 1.1.2.10 nisimura #define XINE_INTR_VINT 0x00000008
63 1.1.2.10 nisimura #define XINE_INTR_DTOP 0x00000001
64 1.1.2.5 nisimura #define XINE_INTR_TC_0 0x00001000
65 1.1.2.5 nisimura #define XINE_INTR_TC_1 0x00000020
66 1.1.2.5 nisimura #define KN03_INTR_TC_0 0x00000800
67 1.1.2.5 nisimura #define KN03_INTR_TC_1 0x00001000
68 1.1.2.5 nisimura #define KN03_INTR_TC_2 0x00002000
69 1.1.2.5 nisimura #define KMIN_INTR_CLOCK 0x00000020
70 1.1.2.1 nisimura
71 1.1.2.1 nisimura extern u_int32_t iplmask[], oldiplmask[];
72 1.1.2.1 nisimura /* XXX XXX XXX */
73 1.1.2.1 nisimura
74 1.1.2.5 nisimura #define C(x) (void *)(x)
75 1.1.2.1 nisimura
76 1.1.2.5 nisimura #if defined(DEC_MAXINE)
77 1.1.2.1 nisimura struct ioasic_dev xine_ioasic_devs[] = {
78 1.1.2.1 nisimura { "lance", 0x0c0000, C(SYS_DEV_LANCE), IOASIC_INTR_LANCE, },
79 1.1.2.1 nisimura { "z8530 ", 0x100000, C(SYS_DEV_SCC0), IOASIC_INTR_SCC_0, },
80 1.1.2.5 nisimura { "mc146818", 0x200000, C(SYS_DEV_BOGUS), 0, },
81 1.1.2.1 nisimura { "isdn", 0x240000, C(SYS_DEV_ISDN), IOASIC_INTR_ISDN, },
82 1.1.2.10 nisimura { "dtop", 0x280000, C(SYS_DEV_DTOP), XINE_INTR_DTOP, },
83 1.1.2.10 nisimura { "fdc", 0x2C0000, C(SYS_DEV_FDC), XINE_INTR_FDC, },
84 1.1.2.1 nisimura { "asc", 0x300000, C(SYS_DEV_SCSI), IOASIC_INTR_SCSI },
85 1.1.2.1 nisimura { "(TC0)", 0x0, C(SYS_DEV_OPT0), XINE_INTR_TC_0 },
86 1.1.2.1 nisimura { "(TC1)", 0x0, C(SYS_DEV_OPT1), XINE_INTR_TC_1 },
87 1.1.2.10 nisimura { "(TC2)", 0x0, C(SYS_DEV_OPT2), XINE_INTR_VINT },
88 1.1.2.1 nisimura };
89 1.1.2.1 nisimura int xine_builtin_ndevs = 7;
90 1.1.2.1 nisimura int xine_ioasic_ndevs = sizeof(xine_ioasic_devs)/sizeof(xine_ioasic_devs[0]);
91 1.1.2.5 nisimura #endif
92 1.1.2.1 nisimura
93 1.1.2.5 nisimura #if defined(DEC_3MIN) || defined(DEC_3MAXPLUS)
94 1.1.2.1 nisimura struct ioasic_dev kn03_ioasic_devs[] = {
95 1.1.2.1 nisimura { "lance", 0x0c0000, C(SYS_DEV_LANCE), IOASIC_INTR_LANCE, },
96 1.1.2.1 nisimura { "z8530 ", 0x100000, C(SYS_DEV_SCC0), IOASIC_INTR_SCC_0, },
97 1.1.2.1 nisimura { "z8530 ", 0x180000, C(SYS_DEV_SCC1), IOASIC_INTR_SCC_1, },
98 1.1.2.3 nisimura { "mc146818", 0x200000, C(SYS_DEV_BOGUS), KMIN_INTR_CLOCK, },
99 1.1.2.1 nisimura { "asc", 0x300000, C(SYS_DEV_SCSI), IOASIC_INTR_SCSI },
100 1.1.2.1 nisimura { "(TC0)", 0x0, C(SYS_DEV_OPT0), KN03_INTR_TC_0 },
101 1.1.2.1 nisimura { "(TC1)", 0x0, C(SYS_DEV_OPT1), KN03_INTR_TC_1 },
102 1.1.2.1 nisimura { "(TC2)", 0x0, C(SYS_DEV_OPT2), KN03_INTR_TC_2 },
103 1.1.2.1 nisimura };
104 1.1.2.1 nisimura int kn03_builtin_ndevs = 5;
105 1.1.2.1 nisimura int kn03_ioasic_ndevs = sizeof(kn03_ioasic_devs)/sizeof(kn03_ioasic_devs[0]);
106 1.1.2.5 nisimura #endif
107 1.1.2.1 nisimura
108 1.1.2.1 nisimura struct ioasic_dev *ioasic_devs;
109 1.1.2.1 nisimura int ioasic_ndevs, builtin_ndevs;
110 1.1.2.1 nisimura
111 1.1.2.1 nisimura int
112 1.1.2.1 nisimura ioasicmatch(parent, cfdata, aux)
113 1.1.2.1 nisimura struct device *parent;
114 1.1.2.1 nisimura struct cfdata *cfdata;
115 1.1.2.1 nisimura void *aux;
116 1.1.2.1 nisimura {
117 1.1.2.1 nisimura struct tc_attach_args *ta = aux;
118 1.1.2.1 nisimura
119 1.1.2.1 nisimura /* Make sure that we're looking for this type of device. */
120 1.1.2.1 nisimura if (strncmp("IOCTL ", ta->ta_modname, TC_ROM_LLEN))
121 1.1.2.1 nisimura return (0);
122 1.1.2.1 nisimura
123 1.1.2.5 nisimura if (cfdata->cf_unit > 0)
124 1.1.2.5 nisimura return (0);
125 1.1.2.5 nisimura
126 1.1.2.5 nisimura switch (systype) {
127 1.1.2.5 nisimura #if defined(DEC_MAXINE)
128 1.1.2.5 nisimura case DS_MAXINE:
129 1.1.2.1 nisimura ioasic_devs = xine_ioasic_devs;
130 1.1.2.1 nisimura ioasic_ndevs = xine_ioasic_ndevs;
131 1.1.2.1 nisimura builtin_ndevs = xine_builtin_ndevs;
132 1.1.2.5 nisimura break;
133 1.1.2.5 nisimura #endif
134 1.1.2.8 nisimura #if defined(DEC_3MIN) || defined(DEC_3MAXPLUS)
135 1.1.2.5 nisimura case DS_3MIN:
136 1.1.2.5 nisimura case DS_3MAXPLUS:
137 1.1.2.1 nisimura ioasic_devs = kn03_ioasic_devs;
138 1.1.2.1 nisimura ioasic_ndevs = kn03_ioasic_ndevs;
139 1.1.2.1 nisimura builtin_ndevs = kn03_builtin_ndevs;
140 1.1.2.5 nisimura break;
141 1.1.2.5 nisimura #endif
142 1.1.2.5 nisimura default:
143 1.1.2.1 nisimura panic("ioasicmatch: how did we get here?");
144 1.1.2.5 nisimura }
145 1.1.2.1 nisimura
146 1.1.2.1 nisimura return (1);
147 1.1.2.1 nisimura }
148 1.1.2.1 nisimura
149 1.1.2.1 nisimura void
150 1.1.2.1 nisimura ioasicattach(parent, self, aux)
151 1.1.2.1 nisimura struct device *parent, *self;
152 1.1.2.1 nisimura void *aux;
153 1.1.2.1 nisimura {
154 1.1.2.1 nisimura struct ioasic_softc *sc = (struct ioasic_softc *)self;
155 1.1.2.1 nisimura struct tc_attach_args *ta = aux;
156 1.1.2.9 nisimura int i, imsk;
157 1.1.2.1 nisimura
158 1.1.2.2 nisimura sc->sc_bst = ta->ta_memt;
159 1.1.2.2 nisimura if (bus_space_map(ta->ta_memt, ta->ta_addr,
160 1.1.2.5 nisimura 0x400000, 0, &sc->sc_bsh)) {
161 1.1.2.2 nisimura printf("%s: unable to map device\n", sc->sc_dv.dv_xname);
162 1.1.2.2 nisimura return;
163 1.1.2.2 nisimura }
164 1.1.2.10 nisimura sc->sc_dmat = ta->ta_dmat;
165 1.1.2.1 nisimura sc->sc_cookie = ta->ta_cookie;
166 1.1.2.1 nisimura
167 1.1.2.9 nisimura sc->sc_base = ta->ta_addr; /* XXX XXX XXX */
168 1.1.2.1 nisimura
169 1.1.2.1 nisimura printf("\n");
170 1.1.2.1 nisimura
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.9 nisimura imsk = bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK);
176 1.1.2.1 nisimura for (i = 0; i < ioasic_ndevs; i++)
177 1.1.2.9 nisimura imsk &= ~ioasic_devs[i].iad_intrbits;
178 1.1.2.9 nisimura bus_space_write_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK, imsk);
179 1.1.2.1 nisimura
180 1.1.2.1 nisimura #if 0
181 1.1.2.10 nisimura (void)ioasic_lance_dma_setup(sc);
182 1.1.2.1 nisimura #endif
183 1.1.2.1 nisimura
184 1.1.2.5 nisimura /*
185 1.1.2.5 nisimura * Try to configure each device.
186 1.1.2.5 nisimura */
187 1.1.2.7 nisimura ioasic_attach_devs(sc, ioasic_devs, builtin_ndevs);
188 1.1.2.1 nisimura }
189 1.1.2.1 nisimura
190 1.1.2.1 nisimura void
191 1.1.2.1 nisimura ioasic_intr_establish(ioa, cookie, level, func, arg)
192 1.1.2.1 nisimura struct device *ioa;
193 1.1.2.1 nisimura void *cookie, *arg;
194 1.1.2.1 nisimura tc_intrlevel_t level;
195 1.1.2.1 nisimura int (*func) __P((void *));
196 1.1.2.1 nisimura {
197 1.1.2.1 nisimura struct ioasic_softc *sc = (void *)ioasic_cd.cd_devs[0];
198 1.1.2.10 nisimura int i, intrbits;
199 1.1.2.1 nisimura
200 1.1.2.1 nisimura for (i = 0; i < ioasic_ndevs; i++) {
201 1.1.2.1 nisimura if (ioasic_devs[i].iad_cookie == cookie)
202 1.1.2.5 nisimura goto found;
203 1.1.2.1 nisimura }
204 1.1.2.9 nisimura panic("ioasic_intr_establish: invalid cookie %d", (int)cookie);
205 1.1.2.5 nisimura found:
206 1.1.2.5 nisimura
207 1.1.2.9 nisimura intrtab[(int)cookie].ih_func = func;
208 1.1.2.9 nisimura intrtab[(int)cookie].ih_arg = arg;
209 1.1.2.1 nisimura
210 1.1.2.1 nisimura intrbits = ioasic_devs[i].iad_intrbits;
211 1.1.2.10 nisimura i = bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK);
212 1.1.2.10 nisimura i |= intrbits;
213 1.1.2.10 nisimura bus_space_write_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK, i);
214 1.1.2.1 nisimura iplmask[level] |= intrbits;
215 1.1.2.1 nisimura }
216 1.1.2.1 nisimura
217 1.1.2.1 nisimura void
218 1.1.2.1 nisimura ioasic_intr_disestablish(ioa, cookie)
219 1.1.2.1 nisimura struct device *ioa;
220 1.1.2.1 nisimura void *cookie;
221 1.1.2.1 nisimura {
222 1.1.2.1 nisimura printf("device %s with cookie %d: ", ioa->dv_xname, (int)cookie);
223 1.1.2.1 nisimura panic("ioasic_intr_disestablish called");
224 1.1.2.1 nisimura }
225 1.1.2.1 nisimura
226 1.1.2.1 nisimura char *
227 1.1.2.1 nisimura ioasic_lance_ether_address()
228 1.1.2.1 nisimura {
229 1.1.2.1 nisimura
230 1.1.2.3 nisimura return (char *)(ioasic_base + IOASIC_SLOT_2_START);
231 1.1.2.1 nisimura }
232 1.1.2.1 nisimura
233 1.1.2.1 nisimura #if 0 /* Jason's new LANCE DMA region */
234 1.1.2.1 nisimura /*
235 1.1.2.1 nisimura * DMA area for IOASIC LANCE.
236 1.1.2.1 nisimura * XXX Should be done differently, but this is better than it used to be.
237 1.1.2.1 nisimura */
238 1.1.2.5 nisimura #define LE_IOASIC_MEMSIZE (128*1024)
239 1.1.2.5 nisimura #define LE_IOASIC_MEMALIGN (128*1024)
240 1.1.2.5 nisimura caddr_t le_iomem;
241 1.1.2.1 nisimura
242 1.1.2.10 nisimura int
243 1.1.2.1 nisimura ioasic_lance_dma_setup(sc)
244 1.1.2.1 nisimura struct ioasic_softc *sc;
245 1.1.2.1 nisimura {
246 1.1.2.1 nisimura bus_dma_tag_t dmat = sc->sc_dmat;
247 1.1.2.10 nisimura bus_dmamap_t le_dmam;
248 1.1.2.1 nisimura bus_dma_segment_t seg;
249 1.1.2.10 nisimura caddr_t le_mem;
250 1.1.2.2 nisimura u_int32_t csr;
251 1.1.2.1 nisimura tc_addr_t tca;
252 1.1.2.1 nisimura int rseg;
253 1.1.2.1 nisimura
254 1.1.2.1 nisimura /*
255 1.1.2.1 nisimura * Allocate a DMA area for the chip.
256 1.1.2.1 nisimura */
257 1.1.2.1 nisimura if (bus_dmamem_alloc(dmat, LE_IOASIC_MEMSIZE, LE_IOASIC_MEMALIGN,
258 1.1.2.1 nisimura 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
259 1.1.2.1 nisimura printf("%s: can't allocate DMA area for LANCE\n",
260 1.1.2.1 nisimura sc->sc_dv.dv_xname);
261 1.1.2.10 nisimura return 0;
262 1.1.2.1 nisimura }
263 1.1.2.1 nisimura if (bus_dmamem_map(dmat, &seg, rseg, LE_IOASIC_MEMSIZE,
264 1.1.2.10 nisimura &le_mem, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) {
265 1.1.2.1 nisimura printf("%s: can't map DMA area for LANCE\n",
266 1.1.2.1 nisimura sc->sc_dv.dv_xname);
267 1.1.2.1 nisimura bus_dmamem_free(dmat, &seg, rseg);
268 1.1.2.10 nisimura return 0;
269 1.1.2.1 nisimura }
270 1.1.2.1 nisimura
271 1.1.2.1 nisimura /*
272 1.1.2.1 nisimura * Create and load the DMA map for the DMA area.
273 1.1.2.1 nisimura */
274 1.1.2.1 nisimura if (bus_dmamap_create(dmat, LE_IOASIC_MEMSIZE, 1,
275 1.1.2.10 nisimura LE_IOASIC_MEMSIZE, 0, BUS_DMA_NOWAIT, &le_dmam)) {
276 1.1.2.1 nisimura printf("%s: can't create DMA map\n", sc->sc_dv.dv_xname);
277 1.1.2.1 nisimura goto bad;
278 1.1.2.1 nisimura }
279 1.1.2.10 nisimura if (bus_dmamap_load(dmat, le_dmam,
280 1.1.2.10 nisimura &le_iomem, LE_IOASIC_MEMSIZE, NULL, BUS_DMA_NOWAIT)) {
281 1.1.2.1 nisimura printf("%s: can't load DMA map\n", sc->sc_dv.dv_xname);
282 1.1.2.1 nisimura goto bad;
283 1.1.2.1 nisimura }
284 1.1.2.10 nisimura tca = (tc_addr_t)le_dmam->dm_segs[0].ds_addr;
285 1.1.2.10 nisimura #if 0
286 1.1.2.10 nisimura if (tca != le_dmam->dm_segs[0].ds_addr) {
287 1.1.2.1 nisimura printf("%s: bad LANCE DMA address\n", sc->sc_dv.dv_xname);
288 1.1.2.10 nisimura bus_dmamap_unload(dmat, le_dmam);
289 1.1.2.1 nisimura goto bad;
290 1.1.2.1 nisimura }
291 1.1.2.10 nisimura #endif
292 1.1.2.2 nisimura bus_space_write_4(sc->sc_bst, sc->sc_bsh,
293 1.1.2.2 nisimura IOASIC_LANCE_DMAPTR,
294 1.1.2.2 nisimura ((tca << 3) & ~(tc_addr_t)0x1f) | ((tca >> 29) & 0x1f));
295 1.1.2.2 nisimura csr = bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_CSR);
296 1.1.2.2 nisimura csr |= IOASIC_CSR_DMAEN_LANCE;
297 1.1.2.2 nisimura bus_space_write_4(sc->sc_bst, sc->sc_bsh, IOASIC_CSR, csr);
298 1.1.2.10 nisimura return tca;
299 1.1.2.1 nisimura
300 1.1.2.1 nisimura bad:
301 1.1.2.1 nisimura bus_dmamem_unmap(dmat, le_iomem, LE_IOASIC_MEMSIZE);
302 1.1.2.1 nisimura bus_dmamem_free(dmat, &seg, rseg);
303 1.1.2.10 nisimura return tca;
304 1.1.2.1 nisimura }
305 1.1.2.1 nisimura #else /* old NetBSD/pmax code */
306 1.1.2.1 nisimura void ioasic_lance_dma_setup __P((void *));
307 1.1.2.1 nisimura
308 1.1.2.1 nisimura void
309 1.1.2.1 nisimura ioasic_lance_dma_setup(v)
310 1.1.2.1 nisimura void *v;
311 1.1.2.1 nisimura {
312 1.1.2.1 nisimura volatile u_int32_t *ldp;
313 1.1.2.1 nisimura tc_addr_t tca;
314 1.1.2.1 nisimura
315 1.1.2.1 nisimura tca = (tc_addr_t)v;
316 1.1.2.1 nisimura
317 1.1.2.1 nisimura ldp = (volatile u_int *)IOASIC_REG_LANCE_DMAPTR(ioasic_base);
318 1.1.2.1 nisimura *ldp = ((tca << 3) & ~(tc_addr_t)0x1f) | ((tca >> 29) & 0x1f);
319 1.1.2.1 nisimura tc_wmb();
320 1.1.2.1 nisimura
321 1.1.2.1 nisimura *(volatile u_int32_t *)IOASIC_REG_CSR(ioasic_base) |=
322 1.1.2.1 nisimura IOASIC_CSR_DMAEN_LANCE;
323 1.1.2.5 nisimura tc_wmb();
324 1.1.2.1 nisimura }
325 1.1.2.1 nisimura #endif
326 1.1.2.1 nisimura
327 1.1.2.1 nisimura /*
328 1.1.2.1 nisimura * spl(9) for IOASIC DECstations
329 1.1.2.1 nisimura */
330 1.1.2.1 nisimura
331 1.1.2.1 nisimura int _splraise_ioasic __P((int));
332 1.1.2.1 nisimura int _spllower_ioasic __P((int));
333 1.1.2.1 nisimura int _splx_ioasic __P((int));
334 1.1.2.1 nisimura
335 1.1.2.1 nisimura int
336 1.1.2.1 nisimura _splraise_ioasic(lvl)
337 1.1.2.1 nisimura int lvl;
338 1.1.2.1 nisimura {
339 1.1.2.1 nisimura u_int32_t new;
340 1.1.2.1 nisimura
341 1.1.2.1 nisimura new = oldiplmask[lvl] = *(u_int32_t *)(ioasic_base + IOASIC_IMSK);
342 1.1.2.1 nisimura new &= ~iplmask[lvl];
343 1.1.2.1 nisimura *(u_int32_t *)(ioasic_base + IOASIC_IMSK) = new;
344 1.1.2.1 nisimura tc_wmb();
345 1.1.2.1 nisimura return lvl | _splraise(MIPS_SOFT_INT_MASK_0|MIPS_SOFT_INT_MASK_1);
346 1.1.2.1 nisimura }
347 1.1.2.1 nisimura
348 1.1.2.1 nisimura int
349 1.1.2.1 nisimura _spllower_ioasic(mask)
350 1.1.2.1 nisimura {
351 1.1.2.1 nisimura int s;
352 1.1.2.1 nisimura
353 1.1.2.1 nisimura s = IPL_NONE | _spllower(mask);
354 1.1.2.5 nisimura oldiplmask[IPL_NONE] = *(u_int32_t *)(ioasic_base + IOASIC_IMSK);
355 1.1.2.1 nisimura *(u_int32_t *)(ioasic_base + IOASIC_IMSK) = iplmask[IPL_HIGH];
356 1.1.2.1 nisimura tc_wmb();
357 1.1.2.1 nisimura return s;
358 1.1.2.1 nisimura }
359 1.1.2.1 nisimura
360 1.1.2.1 nisimura int
361 1.1.2.1 nisimura _splx_ioasic(lvl)
362 1.1.2.1 nisimura int lvl;
363 1.1.2.1 nisimura {
364 1.1.2.1 nisimura (void)_splset(lvl & MIPS_INT_MASK);
365 1.1.2.1 nisimura if (lvl & 0xff) {
366 1.1.2.1 nisimura *(u_int32_t *)(ioasic_base + IOASIC_IMSK) =
367 1.1.2.1 nisimura oldiplmask[lvl & 0xff];
368 1.1.2.1 nisimura tc_wmb();
369 1.1.2.1 nisimura }
370 1.1.2.1 nisimura return 0;
371 1.1.2.1 nisimura }
372