vsbus.c revision 1.15 1 1.15 ragge /* $NetBSD: vsbus.c,v 1.15 1999/03/09 12:57:58 ragge Exp $ */
2 1.1 ragge /*
3 1.1 ragge * Copyright (c) 1996 Ludd, University of Lule}, Sweden.
4 1.1 ragge * All rights reserved.
5 1.1 ragge *
6 1.1 ragge * This code is derived from software contributed to Ludd by Bertram Barth.
7 1.1 ragge *
8 1.1 ragge * Redistribution and use in source and binary forms, with or without
9 1.1 ragge * modification, are permitted provided that the following conditions
10 1.1 ragge * are met:
11 1.1 ragge * 1. Redistributions of source code must retain the above copyright
12 1.1 ragge * notice, this list of conditions and the following disclaimer.
13 1.1 ragge * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 ragge * notice, this list of conditions and the following disclaimer in the
15 1.1 ragge * documentation and/or other materials provided with the distribution.
16 1.1 ragge * 3. All advertising materials mentioning features or use of this software
17 1.1 ragge * must display the following acknowledgement:
18 1.1 ragge * This product includes software developed at Ludd, University of
19 1.1 ragge * Lule}, Sweden and its contributors.
20 1.1 ragge * 4. The name of the author may not be used to endorse or promote products
21 1.1 ragge * derived from this software without specific prior written permission
22 1.1 ragge *
23 1.1 ragge * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 1.1 ragge * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 1.1 ragge * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 1.1 ragge * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 1.1 ragge * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 1.1 ragge * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 1.1 ragge * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 1.1 ragge * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 1.1 ragge * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 1.1 ragge * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 1.1 ragge */
34 1.1 ragge
35 1.1 ragge #include <sys/param.h>
36 1.1 ragge #include <sys/systm.h>
37 1.1 ragge #include <sys/buf.h>
38 1.1 ragge #include <sys/conf.h>
39 1.1 ragge #include <sys/file.h>
40 1.1 ragge #include <sys/ioctl.h>
41 1.1 ragge #include <sys/proc.h>
42 1.1 ragge #include <sys/user.h>
43 1.1 ragge #include <sys/map.h>
44 1.1 ragge #include <sys/device.h>
45 1.1 ragge #include <sys/dkstat.h>
46 1.1 ragge #include <sys/disklabel.h>
47 1.1 ragge #include <sys/syslog.h>
48 1.1 ragge #include <sys/stat.h>
49 1.1 ragge
50 1.1 ragge #include <machine/pte.h>
51 1.1 ragge #include <machine/sid.h>
52 1.1 ragge #include <machine/scb.h>
53 1.1 ragge #include <machine/cpu.h>
54 1.1 ragge #include <machine/trap.h>
55 1.1 ragge #include <machine/nexus.h>
56 1.1 ragge
57 1.1 ragge #include <machine/uvax.h>
58 1.1 ragge #include <machine/ka410.h>
59 1.12 ragge #include <machine/ka420.h>
60 1.1 ragge #include <machine/ka43.h>
61 1.1 ragge
62 1.1 ragge #include <machine/vsbus.h>
63 1.1 ragge
64 1.10 ragge #include "ioconf.h"
65 1.1 ragge
66 1.9 ragge int vsbus_match __P((struct device *, struct cfdata *, void *));
67 1.1 ragge void vsbus_attach __P((struct device *, struct device *, void *));
68 1.2 cgd int vsbus_print __P((void *, const char *));
69 1.1 ragge
70 1.1 ragge void ka410_attach __P((struct device *, struct device *, void *));
71 1.1 ragge void ka43_attach __P((struct device *, struct device *, void *));
72 1.1 ragge
73 1.14 ragge static struct vs_cpu *vs_cpu;
74 1.14 ragge
75 1.1 ragge #define VSBUS_MAXINTR 8
76 1.1 ragge
77 1.10 ragge struct vsbus_softc {
78 1.10 ragge struct device sc_dev;
79 1.10 ragge struct ivec_dsp sc_dsp[VSBUS_MAXINTR];
80 1.10 ragge };
81 1.1 ragge
82 1.10 ragge struct cfattach vsbus_ca = {
83 1.10 ragge sizeof(struct vsbus_softc), vsbus_match, vsbus_attach
84 1.1 ragge };
85 1.6 ragge
86 1.10 ragge void vsbus_intr_setup __P((struct vsbus_softc *));
87 1.1 ragge
88 1.10 ragge #define VSBUS_MAXDEVS 8
89 1.1 ragge
90 1.1 ragge int
91 1.1 ragge vsbus_print(aux, name)
92 1.1 ragge void *aux;
93 1.2 cgd const char *name;
94 1.1 ragge {
95 1.10 ragge struct vsbus_attach_args *va = aux;
96 1.1 ragge
97 1.1 ragge if (name) {
98 1.10 ragge printf ("device %d at %s", va->va_type, name);
99 1.1 ragge return (UNSUPP);
100 1.1 ragge }
101 1.1 ragge return (UNCONF);
102 1.1 ragge }
103 1.1 ragge
104 1.1 ragge int
105 1.1 ragge vsbus_match(parent, cf, aux)
106 1.1 ragge struct device *parent;
107 1.9 ragge struct cfdata *cf;
108 1.1 ragge void *aux;
109 1.1 ragge {
110 1.1 ragge struct bp_conf *bp = aux;
111 1.1 ragge
112 1.1 ragge if (strcmp(bp->type, "vsbus"))
113 1.1 ragge return 0;
114 1.1 ragge /*
115 1.1 ragge * on machines which can have it, the vsbus is always there
116 1.1 ragge */
117 1.1 ragge if ((vax_bustype & VAX_VSBUS) == 0)
118 1.1 ragge return (0);
119 1.1 ragge
120 1.1 ragge return (1);
121 1.1 ragge }
122 1.1 ragge
123 1.1 ragge void
124 1.1 ragge vsbus_attach(parent, self, aux)
125 1.1 ragge struct device *parent, *self;
126 1.1 ragge void *aux;
127 1.1 ragge {
128 1.10 ragge struct vsbus_softc *sc = (void *)self;
129 1.10 ragge struct vsbus_attach_args va;
130 1.1 ragge
131 1.4 christos printf("\n");
132 1.14 ragge
133 1.14 ragge vs_cpu = (void *)vax_map_physmem(VS_REGS, 1);
134 1.1 ragge /*
135 1.1 ragge * first setup interrupt-table, so that devices can register
136 1.1 ragge * their interrupt-routines...
137 1.1 ragge */
138 1.10 ragge vsbus_intr_setup(sc);
139 1.1 ragge
140 1.1 ragge /*
141 1.1 ragge * now check for all possible devices on this "bus"
142 1.1 ragge */
143 1.10 ragge /* Always have network */
144 1.12 ragge va.va_type = inr_ni;
145 1.10 ragge config_found(self, &va, vsbus_print);
146 1.1 ragge
147 1.10 ragge /* Always have serial line */
148 1.12 ragge va.va_type = inr_sr;
149 1.10 ragge config_found(self, &va, vsbus_print);
150 1.15 ragge
151 1.15 ragge /* XXX - Detecting smg on 4000 VLC crashes, SCSI is 53c94 */
152 1.15 ragge if (vax_boardtype == VAX_BTYP_48)
153 1.15 ragge return;
154 1.11 ragge
155 1.11 ragge /* If sm_addr is set, a monochrome graphics adapter is found */
156 1.14 ragge /* XXX - fixa! */
157 1.14 ragge va.va_type = inr_vf;
158 1.14 ragge config_found(self, &va, vsbus_print);
159 1.13 ragge
160 1.13 ragge /* XXX - Avoid searching for SCSI on 4000/60 */
161 1.13 ragge if (vax_boardtype == VAX_BTYP_46)
162 1.13 ragge return;
163 1.13 ragge
164 1.12 ragge /*
165 1.12 ragge * Check for mass storage devices. This is tricky :-/
166 1.12 ragge * VS2K always has both MFM and SCSI.
167 1.12 ragge * VS3100 has either MFM/SCSI, SCSI/SCSI or neither of them.
168 1.12 ragge * The device registers are at different places for them all.
169 1.12 ragge */
170 1.12 ragge if (vax_boardtype == VAX_BTYP_410) {
171 1.13 ragge #ifdef notyet
172 1.12 ragge va.va_type = inr_dc;
173 1.12 ragge config_found(self, &va, vsbus_print);
174 1.13 ragge #endif
175 1.12 ragge va.va_type = 0x200C0080;
176 1.12 ragge config_found(self, &va, vsbus_print);
177 1.12 ragge return;
178 1.12 ragge }
179 1.12 ragge
180 1.12 ragge if ((vax_confdata & KA420_CFG_STCMSK) == KA420_CFG_NONE)
181 1.12 ragge return; /* No ctlrs */
182 1.12 ragge
183 1.12 ragge /* Ok, we have at least one scsi ctlr */
184 1.12 ragge va.va_type = 0x200C0080;
185 1.12 ragge config_found(self, &va, vsbus_print);
186 1.12 ragge
187 1.13 ragge #ifdef notyet
188 1.12 ragge /* The last one is MFM or SCSI */
189 1.12 ragge if ((vax_confdata & KA420_CFG_STCMSK) == KA420_CFG_RB) {
190 1.12 ragge va.va_type = inr_dc;
191 1.12 ragge config_found(self, &va, vsbus_print);
192 1.12 ragge } else {
193 1.12 ragge va.va_type = 0x200C0180;
194 1.12 ragge config_found(self, &va, vsbus_print);
195 1.12 ragge }
196 1.12 ragge #endif
197 1.1 ragge }
198 1.1 ragge
199 1.10 ragge static void stray __P((int));
200 1.1 ragge
201 1.10 ragge static void
202 1.10 ragge stray(arg)
203 1.10 ragge int arg;
204 1.1 ragge {
205 1.10 ragge printf("stray interrupt nr %d.\n", arg);
206 1.1 ragge }
207 1.1 ragge
208 1.10 ragge static int inrs[] = {IVEC_DC, IVEC_SC, IVEC_VS, IVEC_VF,
209 1.10 ragge IVEC_NS, IVEC_NP, IVEC_ST, IVEC_SR};
210 1.1 ragge
211 1.10 ragge void
212 1.10 ragge vsbus_intr_setup(sc)
213 1.10 ragge struct vsbus_softc *sc;
214 1.1 ragge {
215 1.10 ragge extern struct ivec_dsp idsptch; /* subr.s */
216 1.10 ragge void **scbP = (void*)scb;
217 1.10 ragge int i;
218 1.1 ragge
219 1.10 ragge vs_cpu->vc_intmsk = 0; /* disable all interrupts */
220 1.10 ragge vs_cpu->vc_intclr = 0xFF; /* clear all old interrupts */
221 1.1 ragge
222 1.10 ragge for (i = 0; i < VSBUS_MAXINTR; i++) {
223 1.10 ragge bcopy(&idsptch, &sc->sc_dsp[i], sizeof(struct ivec_dsp));
224 1.10 ragge sc->sc_dsp[i].hoppaddr = stray;
225 1.10 ragge sc->sc_dsp[i].pushlarg = i;
226 1.10 ragge scbP[inrs[i]/4] = &sc->sc_dsp[i];
227 1.1 ragge }
228 1.1 ragge }
229 1.1 ragge
230 1.10 ragge void
231 1.10 ragge vsbus_intr_attach(nr, func, arg)
232 1.10 ragge int nr;
233 1.10 ragge void (*func)(int);
234 1.10 ragge int arg;
235 1.1 ragge {
236 1.10 ragge struct vsbus_softc *sc = vsbus_cd.cd_devs[0];
237 1.1 ragge
238 1.10 ragge sc->sc_dsp[nr].hoppaddr = func;
239 1.10 ragge sc->sc_dsp[nr].pushlarg = arg;
240 1.1 ragge }
241 1.1 ragge
242 1.10 ragge void
243 1.10 ragge vsbus_intr_enable(nr)
244 1.10 ragge int nr;
245 1.1 ragge {
246 1.10 ragge vs_cpu->vc_intclr = (1<<nr);
247 1.10 ragge vs_cpu->vc_intmsk |= (1<<nr);
248 1.1 ragge }
249 1.1 ragge
250 1.1 ragge void
251 1.10 ragge vsbus_intr_disable(nr)
252 1.10 ragge int nr;
253 1.1 ragge {
254 1.10 ragge vs_cpu->vc_intmsk = vs_cpu->vc_intmsk & ~(1<<nr);
255 1.1 ragge }
256 1.1 ragge
257 1.12 ragge #ifdef notyet
258 1.1 ragge /*
259 1.12 ragge * Allocate/free DMA pages and other bus resources.
260 1.12 ragge * VS2000: All DMA and register access must be exclusive.
261 1.12 ragge * VS3100: DMA area may be accessed by anyone anytime.
262 1.12 ragge * MFM/SCSI: Don't touch reg's while DMA is active.
263 1.12 ragge * SCSI/SCSI: Legal to touch any register anytime.
264 1.1 ragge */
265 1.1 ragge
266 1.1 ragge
267 1.1 ragge #endif
268