1 /* $NetBSD: uba.c,v 1.77 2008/03/11 05:34:02 matt Exp $ */
3 * Copyright (c) 1982, 1986 The Regents of the University of California.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of the University nor the names of its contributors
15 * may be used to endorse or promote products derived from this software
16 * without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * @(#)uba.c 7.10 (Berkeley) 12/16/90
31 * @(#)autoconf.c 7.20 (Berkeley) 5/9/91
35 * Copyright (c) 1996 Jonathan Stone.
36 * Copyright (c) 1994, 1996 Ludd, University of Lule}, Sweden.
37 * All rights reserved.
39 * Redistribution and use in source and binary forms, with or without
40 * modification, are permitted provided that the following conditions
42 * 1. Redistributions of source code must retain the above copyright
43 * notice, this list of conditions and the following disclaimer.
44 * 2. Redistributions in binary form must reproduce the above copyright
45 * notice, this list of conditions and the following disclaimer in the
46 * documentation and/or other materials provided with the distribution.
47 * 3. All advertising materials mentioning features or use of this software
48 * must display the following acknowledgement:
49 * This product includes software developed by the University of
50 * California, Berkeley and its contributors.
51 * 4. Neither the name of the University nor the names of its contributors
52 * may be used to endorse or promote products derived from this software
53 * without specific prior written permission.
55 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
56 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
57 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
58 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
59 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
60 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
61 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
62 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
63 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
64 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
67 * @(#)uba.c 7.10 (Berkeley) 12/16/90
68 * @(#)autoconf.c 7.20 (Berkeley) 5/9/91
71 #include <sys/cdefs.h>
72 __KERNEL_RCSID(0, "$NetBSD: uba.c,v 1.77 2008/03/11 05:34:02 matt Exp $");
74 #include <sys/param.h>
76 #include <sys/systm.h>
80 #include <sys/kernel.h>
81 #include <sys/malloc.h>
82 #include <sys/device.h>
84 #include <uvm/uvm_extern.h>
87 #include <machine/scb.h>
90 #include <dev/qbus/ubareg.h>
91 #include <dev/qbus/ubavar.h>
96 static int ubasearch (device_t
, cfdata_t
,
98 static int ubaprint (void *, const char *);
101 * If we failed to allocate uba resources, put us on a queue to wait
102 * until there is available resources. Resources to compete about
103 * are map registers and BDPs. This is normally only a problem on
104 * Unibus systems, Qbus systems have more map registers than usable.
107 uba_enqueue(struct uba_unit
*uu
)
109 struct uba_softc
*uh
;
112 uh
= device_private(device_parent(uu
->uu_dev
));
115 SIMPLEQ_INSERT_TAIL(&uh
->uh_resq
, uu
, uu_resq
);
120 * When a routine that uses resources is finished, the next device
121 * in queue for map registers etc is called. If it succeeds to get
122 * resources, call next, and next, and next...
123 * This routine must be called at spluba.
126 uba_done(struct uba_softc
*uh
)
130 while ((uu
= SIMPLEQ_FIRST(&uh
->uh_resq
))) {
131 SIMPLEQ_REMOVE_HEAD(&uh
->uh_resq
, uu_resq
);
132 if ((*uu
->uu_ready
)(uu
) == 0) {
133 SIMPLEQ_INSERT_HEAD(&uh
->uh_resq
, uu
, uu_resq
);
140 * Each device that needs some handling if an ubareset occurs must
141 * register for reset first through this routine.
144 uba_reset_establish(void (*reset
)(device_t
), device_t dev
)
146 struct uba_softc
*uh
= device_private(device_parent(dev
));
147 struct uba_reset
*ur
;
149 ur
= malloc(sizeof(struct uba_reset
), M_DEVBUF
, M_NOWAIT
|M_ZERO
);
151 panic("uba_reset_establish");
153 ur
->ur_reset
= reset
;
155 SIMPLEQ_INSERT_TAIL(&uh
->uh_resetq
, ur
, ur_resetq
);
159 * Allocate a bunch of map registers and map them to the given address.
162 uballoc(struct uba_softc
*uh
, struct ubinfo
*ui
, int flags
)
164 int waitok
= (flags
& UBA_CANTWAIT
) == 0;
167 if ((error
= bus_dmamap_create(uh
->uh_dmat
, ui
->ui_size
, 1,
168 ui
->ui_size
, 0, (waitok
? BUS_DMA_WAITOK
: BUS_DMA_NOWAIT
),
172 if ((error
= bus_dmamap_load(uh
->uh_dmat
, ui
->ui_dmam
, ui
->ui_vaddr
,
173 ui
->ui_size
, NULL
, (waitok
? BUS_DMA_WAITOK
: BUS_DMA_NOWAIT
)))) {
174 bus_dmamap_destroy(uh
->uh_dmat
, ui
->ui_dmam
);
177 ui
->ui_baddr
= ui
->ui_dmam
->dm_segs
[0].ds_addr
;
182 * Allocate DMA-able memory and map it on the unibus.
185 ubmemalloc(struct uba_softc
*uh
, struct ubinfo
*ui
, int flags
)
187 int waitok
= (flags
& UBA_CANTWAIT
? BUS_DMA_NOWAIT
: BUS_DMA_WAITOK
);
190 if ((error
= bus_dmamem_alloc(uh
->uh_dmat
, ui
->ui_size
, PAGE_SIZE
, 0,
191 &ui
->ui_seg
, 1, &ui
->ui_rseg
, waitok
)))
193 if ((error
= bus_dmamem_map(uh
->uh_dmat
, &ui
->ui_seg
, ui
->ui_rseg
,
194 ui
->ui_size
, &ui
->ui_vaddr
, waitok
|BUS_DMA_COHERENT
))) {
195 bus_dmamem_free(uh
->uh_dmat
, &ui
->ui_seg
, ui
->ui_rseg
);
198 if ((error
= uballoc(uh
, ui
, flags
))) {
199 bus_dmamem_unmap(uh
->uh_dmat
, ui
->ui_vaddr
, ui
->ui_size
);
200 bus_dmamem_free(uh
->uh_dmat
, &ui
->ui_seg
, ui
->ui_rseg
);
206 ubfree(struct uba_softc
*uh
, struct ubinfo
*ui
)
208 bus_dmamap_unload(uh
->uh_dmat
, ui
->ui_dmam
);
209 bus_dmamap_destroy(uh
->uh_dmat
, ui
->ui_dmam
);
213 ubmemfree(struct uba_softc
*uh
, struct ubinfo
*ui
)
215 bus_dmamem_unmap(uh
->uh_dmat
, ui
->ui_vaddr
, ui
->ui_size
);
216 bus_dmamem_free(uh
->uh_dmat
, &ui
->ui_seg
, ui
->ui_rseg
);
221 * Generate a reset on uba number uban. Then
222 * call each device that asked to be called during attach,
223 * giving it a chance to clean up so as to be able to continue.
226 ubareset(struct uba_softc
*uh
)
228 struct uba_reset
*ur
;
232 SIMPLEQ_INIT(&uh
->uh_resq
);
233 printf("%s: reset", device_xname(uh
->uh_dev
));
234 (*uh
->uh_ubainit
)(uh
);
236 ur
= SIMPLEQ_FIRST(&uh
->uh_resetq
);
238 printf(" %s", device_xname(ur
->ur_dev
));
239 (*ur
->ur_reset
)(ur
->ur_dev
);
240 } while ((ur
= SIMPLEQ_NEXT(ur
, ur_resetq
)));
247 * The common attach routine:
248 * Calls the scan routine to search for uba devices.
251 uba_attach(struct uba_softc
*sc
, paddr_t iopagephys
)
255 * Set last free interrupt vector for devices with
256 * programmable interrupt vectors. Use is to decrement
257 * this number and use result as interrupt vector.
259 sc
->uh_lastiv
= 0x200;
260 SIMPLEQ_INIT(&sc
->uh_resq
);
261 SIMPLEQ_INIT(&sc
->uh_resetq
);
264 * Allocate place for unibus I/O space in virtual space.
266 if (bus_space_map(sc
->uh_iot
, iopagephys
, UBAIOSIZE
, 0, &sc
->uh_ioh
))
270 * Keep track of which addressed devices are found.
272 sc
->uh_used
= malloc(UBAIOSIZE
, M_TEMP
, M_WAITOK
);
273 memset(sc
->uh_used
, 0, UBAIOSIZE
);
275 if (sc
->uh_beforescan
)
276 (*sc
->uh_beforescan
)(sc
);
278 * Now start searching for devices.
280 config_search_ia(ubasearch
, sc
->uh_dev
, "uba", NULL
);
282 if (sc
->uh_afterscan
)
283 (*sc
->uh_afterscan
)(sc
);
285 free(sc
->uh_used
, M_TEMP
);
289 ubasearch(device_t parent
, cfdata_t cf
, const int *ldesc
, void *aux
)
291 struct uba_softc
*sc
= device_private(parent
);
292 struct uba_attach_args ua
;
295 csr
= cf
->cf_loc
[UBACF_CSR
];
296 if (sc
->uh_used
[ubdevreg(csr
)])
297 return 0; /* something are already at this address */
299 ua
.ua_ioh
= ubdevreg(csr
) + sc
->uh_ioh
;
300 ua
.ua_iot
= sc
->uh_iot
;
301 ua
.ua_dmat
= sc
->uh_dmat
;
303 if (badaddr((void *)ua
.ua_ioh
, 2) ||
304 (sc
->uh_errchk
? (*sc
->uh_errchk
)(sc
):0))
307 scb_vecref(0, 0); /* Clear vector ref */
308 i
= config_match(parent
, cf
, &ua
);
311 if ((*sc
->uh_errchk
)(sc
))
316 i
= scb_vecref(&vec
, &br
);
327 sc
->uh_used
[ubdevreg(csr
)] = 1;
329 config_attach(parent
, cf
, &ua
, ubaprint
);
333 printf("%s%d at %s csr %o %s\n",
334 cf
->cf_name
, cf
->cf_unit
, device_xname(parent
),
335 csr
, (i
? "zero vector" : "didn't interrupt"));
342 * Print out some interesting info common to all unibus devices.
345 ubaprint(void *aux
, const char *uba
)
347 struct uba_attach_args
*ua
= aux
;
349 aprint_normal(" csr %o vec %o ipl %x", ua
->ua_iaddr
,
350 ua
->ua_cvec
& 511, ua
->ua_br
);
355 * Move to machdep eventually
358 uba_intr_establish(void *icookie
, int vec
, void (*ifunc
)(void *iarg
),
359 void *iarg
, struct evcnt
*ev
)
361 scb_vecalloc(vec
, ifunc
, iarg
, SCB_ISTACK
, ev
);