1 1.1 tsutsui /* $NetBSD: g1bus_bus_mem.c,v 1.1 2016/12/29 11:49:05 tsutsui Exp $ */ 2 1.1 tsutsui 3 1.1 tsutsui /*- 4 1.1 tsutsui * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 1.1 tsutsui * All rights reserved. 6 1.1 tsutsui * 7 1.1 tsutsui * This code is derived from software contributed to The NetBSD Foundation 8 1.1 tsutsui * by Jason R. Thorpe. 9 1.1 tsutsui * 10 1.1 tsutsui * Redistribution and use in source and binary forms, with or without 11 1.1 tsutsui * modification, are permitted provided that the following conditions 12 1.1 tsutsui * are met: 13 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright 14 1.1 tsutsui * notice, this list of conditions and the following disclaimer. 15 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the 17 1.1 tsutsui * documentation and/or other materials provided with the distribution. 18 1.1 tsutsui * 19 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 tsutsui * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 tsutsui * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 tsutsui * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 tsutsui * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 tsutsui * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 tsutsui * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 tsutsui * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 tsutsui * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 tsutsui * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 tsutsui * POSSIBILITY OF SUCH DAMAGE. 30 1.1 tsutsui */ 31 1.1 tsutsui 32 1.1 tsutsui /* 33 1.1 tsutsui * Bus space implementation for the SEGA G1 bus, for GD-ROM and IDE port. 34 1.1 tsutsui */ 35 1.1 tsutsui 36 1.1 tsutsui #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ 37 1.1 tsutsui __KERNEL_RCSID(0, "$NetBSD: g1bus_bus_mem.c,v 1.1 2016/12/29 11:49:05 tsutsui Exp $"); 38 1.1 tsutsui 39 1.1 tsutsui #include <sys/param.h> 40 1.1 tsutsui #include <sys/systm.h> 41 1.1 tsutsui #include <sys/device.h> 42 1.1 tsutsui #include <sys/bus.h> 43 1.1 tsutsui 44 1.1 tsutsui #include <machine/cpu.h> 45 1.1 tsutsui 46 1.1 tsutsui #include <dreamcast/dev/g1/g1busvar.h> 47 1.1 tsutsui 48 1.1 tsutsui int g1bus_bus_mem_map(void *, bus_addr_t, bus_size_t, int, 49 1.1 tsutsui bus_space_handle_t *); 50 1.1 tsutsui void g1bus_bus_mem_unmap(void *, bus_space_handle_t, bus_size_t); 51 1.1 tsutsui int g1bus_bus_mem_subregion(void *, bus_space_handle_t, bus_size_t, 52 1.1 tsutsui bus_size_t, bus_space_handle_t *); 53 1.1 tsutsui paddr_t g1bus_bus_mem_mmap(void *, bus_addr_t, off_t, int, int); 54 1.1 tsutsui 55 1.1 tsutsui uint8_t g1bus_bus_mem_read_1(void *, bus_space_handle_t, bus_size_t); 56 1.1 tsutsui uint16_t g1bus_bus_mem_read_2(void *, bus_space_handle_t, bus_size_t); 57 1.1 tsutsui uint32_t g1bus_bus_mem_read_4(void *, bus_space_handle_t, bus_size_t); 58 1.1 tsutsui 59 1.1 tsutsui void g1bus_bus_mem_write_1(void *, bus_space_handle_t, bus_size_t, 60 1.1 tsutsui uint8_t); 61 1.1 tsutsui void g1bus_bus_mem_write_2(void *, bus_space_handle_t, bus_size_t, 62 1.1 tsutsui uint16_t); 63 1.1 tsutsui void g1bus_bus_mem_write_4(void *, bus_space_handle_t, bus_size_t, 64 1.1 tsutsui uint32_t); 65 1.1 tsutsui 66 1.1 tsutsui void g1bus_bus_mem_read_region_1(void *, bus_space_handle_t, bus_size_t, 67 1.1 tsutsui uint8_t *, bus_size_t); 68 1.1 tsutsui void g1bus_bus_mem_read_region_2(void *, bus_space_handle_t, bus_size_t, 69 1.1 tsutsui uint16_t *, bus_size_t); 70 1.1 tsutsui void g1bus_bus_mem_read_region_4(void *, bus_space_handle_t, bus_size_t, 71 1.1 tsutsui uint32_t *, bus_size_t); 72 1.1 tsutsui 73 1.1 tsutsui void g1bus_bus_mem_write_region_1(void *, bus_space_handle_t, bus_size_t, 74 1.1 tsutsui const uint8_t *, bus_size_t); 75 1.1 tsutsui void g1bus_bus_mem_write_region_2(void *, bus_space_handle_t, bus_size_t, 76 1.1 tsutsui const uint16_t *, bus_size_t); 77 1.1 tsutsui void g1bus_bus_mem_write_region_4(void *, bus_space_handle_t, bus_size_t, 78 1.1 tsutsui const uint32_t *, bus_size_t); 79 1.1 tsutsui 80 1.1 tsutsui void g1bus_bus_mem_set_region_4(void *, bus_space_handle_t, bus_size_t, 81 1.1 tsutsui uint32_t, bus_size_t); 82 1.1 tsutsui 83 1.1 tsutsui void g1bus_bus_mem_read_multi_1(void *, bus_space_handle_t, 84 1.1 tsutsui bus_size_t, uint8_t *, bus_size_t); 85 1.1 tsutsui void g1bus_bus_mem_read_multi_2(void *, bus_space_handle_t, 86 1.1 tsutsui bus_size_t, uint16_t *, bus_size_t); 87 1.1 tsutsui 88 1.1 tsutsui void g1bus_bus_mem_write_multi_1(void *, bus_space_handle_t, 89 1.1 tsutsui bus_size_t, const uint8_t *, bus_size_t); 90 1.1 tsutsui void g1bus_bus_mem_write_multi_2(void *, bus_space_handle_t, 91 1.1 tsutsui bus_size_t, const uint16_t *, bus_size_t); 92 1.1 tsutsui 93 1.1 tsutsui void 94 1.1 tsutsui g1bus_bus_mem_init(struct g1bus_softc *sc) 95 1.1 tsutsui { 96 1.1 tsutsui bus_space_tag_t t = &sc->sc_memt; 97 1.1 tsutsui 98 1.1 tsutsui memset(t, 0, sizeof(*t)); 99 1.1 tsutsui 100 1.1 tsutsui t->dbs_map = g1bus_bus_mem_map; 101 1.1 tsutsui t->dbs_unmap = g1bus_bus_mem_unmap; 102 1.1 tsutsui t->dbs_subregion = g1bus_bus_mem_subregion; 103 1.1 tsutsui t->dbs_mmap = g1bus_bus_mem_mmap; 104 1.1 tsutsui 105 1.1 tsutsui t->dbs_r_1 = g1bus_bus_mem_read_1; 106 1.1 tsutsui t->dbs_r_2 = g1bus_bus_mem_read_2; 107 1.1 tsutsui t->dbs_r_4 = g1bus_bus_mem_read_4; 108 1.1 tsutsui 109 1.1 tsutsui t->dbs_w_1 = g1bus_bus_mem_write_1; 110 1.1 tsutsui t->dbs_w_2 = g1bus_bus_mem_write_2; 111 1.1 tsutsui t->dbs_w_4 = g1bus_bus_mem_write_4; 112 1.1 tsutsui 113 1.1 tsutsui t->dbs_rm_1 = g1bus_bus_mem_read_multi_1; 114 1.1 tsutsui t->dbs_rm_2 = g1bus_bus_mem_read_multi_2; 115 1.1 tsutsui 116 1.1 tsutsui t->dbs_wm_1 = g1bus_bus_mem_write_multi_1; 117 1.1 tsutsui t->dbs_wm_2 = g1bus_bus_mem_write_multi_2; 118 1.1 tsutsui 119 1.1 tsutsui t->dbs_rr_1 = g1bus_bus_mem_read_region_1; 120 1.1 tsutsui t->dbs_rr_2 = g1bus_bus_mem_read_region_2; 121 1.1 tsutsui t->dbs_rr_4 = g1bus_bus_mem_read_region_4; 122 1.1 tsutsui 123 1.1 tsutsui t->dbs_wr_1 = g1bus_bus_mem_write_region_1; 124 1.1 tsutsui t->dbs_wr_2 = g1bus_bus_mem_write_region_2; 125 1.1 tsutsui t->dbs_wr_4 = g1bus_bus_mem_write_region_4; 126 1.1 tsutsui 127 1.1 tsutsui t->dbs_sr_4 = g1bus_bus_mem_set_region_4; 128 1.1 tsutsui } 129 1.1 tsutsui 130 1.1 tsutsui int 131 1.1 tsutsui g1bus_bus_mem_map(void *v, bus_addr_t addr, bus_size_t size, int flags, 132 1.1 tsutsui bus_space_handle_t *shp) 133 1.1 tsutsui { 134 1.1 tsutsui 135 1.1 tsutsui KASSERT((addr & SH3_PHYS_MASK) == addr); 136 1.1 tsutsui *shp = SH3_PHYS_TO_P2SEG(addr); 137 1.1 tsutsui 138 1.1 tsutsui return 0; 139 1.1 tsutsui } 140 1.1 tsutsui 141 1.1 tsutsui void 142 1.1 tsutsui g1bus_bus_mem_unmap(void *v, bus_space_handle_t sh, bus_size_t size) 143 1.1 tsutsui { 144 1.1 tsutsui 145 1.1 tsutsui KASSERT(sh >= SH3_P2SEG_BASE && sh <= SH3_P2SEG_END); 146 1.1 tsutsui /* Nothing to do. */ 147 1.1 tsutsui } 148 1.1 tsutsui 149 1.1 tsutsui int 150 1.1 tsutsui g1bus_bus_mem_subregion(void *v, bus_space_handle_t handle, bus_size_t offset, 151 1.1 tsutsui bus_size_t size, bus_space_handle_t *nhandlep) 152 1.1 tsutsui { 153 1.1 tsutsui 154 1.1 tsutsui *nhandlep = handle + offset; 155 1.1 tsutsui return 0; 156 1.1 tsutsui } 157 1.1 tsutsui 158 1.1 tsutsui paddr_t 159 1.1 tsutsui g1bus_bus_mem_mmap(void *v, bus_addr_t addr, off_t offset, int prot, int flags) 160 1.1 tsutsui { 161 1.1 tsutsui 162 1.1 tsutsui /* XXX not implemented */ 163 1.1 tsutsui return -1; 164 1.1 tsutsui } 165 1.1 tsutsui 166 1.1 tsutsui uint8_t 167 1.1 tsutsui g1bus_bus_mem_read_1(void *v, bus_space_handle_t sh, bus_size_t off) 168 1.1 tsutsui { 169 1.1 tsutsui uint8_t rv; 170 1.1 tsutsui 171 1.1 tsutsui rv = *(volatile uint8_t *)(sh + off); 172 1.1 tsutsui 173 1.1 tsutsui return rv; 174 1.1 tsutsui } 175 1.1 tsutsui 176 1.1 tsutsui uint16_t 177 1.1 tsutsui g1bus_bus_mem_read_2(void *v, bus_space_handle_t sh, bus_size_t off) 178 1.1 tsutsui { 179 1.1 tsutsui uint16_t rv; 180 1.1 tsutsui 181 1.1 tsutsui rv = *(volatile uint16_t *)(sh + off); 182 1.1 tsutsui 183 1.1 tsutsui return rv; 184 1.1 tsutsui } 185 1.1 tsutsui 186 1.1 tsutsui uint32_t 187 1.1 tsutsui g1bus_bus_mem_read_4(void *v, bus_space_handle_t sh, bus_size_t off) 188 1.1 tsutsui { 189 1.1 tsutsui uint32_t rv; 190 1.1 tsutsui 191 1.1 tsutsui rv = *(volatile uint32_t *)(sh + off); 192 1.1 tsutsui 193 1.1 tsutsui return rv; 194 1.1 tsutsui } 195 1.1 tsutsui 196 1.1 tsutsui void 197 1.1 tsutsui g1bus_bus_mem_write_1(void *v, bus_space_handle_t sh, bus_size_t off, 198 1.1 tsutsui uint8_t val) 199 1.1 tsutsui { 200 1.1 tsutsui 201 1.1 tsutsui *(volatile uint8_t *)(sh + off) = val; 202 1.1 tsutsui } 203 1.1 tsutsui 204 1.1 tsutsui void 205 1.1 tsutsui g1bus_bus_mem_write_2(void *v, bus_space_handle_t sh, bus_size_t off, 206 1.1 tsutsui uint16_t val) 207 1.1 tsutsui { 208 1.1 tsutsui 209 1.1 tsutsui *(volatile uint16_t *)(sh + off) = val; 210 1.1 tsutsui } 211 1.1 tsutsui 212 1.1 tsutsui void 213 1.1 tsutsui g1bus_bus_mem_write_4(void *v, bus_space_handle_t sh, bus_size_t off, 214 1.1 tsutsui uint32_t val) 215 1.1 tsutsui { 216 1.1 tsutsui 217 1.1 tsutsui *(volatile uint32_t *)(sh + off) = val; 218 1.1 tsutsui } 219 1.1 tsutsui 220 1.1 tsutsui void 221 1.1 tsutsui g1bus_bus_mem_read_multi_1(void *v, bus_space_handle_t sh, 222 1.1 tsutsui bus_size_t off, uint8_t *addr, bus_size_t len) 223 1.1 tsutsui { 224 1.1 tsutsui volatile const uint8_t *baddr = (uint8_t *)(sh + off); 225 1.1 tsutsui 226 1.1 tsutsui while (len--) 227 1.1 tsutsui *addr++ = *baddr; 228 1.1 tsutsui } 229 1.1 tsutsui 230 1.1 tsutsui void 231 1.1 tsutsui g1bus_bus_mem_read_multi_2(void *v, bus_space_handle_t sh, 232 1.1 tsutsui bus_size_t off, uint16_t *addr, bus_size_t len) 233 1.1 tsutsui { 234 1.1 tsutsui volatile uint16_t *baddr = (uint16_t *)(sh + off); 235 1.1 tsutsui 236 1.1 tsutsui while (len--) 237 1.1 tsutsui *addr++ = *baddr; 238 1.1 tsutsui } 239 1.1 tsutsui 240 1.1 tsutsui void 241 1.1 tsutsui g1bus_bus_mem_write_multi_1(void *v, bus_space_handle_t sh, 242 1.1 tsutsui bus_size_t off, const uint8_t *addr, bus_size_t len) 243 1.1 tsutsui { 244 1.1 tsutsui volatile uint8_t *baddr = (uint8_t *)(sh + off); 245 1.1 tsutsui 246 1.1 tsutsui while (len--) 247 1.1 tsutsui *baddr = *addr++; 248 1.1 tsutsui } 249 1.1 tsutsui 250 1.1 tsutsui void 251 1.1 tsutsui g1bus_bus_mem_write_multi_2(void *v, bus_space_handle_t sh, 252 1.1 tsutsui bus_size_t off, const uint16_t *addr, bus_size_t len) 253 1.1 tsutsui { 254 1.1 tsutsui volatile uint16_t *baddr = (uint16_t *)(sh + off); 255 1.1 tsutsui 256 1.1 tsutsui while (len--) 257 1.1 tsutsui *baddr = *addr++; 258 1.1 tsutsui } 259 1.1 tsutsui 260 1.1 tsutsui void 261 1.1 tsutsui g1bus_bus_mem_read_region_1(void *v, bus_space_handle_t sh, bus_size_t off, 262 1.1 tsutsui uint8_t *addr, bus_size_t len) 263 1.1 tsutsui { 264 1.1 tsutsui volatile const uint8_t *baddr = (uint8_t *)(sh + off); 265 1.1 tsutsui 266 1.1 tsutsui while (len--) 267 1.1 tsutsui *addr++ = *baddr++; 268 1.1 tsutsui } 269 1.1 tsutsui 270 1.1 tsutsui void 271 1.1 tsutsui g1bus_bus_mem_read_region_2(void *v, bus_space_handle_t sh, bus_size_t off, 272 1.1 tsutsui uint16_t *addr, bus_size_t len) 273 1.1 tsutsui { 274 1.1 tsutsui volatile const uint16_t *baddr = (uint16_t *)(sh + off); 275 1.1 tsutsui 276 1.1 tsutsui while (len--) 277 1.1 tsutsui *addr++ = *baddr++; 278 1.1 tsutsui } 279 1.1 tsutsui 280 1.1 tsutsui void 281 1.1 tsutsui g1bus_bus_mem_read_region_4(void *v, bus_space_handle_t sh, bus_size_t off, 282 1.1 tsutsui uint32_t *addr, bus_size_t len) 283 1.1 tsutsui { 284 1.1 tsutsui volatile const uint32_t *baddr = (uint32_t *)(sh + off); 285 1.1 tsutsui 286 1.1 tsutsui while (len--) 287 1.1 tsutsui *addr++ = *baddr++; 288 1.1 tsutsui } 289 1.1 tsutsui 290 1.1 tsutsui void 291 1.1 tsutsui g1bus_bus_mem_write_region_1(void *v, bus_space_handle_t sh, bus_size_t off, 292 1.1 tsutsui const uint8_t *addr, bus_size_t len) 293 1.1 tsutsui { 294 1.1 tsutsui volatile uint8_t *baddr = (uint8_t *)(sh + off); 295 1.1 tsutsui 296 1.1 tsutsui while (len--) 297 1.1 tsutsui *baddr++ = *addr++; 298 1.1 tsutsui } 299 1.1 tsutsui 300 1.1 tsutsui void 301 1.1 tsutsui g1bus_bus_mem_write_region_2(void *v, bus_space_handle_t sh, bus_size_t off, 302 1.1 tsutsui const uint16_t *addr, bus_size_t len) 303 1.1 tsutsui { 304 1.1 tsutsui volatile uint16_t *baddr = (uint16_t *)(sh + off); 305 1.1 tsutsui 306 1.1 tsutsui while (len--) 307 1.1 tsutsui *baddr++ = *addr++; 308 1.1 tsutsui } 309 1.1 tsutsui 310 1.1 tsutsui void 311 1.1 tsutsui g1bus_bus_mem_write_region_4(void *v, bus_space_handle_t sh, bus_size_t off, 312 1.1 tsutsui const uint32_t *addr, bus_size_t len) 313 1.1 tsutsui { 314 1.1 tsutsui volatile uint32_t *baddr = (uint32_t *)(sh + off); 315 1.1 tsutsui 316 1.1 tsutsui while (len--) 317 1.1 tsutsui *baddr++ = *addr++; 318 1.1 tsutsui } 319 1.1 tsutsui 320 1.1 tsutsui void 321 1.1 tsutsui g1bus_bus_mem_set_region_4(void *v, bus_space_handle_t sh, bus_size_t off, 322 1.1 tsutsui uint32_t val, bus_size_t len) 323 1.1 tsutsui { 324 1.1 tsutsui volatile uint32_t *baddr = (uint32_t *)(sh + off); 325 1.1 tsutsui 326 1.1 tsutsui while (len--) 327 1.1 tsutsui *baddr++ = val; 328 1.1 tsutsui } 329