ioasic.c revision 1.13 1 1.13 cgd /* $NetBSD: ioasic.c,v 1.13 2000/06/04 19:14:55 cgd Exp $ */
2 1.2 nisimura
3 1.2 nisimura /*
4 1.2 nisimura * Copyright (c) 1994, 1995 Carnegie-Mellon University.
5 1.2 nisimura * All rights reserved.
6 1.2 nisimura *
7 1.2 nisimura * Author: Keith Bostic, Chris G. Demetriou, Jonathan Stone
8 1.2 nisimura *
9 1.2 nisimura * Permission to use, copy, modify and distribute this software and
10 1.2 nisimura * its documentation is hereby granted, provided that both the copyright
11 1.2 nisimura * notice and this permission notice appear in all copies of the
12 1.2 nisimura * software, derivative works or modified versions, and any portions
13 1.2 nisimura * thereof, and that both notices appear in supporting documentation.
14 1.2 nisimura *
15 1.2 nisimura * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16 1.2 nisimura * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
17 1.2 nisimura * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18 1.2 nisimura *
19 1.2 nisimura * Carnegie Mellon requests users of this software to return to
20 1.2 nisimura *
21 1.2 nisimura * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
22 1.2 nisimura * School of Computer Science
23 1.2 nisimura * Carnegie Mellon University
24 1.2 nisimura * Pittsburgh PA 15213-3890
25 1.2 nisimura *
26 1.2 nisimura * any improvements or extensions that they make and grant Carnegie the
27 1.2 nisimura * rights to redistribute these changes.
28 1.2 nisimura */
29 1.5 ad
30 1.5 ad #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
31 1.13 cgd __KERNEL_RCSID(0, "$NetBSD: ioasic.c,v 1.13 2000/06/04 19:14:55 cgd Exp $");
32 1.2 nisimura
33 1.2 nisimura #include <sys/param.h>
34 1.2 nisimura #include <sys/systm.h>
35 1.2 nisimura #include <sys/device.h>
36 1.2 nisimura
37 1.2 nisimura #include <dev/tc/tcvar.h>
38 1.10 nisimura #include <dev/tc/ioasicreg.h>
39 1.2 nisimura #include <dev/tc/ioasicvar.h>
40 1.2 nisimura
41 1.8 simonb #include <machine/sysconf.h>
42 1.8 simonb
43 1.2 nisimura #include <pmax/pmax/pmaxtype.h>
44 1.2 nisimura #include <pmax/pmax/kmin.h>
45 1.2 nisimura #include <pmax/pmax/maxine.h>
46 1.2 nisimura #include <pmax/pmax/kn03.h>
47 1.2 nisimura
48 1.2 nisimura #include "opt_dec_3min.h"
49 1.2 nisimura #include "opt_dec_maxine.h"
50 1.2 nisimura #include "opt_dec_3maxplus.h"
51 1.2 nisimura
52 1.2 nisimura #define ARRAY_SIZEOF(x) (sizeof((x)) / sizeof((x)[0]))
53 1.2 nisimura
54 1.2 nisimura #if defined(DEC_3MIN)
55 1.2 nisimura static struct ioasic_dev kmin_ioasic_devs[] = {
56 1.11 nisimura { "lance", 0x0C0000, C(SYS_DEV_LANCE), IOASIC_INTR_LANCE, },
57 1.11 nisimura { "scc", 0x100000, C(SYS_DEV_SCC0), IOASIC_INTR_SCC_0, },
58 1.11 nisimura { "scc", 0x180000, C(SYS_DEV_SCC1), IOASIC_INTR_SCC_1, },
59 1.11 nisimura { "mc146818", 0x200000, C(SYS_DEV_BOGUS), 0 },
60 1.11 nisimura { "asc", 0x300000, C(SYS_DEV_SCSI), IOASIC_INTR_SCSI, },
61 1.2 nisimura };
62 1.2 nisimura static int kmin_builtin_ndevs = ARRAY_SIZEOF(kmin_ioasic_devs);
63 1.2 nisimura static int kmin_ioasic_ndevs = ARRAY_SIZEOF(kmin_ioasic_devs);
64 1.2 nisimura #endif
65 1.2 nisimura
66 1.2 nisimura #if defined(DEC_MAXINE)
67 1.2 nisimura static struct ioasic_dev xine_ioasic_devs[] = {
68 1.11 nisimura { "lance", 0x0C0000, C(SYS_DEV_LANCE), IOASIC_INTR_LANCE },
69 1.11 nisimura { "scc", 0x100000, C(SYS_DEV_SCC0), IOASIC_INTR_SCC_0 },
70 1.11 nisimura { "mc146818", 0x200000, C(SYS_DEV_BOGUS), 0 },
71 1.11 nisimura { "isdn", 0x240000, C(SYS_DEV_ISDN), XINE_INTR_ISDN, },
72 1.11 nisimura { "dtop", 0x280000, C(SYS_DEV_DTOP), XINE_INTR_DTOP, },
73 1.11 nisimura { "fdc", 0x2C0000, C(SYS_DEV_FDC), 0 },
74 1.11 nisimura { "asc", 0x300000, C(SYS_DEV_SCSI), IOASIC_INTR_SCSI, },
75 1.11 nisimura { "(TC0)", 0x0, C(SYS_DEV_OPT0), XINE_INTR_TC_0, },
76 1.11 nisimura { "(TC1)", 0x0, C(SYS_DEV_OPT1), XINE_INTR_TC_1, },
77 1.11 nisimura { "(TC2)", 0x0, C(SYS_DEV_OPT2), XINE_INTR_VINT, },
78 1.2 nisimura };
79 1.2 nisimura static int xine_builtin_ndevs = ARRAY_SIZEOF(xine_ioasic_devs) - 3;
80 1.2 nisimura static int xine_ioasic_ndevs = ARRAY_SIZEOF(xine_ioasic_devs);
81 1.2 nisimura #endif
82 1.2 nisimura
83 1.2 nisimura #if defined(DEC_3MAXPLUS)
84 1.2 nisimura static struct ioasic_dev kn03_ioasic_devs[] = {
85 1.11 nisimura { "lance", 0x0C0000, C(SYS_DEV_LANCE), IOASIC_INTR_LANCE, },
86 1.11 nisimura { "z8530 ", 0x100000, C(SYS_DEV_SCC0), IOASIC_INTR_SCC_0, },
87 1.11 nisimura { "z8530 ", 0x180000, C(SYS_DEV_SCC1), IOASIC_INTR_SCC_1, },
88 1.11 nisimura { "mc146818", 0x200000, C(SYS_DEV_BOGUS), 0, },
89 1.11 nisimura { "asc", 0x300000, C(SYS_DEV_SCSI), IOASIC_INTR_SCSI, },
90 1.11 nisimura { "(TC0)", 0x0, C(SYS_DEV_OPT0), KN03_INTR_TC_0, },
91 1.11 nisimura { "(TC1)", 0x0, C(SYS_DEV_OPT1), KN03_INTR_TC_1, },
92 1.11 nisimura { "(TC2)", 0x0, C(SYS_DEV_OPT2), KN03_INTR_TC_2, },
93 1.2 nisimura };
94 1.2 nisimura static int kn03_builtin_ndevs = ARRAY_SIZEOF(kn03_ioasic_devs) - 3;
95 1.2 nisimura static int kn03_ioasic_ndevs = ARRAY_SIZEOF(kn03_ioasic_devs);
96 1.2 nisimura #endif
97 1.2 nisimura
98 1.4 simonb static int ioasicmatch __P((struct device *, struct cfdata *, void *));
99 1.4 simonb static void ioasicattach __P((struct device *, struct device *, void *));
100 1.2 nisimura
101 1.2 nisimura const struct cfattach ioasic_ca = {
102 1.2 nisimura sizeof(struct ioasic_softc), ioasicmatch, ioasicattach
103 1.2 nisimura };
104 1.2 nisimura
105 1.9 nisimura tc_addr_t ioasic_base; /* XXX XXX XXX */
106 1.9 nisimura
107 1.9 nisimura /* There can be only one. */
108 1.9 nisimura int ioasicfound;
109 1.2 nisimura
110 1.2 nisimura static int
111 1.2 nisimura ioasicmatch(parent, cfdata, aux)
112 1.2 nisimura struct device *parent;
113 1.2 nisimura struct cfdata *cfdata;
114 1.2 nisimura void *aux;
115 1.2 nisimura {
116 1.2 nisimura struct tc_attach_args *ta = aux;
117 1.2 nisimura
118 1.2 nisimura /* Make sure that we're looking for this type of device. */
119 1.2 nisimura if (strncmp("IOCTL ", ta->ta_modname, TC_ROM_LLEN))
120 1.2 nisimura return (0);
121 1.2 nisimura
122 1.9 nisimura if (ioasicfound)
123 1.2 nisimura return (0);
124 1.2 nisimura
125 1.2 nisimura return (1);
126 1.2 nisimura }
127 1.2 nisimura
128 1.2 nisimura static void
129 1.2 nisimura ioasicattach(parent, self, aux)
130 1.2 nisimura struct device *parent, *self;
131 1.2 nisimura void *aux;
132 1.2 nisimura {
133 1.2 nisimura struct ioasic_softc *sc = (struct ioasic_softc *)self;
134 1.2 nisimura struct tc_attach_args *ta = aux;
135 1.2 nisimura struct ioasic_dev *ioasic_devs;
136 1.2 nisimura int ioasic_ndevs, builtin_ndevs;
137 1.2 nisimura int i, imsk;
138 1.9 nisimura
139 1.9 nisimura ioasicfound = 1;
140 1.2 nisimura
141 1.2 nisimura sc->sc_bst = ta->ta_memt;
142 1.2 nisimura if (bus_space_map(ta->ta_memt, ta->ta_addr,
143 1.2 nisimura 0x400000, 0, &sc->sc_bsh)) {
144 1.2 nisimura printf("%s: unable to map device\n", sc->sc_dv.dv_xname);
145 1.2 nisimura return;
146 1.2 nisimura }
147 1.2 nisimura sc->sc_dmat = ta->ta_dmat;
148 1.2 nisimura
149 1.2 nisimura sc->sc_base = ta->ta_addr; /* XXX XXX XXX */
150 1.2 nisimura
151 1.2 nisimura printf("\n");
152 1.2 nisimura
153 1.2 nisimura switch (systype) {
154 1.2 nisimura #if defined(DEC_3MIN)
155 1.2 nisimura case DS_3MIN:
156 1.2 nisimura ioasic_devs = kmin_ioasic_devs;
157 1.2 nisimura ioasic_ndevs = kmin_ioasic_ndevs;
158 1.2 nisimura builtin_ndevs = kmin_builtin_ndevs;
159 1.2 nisimura break;
160 1.2 nisimura #endif
161 1.2 nisimura #if defined(DEC_MAXINE)
162 1.2 nisimura case DS_MAXINE:
163 1.2 nisimura ioasic_devs = xine_ioasic_devs;
164 1.2 nisimura ioasic_ndevs = xine_ioasic_ndevs;
165 1.2 nisimura builtin_ndevs = xine_builtin_ndevs;
166 1.2 nisimura break;
167 1.2 nisimura #endif
168 1.2 nisimura #if defined(DEC_3MAXPLUS)
169 1.2 nisimura case DS_3MAXPLUS:
170 1.2 nisimura ioasic_devs = kn03_ioasic_devs;
171 1.2 nisimura ioasic_ndevs = kn03_ioasic_ndevs;
172 1.2 nisimura builtin_ndevs = kn03_builtin_ndevs;
173 1.2 nisimura break;
174 1.2 nisimura #endif
175 1.2 nisimura default:
176 1.2 nisimura panic("ioasicmatch: how did we get here?");
177 1.2 nisimura }
178 1.2 nisimura
179 1.2 nisimura /*
180 1.2 nisimura * Turn off all device interrupt bits.
181 1.2 nisimura * (This _does_ include TC option slot bits.
182 1.2 nisimura */
183 1.2 nisimura imsk = bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK);
184 1.2 nisimura for (i = 0; i < ioasic_ndevs; i++)
185 1.2 nisimura imsk &= ~ioasic_devs[i].iad_intrbits;
186 1.2 nisimura bus_space_write_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK, imsk);
187 1.2 nisimura
188 1.2 nisimura /*
189 1.2 nisimura * Try to configure each device.
190 1.2 nisimura */
191 1.2 nisimura ioasic_attach_devs(sc, ioasic_devs, builtin_ndevs);
192 1.13 cgd }
193 1.13 cgd
194 1.13 cgd const struct evcnt *
195 1.13 cgd ioasic_intr_evcnt(dev, cookie)
196 1.13 cgd struct device *dev;
197 1.13 cgd void *cookie;
198 1.13 cgd {
199 1.13 cgd
200 1.13 cgd /* XXX for now, no evcnt parent reported */
201 1.13 cgd return NULL;
202 1.2 nisimura }
203 1.2 nisimura
204 1.2 nisimura #if 1 /* XXX for now XXX */
205 1.2 nisimura void
206 1.2 nisimura ioasic_intr_establish(dev, cookie, level, handler, val)
207 1.2 nisimura struct device *dev;
208 1.2 nisimura void *cookie;
209 1.2 nisimura int level;
210 1.2 nisimura int (*handler) __P((void *));
211 1.2 nisimura void *val;
212 1.2 nisimura {
213 1.8 simonb (*platform.intr_establish)(dev, cookie, level, handler, val);
214 1.2 nisimura }
215 1.2 nisimura
216 1.2 nisimura #else /* XXX eventually XXX */
217 1.2 nisimura
218 1.2 nisimura void
219 1.2 nisimura ioasic_intr_establish(ioa, cookie, level, func, arg)
220 1.2 nisimura struct device *ioa;
221 1.2 nisimura void *cookie, *arg;
222 1.2 nisimura int level;
223 1.2 nisimura int (*func) __P((void *));
224 1.2 nisimura {
225 1.2 nisimura struct ioasic_softc *sc = (void *)ioasic_cd.cd_devs[0];
226 1.2 nisimura int i, intrbits;
227 1.2 nisimura
228 1.2 nisimura for (i = 0; i < ioasic_ndevs; i++) {
229 1.2 nisimura if (ioasic_devs[i].iad_cookie == cookie)
230 1.2 nisimura goto found;
231 1.2 nisimura }
232 1.2 nisimura panic("ioasic_intr_establish: invalid cookie %d", (int)cookie);
233 1.2 nisimura found:
234 1.2 nisimura
235 1.2 nisimura intrtab[(int)cookie].ih_func = func;
236 1.2 nisimura intrtab[(int)cookie].ih_arg = arg;
237 1.2 nisimura
238 1.2 nisimura intrbits = ioasic_devs[i].iad_intrbits;
239 1.2 nisimura i = bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK);
240 1.2 nisimura i |= intrbits;
241 1.2 nisimura bus_space_write_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK, i);
242 1.2 nisimura }
243 1.2 nisimura #endif
244