1 /* $NetBSD: dma_sbus.c,v 1.34 2009/05/12 13:20:05 cegger Exp $ */
4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
33 * Copyright (c) 1994 Peter Galbavy. All rights reserved.
35 * Redistribution and use in source and binary forms, with or without
36 * modification, are permitted provided that the following conditions
38 * 1. Redistributions of source code must retain the above copyright
39 * notice, this list of conditions and the following disclaimer.
40 * 2. Redistributions in binary form must reproduce the above copyright
41 * notice, this list of conditions and the following disclaimer in the
42 * documentation and/or other materials provided with the distribution.
43 * 3. All advertising materials mentioning features or use of this software
44 * must display the following acknowledgement:
45 * This product includes software developed by Peter Galbavy.
46 * 4. The name of the author may not be used to endorse or promote products
47 * derived from this software without specific prior written permission.
49 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
50 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
51 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
52 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
53 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
54 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
55 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
56 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
58 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61 #include <sys/cdefs.h>
62 __KERNEL_RCSID(0, "$NetBSD: dma_sbus.c,v 1.34 2009/05/12 13:20:05 cegger Exp $");
64 #include <sys/param.h>
65 #include <sys/systm.h>
66 #include <sys/kernel.h>
67 #include <sys/errno.h>
68 #include <sys/device.h>
69 #include <sys/malloc.h>
73 #include <machine/autoconf.h>
75 #include <dev/sbus/sbusvar.h>
77 #include <dev/ic/lsi64854reg.h>
78 #include <dev/ic/lsi64854var.h>
81 struct lsi64854_softc sc_lsi64854
; /* base device */
82 /* possible sbus specific stuff here */
85 int dmamatch_sbus(device_t
, cfdata_t
, void *);
86 void dmaattach_sbus(device_t
, device_t
, void *);
88 int dmaprint_sbus(void *, const char *);
90 void *dmabus_intr_establish(
92 int, /*bus interrupt priority*/
93 int, /*`device class' level*/
94 int (*)(void *), /*handler*/
95 void *, /*handler arg*/
96 void (*) (void)); /*optional fast trap handler*/
98 CFATTACH_DECL_NEW(dma_sbus
, sizeof(struct dma_softc
),
99 dmamatch_sbus
, dmaattach_sbus
, NULL
, NULL
);
101 CFATTACH_DECL_NEW(ledma
, sizeof(struct dma_softc
),
102 dmamatch_sbus
, dmaattach_sbus
, NULL
, NULL
);
105 dmaprint_sbus(void *aux
, const char *busname
)
107 struct sbus_attach_args
*sa
= aux
;
108 bus_space_tag_t t
= sa
->sa_bustag
;
109 struct dma_softc
*sc
= t
->cookie
;
111 sa
->sa_bustag
= sc
->sc_lsi64854
.sc_bustag
; /* XXX */
112 sbus_print(aux
, busname
); /* XXX */
113 sa
->sa_bustag
= t
; /* XXX */
118 dmamatch_sbus(device_t parent
, cfdata_t cf
, void *aux
)
120 struct sbus_attach_args
*sa
= aux
;
122 return strcmp(cf
->cf_name
, sa
->sa_name
) == 0 ||
123 strcmp("espdma", sa
->sa_name
) == 0;
127 dmaattach_sbus(device_t parent
, device_t self
, void *aux
)
129 struct dma_softc
*dsc
= device_private(self
);
130 struct lsi64854_softc
*sc
= &dsc
->sc_lsi64854
;
131 struct sbus_attach_args
*sa
= aux
;
132 struct sbus_softc
*sbsc
= device_private(parent
);
134 int sbusburst
, burst
;
140 sc
->sc_bustag
= sa
->sa_bustag
;
141 sc
->sc_dmatag
= sa
->sa_dmatag
;
144 if (sa
->sa_npromvaddrs
) {
145 sbus_promaddr_to_handle(sa
->sa_bustag
,
146 sa
->sa_promvaddrs
[0], &sc
->sc_regs
);
148 if (sbus_bus_map(sa
->sa_bustag
,
149 sa
->sa_slot
, sa
->sa_offset
, sa
->sa_size
,
150 0, &sc
->sc_regs
) != 0) {
151 aprint_error(": cannot map registers\n");
157 * Get transfer burst size from PROM and plug it into the
158 * controller registers. This is needed on the Sun4m; do
159 * others need it too?
161 sbusburst
= sbsc
->sc_burst
;
163 sbusburst
= SBUS_BURST_32
- 1; /* 1->16 */
165 burst
= prom_getpropint(node
,"burst-sizes", -1);
167 /* take SBus burst sizes */
170 /* Clamp at parent's burst sizes */
172 sc
->sc_burst
= (burst
& SBUS_BURST_32
) ? 32 :
173 (burst
& SBUS_BURST_16
) ? 16 : 0;
175 if (device_is_a(self
, "ledma")) {
179 * Check to see which cable type is currently active and
180 * set the appropriate bit in the ledma csr so that it
181 * gets used. If we didn't netboot, the PROM won't have
182 * the "cable-selection" property; default to TP and then
183 * the user can change it via a "media" option to ifconfig.
185 cabletype
= prom_getpropstring(node
, "cable-selection");
186 csr
= L64854_GCSR(sc
);
187 if (strcmp(cabletype
, "tpe") == 0) {
189 } else if (strcmp(cabletype
, "aui") == 0) {
192 /* assume TP if nothing there */
195 L64854_SCSR(sc
, csr
);
196 delay(20000); /* manual says we need a 20ms delay */
197 sc
->sc_channel
= L64854_CHANNEL_ENET
;
199 sc
->sc_channel
= L64854_CHANNEL_SCSI
;
202 if ((sbt
= bus_space_tag_alloc(sc
->sc_bustag
, dsc
)) == NULL
) {
203 aprint_error(": out of memory\n");
206 sbt
->sparc_intr_establish
= dmabus_intr_establish
;
209 /* Attach children */
210 for (node
= firstchild(sa
->sa_node
); node
; node
= nextsibling(node
)) {
211 struct sbus_attach_args sax
;
212 sbus_setup_attach_args(sbsc
, sbt
, sc
->sc_dmatag
, node
, &sax
);
213 (void)config_found(self
, (void *)&sax
, dmaprint_sbus
);
214 sbus_destroy_attach_args(&sax
);
219 dmabus_intr_establish(bus_space_tag_t t
, int pri
, int level
,
220 int (*handler
)(void *), void *arg
, void (*fastvec
)(void))
222 struct lsi64854_softc
*sc
= t
->cookie
;
224 /* XXX - for now only le; do esp later */
225 if (sc
->sc_channel
== L64854_CHANNEL_ENET
) {
226 sc
->sc_intrchain
= handler
;
227 sc
->sc_intrchainarg
= arg
;
228 handler
= lsi64854_enet_intr
;
231 return bus_intr_establish(sc
->sc_bustag
, pri
, level
, handler
, arg
);