1 1.21 thorpej /* $NetBSD: obmem.c,v 1.21 2021/08/07 16:19:06 thorpej Exp $ */ 2 1.1 fredette 3 1.1 fredette /*- 4 1.1 fredette * Copyright (c) 1996 The NetBSD Foundation, Inc. 5 1.1 fredette * All rights reserved. 6 1.1 fredette * 7 1.1 fredette * This code is derived from software contributed to The NetBSD Foundation 8 1.1 fredette * by Adam Glass, Gordon W. Ross, and Matthew Fredette. 9 1.1 fredette * 10 1.1 fredette * Redistribution and use in source and binary forms, with or without 11 1.1 fredette * modification, are permitted provided that the following conditions 12 1.1 fredette * are met: 13 1.1 fredette * 1. Redistributions of source code must retain the above copyright 14 1.1 fredette * notice, this list of conditions and the following disclaimer. 15 1.1 fredette * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 fredette * notice, this list of conditions and the following disclaimer in the 17 1.1 fredette * documentation and/or other materials provided with the distribution. 18 1.1 fredette * 19 1.1 fredette * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 fredette * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 fredette * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 fredette * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 fredette * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 fredette * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 fredette * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 fredette * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 fredette * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 fredette * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 fredette * POSSIBILITY OF SUCH DAMAGE. 30 1.1 fredette */ 31 1.11 lukem 32 1.11 lukem #include <sys/cdefs.h> 33 1.21 thorpej __KERNEL_RCSID(0, "$NetBSD: obmem.c,v 1.21 2021/08/07 16:19:06 thorpej Exp $"); 34 1.1 fredette 35 1.1 fredette #include <sys/param.h> 36 1.1 fredette #include <sys/systm.h> 37 1.1 fredette #include <sys/device.h> 38 1.1 fredette 39 1.1 fredette #include <uvm/uvm_extern.h> 40 1.1 fredette 41 1.1 fredette #include <machine/autoconf.h> 42 1.1 fredette #include <machine/pmap.h> 43 1.1 fredette 44 1.1 fredette #include <sun2/sun2/control.h> 45 1.1 fredette #include <sun2/sun2/machdep.h> 46 1.1 fredette 47 1.17 tsutsui static int obmem_match(device_t, cfdata_t, void *); 48 1.17 tsutsui static void obmem_attach(device_t, device_t, void *); 49 1.1 fredette 50 1.1 fredette struct obmem_softc { 51 1.17 tsutsui device_t sc_dev; /* base device */ 52 1.1 fredette bus_space_tag_t sc_bustag; /* parent bus tag */ 53 1.1 fredette bus_dma_tag_t sc_dmatag; /* parent bus dma tag */ 54 1.1 fredette }; 55 1.1 fredette 56 1.17 tsutsui CFATTACH_DECL_NEW(obmem, sizeof(struct obmem_softc), 57 1.10 thorpej obmem_match, obmem_attach, NULL, NULL); 58 1.1 fredette 59 1.12 chs static int obmem_attached; 60 1.12 chs 61 1.13 chs static paddr_t obmem_bus_mmap(bus_space_tag_t, bus_type_t, bus_addr_t, 62 1.13 chs off_t, int, int); 63 1.13 chs static int _obmem_bus_map(bus_space_tag_t, bus_type_t, bus_addr_t, 64 1.13 chs bus_size_t, int, vaddr_t, bus_space_handle_t *); 65 1.1 fredette 66 1.3 fredette static struct sun68k_bus_space_tag obmem_space_tag = { 67 1.1 fredette NULL, /* cookie */ 68 1.1 fredette NULL, /* parent bus tag */ 69 1.1 fredette _obmem_bus_map, /* bus_space_map */ 70 1.1 fredette NULL, /* bus_space_unmap */ 71 1.1 fredette NULL, /* bus_space_subregion */ 72 1.1 fredette NULL, /* bus_space_barrier */ 73 1.1 fredette obmem_bus_mmap, /* bus_space_mmap */ 74 1.3 fredette NULL, /* bus_intr_establish */ 75 1.3 fredette NULL, /* bus_space_peek_N */ 76 1.3 fredette NULL /* bus_space_poke_N */ 77 1.19 msaitoh }; 78 1.1 fredette 79 1.13 chs static int 80 1.18 tsutsui obmem_match(device_t parent, cfdata_t cf, void *aux) 81 1.1 fredette { 82 1.4 fredette struct mainbus_attach_args *ma = aux; 83 1.1 fredette 84 1.12 chs if (obmem_attached) 85 1.12 chs return 0; 86 1.12 chs 87 1.17 tsutsui return ma->ma_name == NULL || strcmp(cf->cf_name, ma->ma_name) == 0; 88 1.1 fredette } 89 1.1 fredette 90 1.13 chs static void 91 1.17 tsutsui obmem_attach(device_t parent, device_t self, void *aux) 92 1.1 fredette { 93 1.4 fredette struct mainbus_attach_args *ma = aux; 94 1.17 tsutsui struct obmem_softc *sc = device_private(self); 95 1.4 fredette struct obmem_attach_args obma; 96 1.1 fredette const char *const *cpp; 97 1.1 fredette static const char *const special[] = { 98 1.1 fredette /* find these first */ 99 1.1 fredette NULL 100 1.1 fredette }; 101 1.1 fredette 102 1.12 chs obmem_attached = 1; 103 1.12 chs 104 1.17 tsutsui sc->sc_dev = self; 105 1.17 tsutsui aprint_normal("\n"); 106 1.1 fredette 107 1.4 fredette sc->sc_bustag = ma->ma_bustag; 108 1.4 fredette sc->sc_dmatag = ma->ma_dmatag; 109 1.1 fredette 110 1.1 fredette obmem_space_tag.cookie = sc; 111 1.1 fredette obmem_space_tag.parent = sc->sc_bustag; 112 1.1 fredette 113 1.1 fredette /* 114 1.1 fredette * Prepare the skeleton attach arguments for our devices. 115 1.1 fredette * The values we give in the locators are indications to 116 1.3 fredette * sun68k_bus_search about which locators must and must not 117 1.1 fredette * be defined. 118 1.1 fredette */ 119 1.4 fredette obma = *ma; 120 1.4 fredette obma.obma_bustag = &obmem_space_tag; 121 1.6 fredette obma.obma_paddr = LOCATOR_REQUIRED; 122 1.4 fredette obma.obma_pri = LOCATOR_OPTIONAL; 123 1.1 fredette 124 1.1 fredette /* Find all `early' obmem devices */ 125 1.1 fredette for (cpp = special; *cpp != NULL; cpp++) { 126 1.4 fredette obma.obma_name = *cpp; 127 1.20 thorpej config_search(self, &obma, 128 1.21 thorpej CFARGS(.search = sun68k_bus_search)); 129 1.1 fredette } 130 1.1 fredette 131 1.1 fredette /* Find all other obmem devices */ 132 1.4 fredette obma.obma_name = NULL; 133 1.20 thorpej config_search(self, &obma, 134 1.21 thorpej CFARGS(.search = sun68k_bus_search)); 135 1.1 fredette } 136 1.1 fredette 137 1.1 fredette int 138 1.13 chs _obmem_bus_map(bus_space_tag_t t, bus_type_t btype, bus_addr_t paddr, 139 1.13 chs bus_size_t size, int flags, vaddr_t vaddr, bus_space_handle_t *hp) 140 1.1 fredette { 141 1.1 fredette struct obmem_softc *sc = t->cookie; 142 1.1 fredette 143 1.17 tsutsui return bus_space_map2(sc->sc_bustag, PMAP_OBMEM, paddr, 144 1.17 tsutsui size, flags, vaddr, hp); 145 1.1 fredette } 146 1.1 fredette 147 1.5 fredette paddr_t 148 1.13 chs obmem_bus_mmap(bus_space_tag_t t, bus_type_t btype, bus_addr_t paddr, off_t off, 149 1.13 chs int prot, int flags) 150 1.1 fredette { 151 1.1 fredette struct obmem_softc *sc = t->cookie; 152 1.1 fredette 153 1.17 tsutsui return bus_space_mmap2(sc->sc_bustag, PMAP_OBMEM, paddr, off, 154 1.17 tsutsui prot, flags); 155 1.1 fredette } 156