Home | History | Annotate | Line # | Download | only in amiga
      1 /* $NetBSD: amiga_bus_simple_1word.c,v 1.9 2014/08/06 14:23:53 joerg Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 1999 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Ignatios Souvatzis.
      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 #include <sys/param.h>
     32 #include <sys/device.h>
     33 #include <sys/systm.h>
     34 
     35 #include <machine/cpu.h>
     36 #include <machine/pte.h>
     37 
     38 #include <sys/cdefs.h>
     39 __KERNEL_RCSID(1, "$NetBSD: amiga_bus_simple_1word.c,v 1.9 2014/08/06 14:23:53 joerg Exp $");
     40 
     41 #define AMIGA_SIMPLE_BUS_STRIDE 1		/* 1 byte per byte */
     42 #define AMIGA_SIMPLE_BUS_WORD_METHODS
     43 #define AMIGA_SIMPLE_BUS_LONGWORD_METHODS
     44 
     45 #include "simple_busfuncs.c"
     46 
     47 bsr(oabs(bsr2_swap_), u_int16_t);
     48 bsw(oabs(bsw2_swap_), u_int16_t);
     49 bsr(oabs(bsr4_swap_), u_int32_t);
     50 bsw(oabs(bsw4_swap_), u_int32_t);
     51 
     52 bsrm(oabs(bsrm2_swap_), u_int16_t);
     53 bswm(oabs(bswm2_swap_), u_int16_t);
     54 
     55 int oabs(bsm_absolute_)(bus_space_tag_t, bus_addr_t, bus_size_t, int,
     56 			bus_space_handle_t *);
     57 
     58 /* ARGSUSED */
     59 int
     60 oabs(bsm_absolute_)(bus_space_tag_t tag, bus_addr_t address,
     61 	bus_size_t size, int flags, bus_space_handle_t *handlep)
     62 {
     63 	uint32_t pa = kvtop((void*) tag->base);
     64 	*handlep = tag->base + (address - pa) * AMIGA_SIMPLE_BUS_STRIDE;
     65 	return 0;
     66 }
     67 
     68 /* ARGSUSED */
     69 u_int16_t
     70 oabs(bsr2_swap_)(bus_space_handle_t handle, bus_size_t offset)
     71 {
     72 	volatile u_int16_t *p;
     73 	u_int16_t x;
     74 
     75 	p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
     76 	x = *p;
     77 	amiga_bus_reorder_protect();
     78 	return bswap16(x);
     79 }
     80 
     81 /* ARGSUSED */
     82 void
     83 oabs(bsw2_swap_)(bus_space_handle_t handle, bus_size_t offset, unsigned value)
     84 {
     85 	volatile u_int16_t *p;
     86 
     87 	p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
     88 	*p = bswap16( (u_int16_t)value );
     89 	amiga_bus_reorder_protect();
     90 }
     91 
     92 /* ARGSUSED */
     93 u_int32_t
     94 oabs(bsr4_swap_)(bus_space_handle_t handle, bus_size_t offset)
     95 {
     96 	volatile u_int32_t *p;
     97 	u_int32_t x;
     98 
     99 	p = (volatile u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
    100 	x = *p;
    101 	amiga_bus_reorder_protect();
    102 	return bswap32(x);
    103 }
    104 
    105 /* ARGSUSED */
    106 void
    107 oabs(bsw4_swap_)(bus_space_handle_t handle, bus_size_t offset, unsigned value)
    108 {
    109 	volatile u_int32_t *p;
    110 
    111 	p = (volatile u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
    112 	*p = bswap32( (u_int32_t)value );
    113 	amiga_bus_reorder_protect();
    114 }
    115 
    116 /* ARGSUSED */
    117 void
    118 oabs(bsrm2_swap_)(bus_space_handle_t handle, bus_size_t offset,
    119 			u_int16_t *pointer, bus_size_t count)
    120 {
    121 	volatile u_int16_t *p;
    122 
    123 	p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
    124 
    125 	while (count > 0) {
    126 		*pointer++ = bswap16(*p);
    127 		amiga_bus_reorder_protect();
    128 		--count;
    129 	}
    130 }
    131 
    132 /* ARGSUSED */
    133 void
    134 oabs(bswm2_swap_)(bus_space_handle_t handle, bus_size_t offset,
    135 			const u_int16_t *pointer, bus_size_t count)
    136 {
    137         volatile u_int16_t *p;
    138 
    139         p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
    140 
    141         while (count > 0) {
    142                 *p = bswap16(*pointer);
    143                 amiga_bus_reorder_protect();
    144                 ++pointer;
    145                 --count;
    146         }
    147 }
    148 
    149 const struct amiga_bus_space_methods amiga_bus_stride_1swap_abs = {
    150 
    151 	.bsm =		oabs(bsm_absolute_),
    152 	.bsms =		oabs(bsms_),
    153 	.bsu =		oabs(bsu_),
    154 	.bsa =		NULL,
    155 	.bsf =		NULL,
    156 
    157 	.bsr1 =		oabs(bsr1_),
    158 	.bsw1 =		oabs(bsw1_),
    159 	.bsrm1 =	oabs(bsrm1_),
    160 	.bswm1 =	oabs(bswm1_),
    161 	.bsrr1 =	oabs(bsrr1_),
    162 	.bswr1 =	oabs(bswr1_),
    163 	.bssr1 =	oabs(bssr1_),
    164 	.bscr1 =	oabs(bscr1_),
    165 
    166 	.bsr2 =		oabs(bsr2_),            /* XXX swap? */
    167 	.bsw2 =		oabs(bsw2_),            /* XXX swap? */
    168 	.bsrs2 =	oabs(bsr2_),
    169 	.bsws2 =	oabs(bsw2_),
    170 	.bsrm2 =	oabs(bsrm2_swap_),
    171 	.bswm2 =	oabs(bswm2_swap_),
    172 	.bsrms2 =	oabs(bsrm2_),
    173 	.bswms2 =	oabs(bswm2_),
    174 	.bsrr2 =	oabs(bsrr2_),           /* XXX swap? */
    175 	.bswr2 =	oabs(bswr2_),           /* XXX swap? */
    176 	.bssr2 =	oabs(bssr2_),           /* XXX swap? */
    177 	.bscr2 =	oabs(bscr2_),           /* XXX swap? */
    178 
    179 	.bsr4 =		oabs(bsr4_swap_),
    180 	.bsw4 =		oabs(bsw4_swap_),
    181 	.bsrs4 =	oabs(bsr4_),
    182 	.bsws4 =	oabs(bsw4_),
    183 	.bsrm4 =	oabs(bsrm4_),		/* XXX swap? */
    184 	.bswm4 =	oabs(bswm4_),		/* XXX swap? */
    185 	.bsrms4 =	oabs(bsrm4_),
    186 	.bswms4 =	oabs(bswm4_),
    187 	.bsrr4 =	oabs(bsrr4_),		/* XXX swap? */
    188 	.bswr4 =	oabs(bswr4_),		/* XXX swap? */
    189 	.bsrrs4 =	oabs(bsrr4_),
    190 	.bswrs4 =	oabs(bswr4_),
    191 	.bssr4 =	oabs(bssr4_),		/* XXX swap? */
    192 	.bscr4 =	oabs(bscr4_)		/* XXX swap? */
    193 };
    194 
    195 const struct amiga_bus_space_methods amiga_bus_stride_1swap = {
    196 
    197 	.bsm =		oabs(bsm_),
    198 	.bsms =		oabs(bsms_),
    199 	.bsu =		oabs(bsu_),
    200 	.bsa =		NULL,
    201 	.bsf =		NULL,
    202 
    203 	.bsr1 =		oabs(bsr1_),
    204 	.bsw1 =		oabs(bsw1_),
    205 	.bsrm1 =	oabs(bsrm1_),
    206 	.bswm1 =	oabs(bswm1_),
    207 	.bsrr1 =	oabs(bsrr1_),
    208 	.bswr1 =	oabs(bswr1_),
    209 	.bssr1 =	oabs(bssr1_),
    210 	.bscr1 =	oabs(bscr1_),
    211 
    212 	.bsr2 =		oabs(bsr2_swap_),
    213 	.bsw2 =		oabs(bsw2_swap_),
    214 	.bsrs2 =	oabs(bsr2_),
    215 	.bsws2 =	oabs(bsw2_),
    216 	.bsrm2 =	oabs(bsrm2_swap_),
    217 	.bswm2 =	oabs(bswm2_swap_),
    218 	.bsrms2 =	oabs(bsrm2_),
    219 	.bswms2 =	oabs(bswm2_),
    220 	.bsrr2 =	oabs(bsrr2_),		/* XXX swap? */
    221 	.bswr2 =	oabs(bswr2_),		/* XXX swap? */
    222 	.bsrrs2 =	oabs(bsrr2_),
    223 	.bswrs2 =	oabs(bswr2_),
    224 	.bssr2 =	oabs(bssr2_),		/* XXX swap? */
    225 	.bscr2 =	oabs(bscr2_),		/* XXX swap? */
    226 
    227 	.bsr4 =		oabs(bsr4_swap_),
    228 	.bsw4 =		oabs(bsw4_swap_),
    229 	.bsrs4 =	oabs(bsr4_),
    230 	.bsws4 =	oabs(bsw4_),
    231 	.bsrm4 =	oabs(bsrm4_),		/* XXX swap? */
    232 	.bswm4 =	oabs(bswm4_),		/* XXX swap? */
    233 	.bsrms4 =	oabs(bsrm4_),
    234 	.bswms4 =	oabs(bswm4_),
    235 	.bsrr4 =	oabs(bsrr4_),		/* XXX swap? */
    236 	.bswr4 =	oabs(bswr4_),		/* XXX swap? */
    237 	.bsrrs4 =	oabs(bsrr4_),
    238 	.bswrs4 =	oabs(bswr4_),
    239 	.bssr4 = 	oabs(bssr4_),		/* XXX swap? */
    240 	.bscr4 =	oabs(bscr4_)		/* XXX swap? */
    241 };
    242