1 /* $NetBSD: mbio.c,v 1.11 2002/10/02 16:02:23 thorpej Exp $ */ 2 3 /*- 4 * Copyright (c) 1996 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Adam Glass, Gordon W. Ross, and Matthew Fredette. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 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. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39 #include <sys/param.h> 40 #include <sys/systm.h> 41 #include <sys/device.h> 42 43 #include <uvm/uvm_extern.h> 44 45 #include <machine/autoconf.h> 46 #include <machine/pmap.h> 47 48 #include <sun2/sun2/control.h> 49 #include <sun2/sun2/machdep.h> 50 #include <sun2/sun2/mbio.h> 51 52 /* Does this machine have a Multibus? */ 53 extern int cpu_has_multibus; 54 55 static int mbio_match __P((struct device *, struct cfdata *, void *)); 56 static void mbio_attach __P((struct device *, struct device *, void *)); 57 58 struct mbio_softc { 59 struct device sc_dev; /* base device */ 60 bus_space_tag_t sc_bustag; /* parent bus tag */ 61 bus_dma_tag_t sc_dmatag; /* parent bus dma tag */ 62 }; 63 64 CFATTACH_DECL(mbio, sizeof(struct mbio_softc), 65 mbio_match, mbio_attach, NULL, NULL); 66 67 static paddr_t mbio_bus_mmap __P((bus_space_tag_t, bus_type_t, bus_addr_t, 68 off_t, int, int)); 69 static int _mbio_bus_map __P((bus_space_tag_t, bus_type_t, bus_addr_t, 70 bus_size_t, int, 71 vaddr_t, bus_space_handle_t *)); 72 73 static struct sun68k_bus_space_tag mbio_space_tag = { 74 NULL, /* cookie */ 75 NULL, /* parent bus tag */ 76 _mbio_bus_map, /* bus_space_map */ 77 NULL, /* bus_space_unmap */ 78 NULL, /* bus_space_subregion */ 79 NULL, /* bus_space_barrier */ 80 mbio_bus_mmap, /* bus_space_mmap */ 81 NULL, /* bus_intr_establish */ 82 NULL, /* bus_space_peek_N */ 83 NULL /* bus_space_poke_N */ 84 }; 85 86 static int 87 mbio_match(parent, cf, aux) 88 struct device *parent; 89 struct cfdata *cf; 90 void *aux; 91 { 92 struct mainbus_attach_args *ma = aux; 93 94 return (cpu_has_multibus && (ma->ma_name == NULL || strcmp(cf->cf_name, ma->ma_name) == 0)); 95 } 96 97 static void 98 mbio_attach(parent, self, aux) 99 struct device *parent; 100 struct device *self; 101 void *aux; 102 { 103 struct mainbus_attach_args *ma = aux; 104 struct mbio_softc *sc = (struct mbio_softc *)self; 105 struct mbio_attach_args mba; 106 const char *const *cpp; 107 static const char *const special[] = { 108 /* find these first */ 109 NULL 110 }; 111 112 /* 113 * There is only one mbio bus 114 */ 115 if (self->dv_unit > 0) { 116 printf(" unsupported\n"); 117 return; 118 } 119 printf("\n"); 120 121 sc->sc_bustag = ma->ma_bustag; 122 sc->sc_dmatag = ma->ma_dmatag; 123 124 mbio_space_tag.cookie = sc; 125 mbio_space_tag.parent = sc->sc_bustag; 126 127 /* 128 * Prepare the skeleton attach arguments for our devices. 129 * The values we give in the locators are indications to 130 * sun68k_bus_search about which locators must and must not 131 * be defined. 132 */ 133 mba = *ma; 134 mba.mba_bustag = &mbio_space_tag; 135 mba.mba_paddr = LOCATOR_REQUIRED; 136 mba.mba_pri = LOCATOR_OPTIONAL; 137 138 /* Find all `early' mbio devices */ 139 for (cpp = special; *cpp != NULL; cpp++) { 140 mba.mba_name = *cpp; 141 (void)config_search(sun68k_bus_search, self, &mba); 142 } 143 144 /* Find all other mbio devices */ 145 mba.mba_name = NULL; 146 (void)config_search(sun68k_bus_search, self, &mba); 147 } 148 149 int 150 _mbio_bus_map(t, btype, paddr, size, flags, vaddr, hp) 151 bus_space_tag_t t; 152 bus_type_t btype; 153 bus_addr_t paddr; 154 bus_size_t size; 155 int flags; 156 vaddr_t vaddr; 157 bus_space_handle_t *hp; 158 { 159 struct mbio_softc *sc = t->cookie; 160 161 if ((paddr + size) > MBIO_SIZE) 162 panic("_mbio_bus_map: out of range"); 163 164 return (bus_space_map2(sc->sc_bustag, PMAP_MBIO, paddr, 165 size, flags | _SUN68K_BUS_MAP_USE_PROM, vaddr, hp)); 166 } 167 168 paddr_t 169 mbio_bus_mmap(t, btype, paddr, off, prot, flags) 170 bus_space_tag_t t; 171 bus_type_t btype; 172 bus_addr_t paddr; 173 off_t off; 174 int prot; 175 int flags; 176 { 177 struct mbio_softc *sc = t->cookie; 178 179 return (bus_space_mmap2(sc->sc_bustag, PMAP_MBIO, paddr, off, 180 prot, flags)); 181 } 182