Home | History | Annotate | Line # | Download | only in g1
      1 /*	$NetBSD: g1bus_bus_mem.c,v 1.1 2016/12/29 11:49:05 tsutsui Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Jason R. Thorpe.
      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  *
     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.
     30  */
     31 
     32 /*
     33  * Bus space implementation for the SEGA G1 bus, for GD-ROM and IDE port.
     34  */
     35 
     36 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
     37 __KERNEL_RCSID(0, "$NetBSD: g1bus_bus_mem.c,v 1.1 2016/12/29 11:49:05 tsutsui Exp $");
     38 
     39 #include <sys/param.h>
     40 #include <sys/systm.h>
     41 #include <sys/device.h>
     42 #include <sys/bus.h>
     43 
     44 #include <machine/cpu.h>
     45 
     46 #include <dreamcast/dev/g1/g1busvar.h>
     47 
     48 int	g1bus_bus_mem_map(void *, bus_addr_t, bus_size_t, int,
     49 	    bus_space_handle_t *);
     50 void	g1bus_bus_mem_unmap(void *, bus_space_handle_t, bus_size_t);
     51 int	g1bus_bus_mem_subregion(void *, bus_space_handle_t, bus_size_t,
     52 	    bus_size_t, bus_space_handle_t *);
     53 paddr_t	g1bus_bus_mem_mmap(void *, bus_addr_t, off_t, int, int);
     54 
     55 uint8_t g1bus_bus_mem_read_1(void *, bus_space_handle_t, bus_size_t);
     56 uint16_t g1bus_bus_mem_read_2(void *, bus_space_handle_t, bus_size_t);
     57 uint32_t g1bus_bus_mem_read_4(void *, bus_space_handle_t, bus_size_t);
     58 
     59 void	g1bus_bus_mem_write_1(void *, bus_space_handle_t, bus_size_t,
     60 	    uint8_t);
     61 void	g1bus_bus_mem_write_2(void *, bus_space_handle_t, bus_size_t,
     62 	    uint16_t);
     63 void	g1bus_bus_mem_write_4(void *, bus_space_handle_t, bus_size_t,
     64 	    uint32_t);
     65 
     66 void	g1bus_bus_mem_read_region_1(void *, bus_space_handle_t, bus_size_t,
     67 	    uint8_t *, bus_size_t);
     68 void	g1bus_bus_mem_read_region_2(void *, bus_space_handle_t, bus_size_t,
     69 	    uint16_t *, bus_size_t);
     70 void	g1bus_bus_mem_read_region_4(void *, bus_space_handle_t, bus_size_t,
     71 	    uint32_t *, bus_size_t);
     72 
     73 void	g1bus_bus_mem_write_region_1(void *, bus_space_handle_t, bus_size_t,
     74 	    const uint8_t *, bus_size_t);
     75 void	g1bus_bus_mem_write_region_2(void *, bus_space_handle_t, bus_size_t,
     76 	    const uint16_t *, bus_size_t);
     77 void	g1bus_bus_mem_write_region_4(void *, bus_space_handle_t, bus_size_t,
     78 	    const uint32_t *, bus_size_t);
     79 
     80 void	g1bus_bus_mem_set_region_4(void *, bus_space_handle_t, bus_size_t,
     81 	    uint32_t, bus_size_t);
     82 
     83 void	g1bus_bus_mem_read_multi_1(void *, bus_space_handle_t,
     84 	    bus_size_t, uint8_t *, bus_size_t);
     85 void	g1bus_bus_mem_read_multi_2(void *, bus_space_handle_t,
     86 	    bus_size_t, uint16_t *, bus_size_t);
     87 
     88 void	g1bus_bus_mem_write_multi_1(void *, bus_space_handle_t,
     89 	    bus_size_t, const uint8_t *, bus_size_t);
     90 void	g1bus_bus_mem_write_multi_2(void *, bus_space_handle_t,
     91 	    bus_size_t, const uint16_t *, bus_size_t);
     92 
     93 void
     94 g1bus_bus_mem_init(struct g1bus_softc *sc)
     95 {
     96 	bus_space_tag_t t = &sc->sc_memt;
     97 
     98 	memset(t, 0, sizeof(*t));
     99 
    100 	t->dbs_map = g1bus_bus_mem_map;
    101 	t->dbs_unmap = g1bus_bus_mem_unmap;
    102 	t->dbs_subregion = g1bus_bus_mem_subregion;
    103 	t->dbs_mmap = g1bus_bus_mem_mmap;
    104 
    105 	t->dbs_r_1 = g1bus_bus_mem_read_1;
    106 	t->dbs_r_2 = g1bus_bus_mem_read_2;
    107 	t->dbs_r_4 = g1bus_bus_mem_read_4;
    108 
    109 	t->dbs_w_1 = g1bus_bus_mem_write_1;
    110 	t->dbs_w_2 = g1bus_bus_mem_write_2;
    111 	t->dbs_w_4 = g1bus_bus_mem_write_4;
    112 
    113 	t->dbs_rm_1 = g1bus_bus_mem_read_multi_1;
    114 	t->dbs_rm_2 = g1bus_bus_mem_read_multi_2;
    115 
    116 	t->dbs_wm_1 = g1bus_bus_mem_write_multi_1;
    117 	t->dbs_wm_2 = g1bus_bus_mem_write_multi_2;
    118 
    119 	t->dbs_rr_1 = g1bus_bus_mem_read_region_1;
    120 	t->dbs_rr_2 = g1bus_bus_mem_read_region_2;
    121 	t->dbs_rr_4 = g1bus_bus_mem_read_region_4;
    122 
    123 	t->dbs_wr_1 = g1bus_bus_mem_write_region_1;
    124 	t->dbs_wr_2 = g1bus_bus_mem_write_region_2;
    125 	t->dbs_wr_4 = g1bus_bus_mem_write_region_4;
    126 
    127 	t->dbs_sr_4 = g1bus_bus_mem_set_region_4;
    128 }
    129 
    130 int
    131 g1bus_bus_mem_map(void *v, bus_addr_t addr, bus_size_t size, int flags,
    132     bus_space_handle_t *shp)
    133 {
    134 
    135 	KASSERT((addr & SH3_PHYS_MASK) == addr);
    136 	*shp = SH3_PHYS_TO_P2SEG(addr);
    137 
    138 	return 0;
    139 }
    140 
    141 void
    142 g1bus_bus_mem_unmap(void *v, bus_space_handle_t sh, bus_size_t size)
    143 {
    144 
    145 	KASSERT(sh >= SH3_P2SEG_BASE && sh <= SH3_P2SEG_END);
    146 	/* Nothing to do. */
    147 }
    148 
    149 int
    150 g1bus_bus_mem_subregion(void *v, bus_space_handle_t handle, bus_size_t offset,
    151     bus_size_t size, bus_space_handle_t *nhandlep)
    152 {
    153 
    154 	*nhandlep = handle + offset;
    155 	return 0;
    156 }
    157 
    158 paddr_t
    159 g1bus_bus_mem_mmap(void *v, bus_addr_t addr, off_t offset, int prot, int flags)
    160 {
    161 
    162 	/* XXX not implemented */
    163 	return -1;
    164 }
    165 
    166 uint8_t
    167 g1bus_bus_mem_read_1(void *v, bus_space_handle_t sh, bus_size_t off)
    168 {
    169 	uint8_t rv;
    170 
    171 	rv = *(volatile uint8_t *)(sh + off);
    172 
    173 	return rv;
    174 }
    175 
    176 uint16_t
    177 g1bus_bus_mem_read_2(void *v, bus_space_handle_t sh, bus_size_t off)
    178 {
    179 	uint16_t rv;
    180 
    181 	rv = *(volatile uint16_t *)(sh + off);
    182 
    183 	return rv;
    184 }
    185 
    186 uint32_t
    187 g1bus_bus_mem_read_4(void *v, bus_space_handle_t sh, bus_size_t off)
    188 {
    189 	uint32_t rv;
    190 
    191 	rv = *(volatile uint32_t *)(sh + off);
    192 
    193 	return rv;
    194 }
    195 
    196 void
    197 g1bus_bus_mem_write_1(void *v, bus_space_handle_t sh, bus_size_t off,
    198     uint8_t val)
    199 {
    200 
    201 	*(volatile uint8_t *)(sh + off) = val;
    202 }
    203 
    204 void
    205 g1bus_bus_mem_write_2(void *v, bus_space_handle_t sh, bus_size_t off,
    206     uint16_t val)
    207 {
    208 
    209 	*(volatile uint16_t *)(sh + off) = val;
    210 }
    211 
    212 void
    213 g1bus_bus_mem_write_4(void *v, bus_space_handle_t sh, bus_size_t off,
    214     uint32_t val)
    215 {
    216 
    217 	*(volatile uint32_t *)(sh + off) = val;
    218 }
    219 
    220 void
    221 g1bus_bus_mem_read_multi_1(void *v, bus_space_handle_t sh,
    222     bus_size_t off, uint8_t *addr, bus_size_t len)
    223 {
    224 	volatile const uint8_t *baddr = (uint8_t *)(sh + off);
    225 
    226 	while (len--)
    227 		*addr++ = *baddr;
    228 }
    229 
    230 void
    231 g1bus_bus_mem_read_multi_2(void *v, bus_space_handle_t sh,
    232     bus_size_t off, uint16_t *addr, bus_size_t len)
    233 {
    234 	volatile uint16_t *baddr = (uint16_t *)(sh + off);
    235 
    236 	while (len--)
    237 		*addr++ = *baddr;
    238 }
    239 
    240 void
    241 g1bus_bus_mem_write_multi_1(void *v, bus_space_handle_t sh,
    242     bus_size_t off, const uint8_t *addr, bus_size_t len)
    243 {
    244 	volatile uint8_t *baddr = (uint8_t *)(sh + off);
    245 
    246 	while (len--)
    247 		*baddr = *addr++;
    248 }
    249 
    250 void
    251 g1bus_bus_mem_write_multi_2(void *v, bus_space_handle_t sh,
    252     bus_size_t off, const uint16_t *addr, bus_size_t len)
    253 {
    254 	volatile uint16_t *baddr = (uint16_t *)(sh + off);
    255 
    256 	while (len--)
    257 		*baddr = *addr++;
    258 }
    259 
    260 void
    261 g1bus_bus_mem_read_region_1(void *v, bus_space_handle_t sh, bus_size_t off,
    262     uint8_t *addr, bus_size_t len)
    263 {
    264 	volatile const uint8_t *baddr = (uint8_t *)(sh + off);
    265 
    266 	while (len--)
    267 		*addr++ = *baddr++;
    268 }
    269 
    270 void
    271 g1bus_bus_mem_read_region_2(void *v, bus_space_handle_t sh, bus_size_t off,
    272     uint16_t *addr, bus_size_t len)
    273 {
    274 	volatile const uint16_t *baddr = (uint16_t *)(sh + off);
    275 
    276 	while (len--)
    277 		*addr++ = *baddr++;
    278 }
    279 
    280 void
    281 g1bus_bus_mem_read_region_4(void *v, bus_space_handle_t sh, bus_size_t off,
    282     uint32_t *addr, bus_size_t len)
    283 {
    284 	volatile const uint32_t *baddr = (uint32_t *)(sh + off);
    285 
    286 	while (len--)
    287 		*addr++ = *baddr++;
    288 }
    289 
    290 void
    291 g1bus_bus_mem_write_region_1(void *v, bus_space_handle_t sh, bus_size_t off,
    292     const uint8_t *addr, bus_size_t len)
    293 {
    294 	volatile uint8_t *baddr = (uint8_t *)(sh + off);
    295 
    296 	while (len--)
    297 		*baddr++ = *addr++;
    298 }
    299 
    300 void
    301 g1bus_bus_mem_write_region_2(void *v, bus_space_handle_t sh, bus_size_t off,
    302     const uint16_t *addr, bus_size_t len)
    303 {
    304 	volatile uint16_t *baddr = (uint16_t *)(sh + off);
    305 
    306 	while (len--)
    307 		*baddr++ = *addr++;
    308 }
    309 
    310 void
    311 g1bus_bus_mem_write_region_4(void *v, bus_space_handle_t sh, bus_size_t off,
    312     const uint32_t *addr, bus_size_t len)
    313 {
    314 	volatile uint32_t *baddr = (uint32_t *)(sh + off);
    315 
    316 	while (len--)
    317 		*baddr++ = *addr++;
    318 }
    319 
    320 void
    321 g1bus_bus_mem_set_region_4(void *v, bus_space_handle_t sh, bus_size_t off,
    322     uint32_t val, bus_size_t len)
    323 {
    324 	volatile uint32_t *baddr = (uint32_t *)(sh + off);
    325 
    326 	while (len--)
    327 		*baddr++ = val;
    328 }
    329