vsbus.c revision 1.13 1 1.13 ragge /* $NetBSD: vsbus.c,v 1.13 1998/12/06 14:33:54 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.1 ragge #define VSBUS_MAXINTR 8
74 1.1 ragge
75 1.10 ragge struct vsbus_softc {
76 1.10 ragge struct device sc_dev;
77 1.10 ragge struct ivec_dsp sc_dsp[VSBUS_MAXINTR];
78 1.10 ragge };
79 1.1 ragge
80 1.10 ragge struct cfattach vsbus_ca = {
81 1.10 ragge sizeof(struct vsbus_softc), vsbus_match, vsbus_attach
82 1.1 ragge };
83 1.6 ragge
84 1.10 ragge void vsbus_intr_setup __P((struct vsbus_softc *));
85 1.1 ragge
86 1.10 ragge #define VSBUS_MAXDEVS 8
87 1.1 ragge
88 1.1 ragge int
89 1.1 ragge vsbus_print(aux, name)
90 1.1 ragge void *aux;
91 1.2 cgd const char *name;
92 1.1 ragge {
93 1.10 ragge struct vsbus_attach_args *va = aux;
94 1.1 ragge
95 1.1 ragge if (name) {
96 1.10 ragge printf ("device %d at %s", va->va_type, name);
97 1.1 ragge return (UNSUPP);
98 1.1 ragge }
99 1.1 ragge return (UNCONF);
100 1.1 ragge }
101 1.1 ragge
102 1.1 ragge int
103 1.1 ragge vsbus_match(parent, cf, aux)
104 1.1 ragge struct device *parent;
105 1.9 ragge struct cfdata *cf;
106 1.1 ragge void *aux;
107 1.1 ragge {
108 1.1 ragge struct bp_conf *bp = aux;
109 1.1 ragge
110 1.1 ragge if (strcmp(bp->type, "vsbus"))
111 1.1 ragge return 0;
112 1.1 ragge /*
113 1.1 ragge * on machines which can have it, the vsbus is always there
114 1.1 ragge */
115 1.1 ragge if ((vax_bustype & VAX_VSBUS) == 0)
116 1.1 ragge return (0);
117 1.1 ragge
118 1.1 ragge return (1);
119 1.1 ragge }
120 1.1 ragge
121 1.1 ragge void
122 1.1 ragge vsbus_attach(parent, self, aux)
123 1.1 ragge struct device *parent, *self;
124 1.1 ragge void *aux;
125 1.1 ragge {
126 1.10 ragge struct vsbus_softc *sc = (void *)self;
127 1.10 ragge struct vsbus_attach_args va;
128 1.1 ragge
129 1.4 christos printf("\n");
130 1.1 ragge /*
131 1.1 ragge * first setup interrupt-table, so that devices can register
132 1.1 ragge * their interrupt-routines...
133 1.1 ragge */
134 1.10 ragge vsbus_intr_setup(sc);
135 1.1 ragge
136 1.1 ragge /*
137 1.1 ragge * now check for all possible devices on this "bus"
138 1.1 ragge */
139 1.10 ragge /* Always have network */
140 1.12 ragge va.va_type = inr_ni;
141 1.10 ragge config_found(self, &va, vsbus_print);
142 1.1 ragge
143 1.10 ragge /* Always have serial line */
144 1.12 ragge va.va_type = inr_sr;
145 1.10 ragge config_found(self, &va, vsbus_print);
146 1.11 ragge
147 1.11 ragge /* If sm_addr is set, a monochrome graphics adapter is found */
148 1.12 ragge /* XXX ckeck for color adapter */
149 1.11 ragge if (sm_addr) {
150 1.12 ragge va.va_type = inr_vf;
151 1.11 ragge config_found(self, &va, vsbus_print);
152 1.11 ragge }
153 1.13 ragge
154 1.13 ragge /* XXX - Avoid searching for SCSI on 4000/60 */
155 1.13 ragge if (vax_boardtype == VAX_BTYP_46)
156 1.13 ragge return;
157 1.13 ragge
158 1.12 ragge /*
159 1.12 ragge * Check for mass storage devices. This is tricky :-/
160 1.12 ragge * VS2K always has both MFM and SCSI.
161 1.12 ragge * VS3100 has either MFM/SCSI, SCSI/SCSI or neither of them.
162 1.12 ragge * The device registers are at different places for them all.
163 1.12 ragge */
164 1.12 ragge if (vax_boardtype == VAX_BTYP_410) {
165 1.13 ragge #ifdef notyet
166 1.12 ragge va.va_type = inr_dc;
167 1.12 ragge config_found(self, &va, vsbus_print);
168 1.13 ragge #endif
169 1.12 ragge va.va_type = 0x200C0080;
170 1.12 ragge config_found(self, &va, vsbus_print);
171 1.12 ragge return;
172 1.12 ragge }
173 1.12 ragge
174 1.12 ragge if ((vax_confdata & KA420_CFG_STCMSK) == KA420_CFG_NONE)
175 1.12 ragge return; /* No ctlrs */
176 1.12 ragge
177 1.12 ragge /* Ok, we have at least one scsi ctlr */
178 1.12 ragge va.va_type = 0x200C0080;
179 1.12 ragge config_found(self, &va, vsbus_print);
180 1.12 ragge
181 1.13 ragge #ifdef notyet
182 1.12 ragge /* The last one is MFM or SCSI */
183 1.12 ragge if ((vax_confdata & KA420_CFG_STCMSK) == KA420_CFG_RB) {
184 1.12 ragge va.va_type = inr_dc;
185 1.12 ragge config_found(self, &va, vsbus_print);
186 1.12 ragge } else {
187 1.12 ragge va.va_type = 0x200C0180;
188 1.12 ragge config_found(self, &va, vsbus_print);
189 1.12 ragge }
190 1.12 ragge #endif
191 1.1 ragge }
192 1.1 ragge
193 1.10 ragge static void stray __P((int));
194 1.1 ragge
195 1.10 ragge static void
196 1.10 ragge stray(arg)
197 1.10 ragge int arg;
198 1.1 ragge {
199 1.10 ragge printf("stray interrupt nr %d.\n", arg);
200 1.1 ragge }
201 1.1 ragge
202 1.10 ragge static int inrs[] = {IVEC_DC, IVEC_SC, IVEC_VS, IVEC_VF,
203 1.10 ragge IVEC_NS, IVEC_NP, IVEC_ST, IVEC_SR};
204 1.1 ragge
205 1.10 ragge void
206 1.10 ragge vsbus_intr_setup(sc)
207 1.10 ragge struct vsbus_softc *sc;
208 1.1 ragge {
209 1.10 ragge extern struct ivec_dsp idsptch; /* subr.s */
210 1.10 ragge void **scbP = (void*)scb;
211 1.10 ragge int i;
212 1.1 ragge
213 1.10 ragge vs_cpu->vc_intmsk = 0; /* disable all interrupts */
214 1.10 ragge vs_cpu->vc_intclr = 0xFF; /* clear all old interrupts */
215 1.1 ragge
216 1.10 ragge for (i = 0; i < VSBUS_MAXINTR; i++) {
217 1.10 ragge bcopy(&idsptch, &sc->sc_dsp[i], sizeof(struct ivec_dsp));
218 1.10 ragge sc->sc_dsp[i].hoppaddr = stray;
219 1.10 ragge sc->sc_dsp[i].pushlarg = i;
220 1.10 ragge scbP[inrs[i]/4] = &sc->sc_dsp[i];
221 1.1 ragge }
222 1.1 ragge }
223 1.1 ragge
224 1.10 ragge void
225 1.10 ragge vsbus_intr_attach(nr, func, arg)
226 1.10 ragge int nr;
227 1.10 ragge void (*func)(int);
228 1.10 ragge int arg;
229 1.1 ragge {
230 1.10 ragge struct vsbus_softc *sc = vsbus_cd.cd_devs[0];
231 1.1 ragge
232 1.10 ragge sc->sc_dsp[nr].hoppaddr = func;
233 1.10 ragge sc->sc_dsp[nr].pushlarg = arg;
234 1.1 ragge }
235 1.1 ragge
236 1.10 ragge void
237 1.10 ragge vsbus_intr_enable(nr)
238 1.10 ragge int nr;
239 1.1 ragge {
240 1.10 ragge vs_cpu->vc_intclr = (1<<nr);
241 1.10 ragge vs_cpu->vc_intmsk |= (1<<nr);
242 1.1 ragge }
243 1.1 ragge
244 1.1 ragge void
245 1.10 ragge vsbus_intr_disable(nr)
246 1.10 ragge int nr;
247 1.1 ragge {
248 1.10 ragge vs_cpu->vc_intmsk = vs_cpu->vc_intmsk & ~(1<<nr);
249 1.1 ragge }
250 1.1 ragge
251 1.12 ragge #ifdef notyet
252 1.1 ragge /*
253 1.12 ragge * Allocate/free DMA pages and other bus resources.
254 1.12 ragge * VS2000: All DMA and register access must be exclusive.
255 1.12 ragge * VS3100: DMA area may be accessed by anyone anytime.
256 1.12 ragge * MFM/SCSI: Don't touch reg's while DMA is active.
257 1.12 ragge * SCSI/SCSI: Legal to touch any register anytime.
258 1.1 ragge */
259 1.1 ragge
260 1.1 ragge
261 1.1 ragge #endif
262