#include <sys/param.h>
#include <sys/device.h>
#include <sys/systm.h>
#include <machine/cpu.h>
#include <machine/pte.h>
#include <sys/cdefs.h>
__KERNEL_RCSID(1, "$NetBSD: amiga_bus_simple_1word.c,v 1.9 2014/08/06 14:23:53 joerg Exp $");
#define AMIGA_SIMPLE_BUS_STRIDE 1
#define AMIGA_SIMPLE_BUS_WORD_METHODS
#define AMIGA_SIMPLE_BUS_LONGWORD_METHODS
#include "simple_busfuncs.c"
bsr(oabs(bsr2_swap_), u_int16_t);
bsw(oabs(bsw2_swap_), u_int16_t);
bsr(oabs(bsr4_swap_), u_int32_t);
bsw(oabs(bsw4_swap_), u_int32_t);
bsrm(oabs(bsrm2_swap_), u_int16_t);
bswm(oabs(bswm2_swap_), u_int16_t);
int oabs(bsm_absolute_)(bus_space_tag_t, bus_addr_t, bus_size_t, int,
bus_space_handle_t *);
int
oabs(bsm_absolute_)(bus_space_tag_t tag, bus_addr_t address,
bus_size_t size, int flags, bus_space_handle_t *handlep)
{
uint32_t pa = kvtop((void*) tag->base);
*handlep = tag->base + (address - pa) * AMIGA_SIMPLE_BUS_STRIDE;
return 0;
}
u_int16_t
oabs(bsr2_swap_)(bus_space_handle_t handle, bus_size_t offset)
{
volatile u_int16_t *p;
u_int16_t x;
p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
x = *p;
amiga_bus_reorder_protect();
return bswap16(x);
}
void
oabs(bsw2_swap_)(bus_space_handle_t handle, bus_size_t offset, unsigned value)
{
volatile u_int16_t *p;
p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
*p = bswap16( (u_int16_t)value );
amiga_bus_reorder_protect();
}
u_int32_t
oabs(bsr4_swap_)(bus_space_handle_t handle, bus_size_t offset)
{
volatile u_int32_t *p;
u_int32_t x;
p = (volatile u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
x = *p;
amiga_bus_reorder_protect();
return bswap32(x);
}
void
oabs(bsw4_swap_)(bus_space_handle_t handle, bus_size_t offset, unsigned value)
{
volatile u_int32_t *p;
p = (volatile u_int32_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
*p = bswap32( (u_int32_t)value );
amiga_bus_reorder_protect();
}
void
oabs(bsrm2_swap_)(bus_space_handle_t handle, bus_size_t offset,
u_int16_t *pointer, bus_size_t count)
{
volatile u_int16_t *p;
p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
while (count > 0) {
*pointer++ = bswap16(*p);
amiga_bus_reorder_protect();
--count;
}
}
void
oabs(bswm2_swap_)(bus_space_handle_t handle, bus_size_t offset,
const u_int16_t *pointer, bus_size_t count)
{
volatile u_int16_t *p;
p = (volatile u_int16_t *)(handle + offset * AMIGA_SIMPLE_BUS_STRIDE);
while (count > 0) {
*p = bswap16(*pointer);
amiga_bus_reorder_protect();
++pointer;
--count;
}
}
const struct amiga_bus_space_methods amiga_bus_stride_1swap_abs = {
.bsm = oabs(bsm_absolute_),
.bsms = oabs(bsms_),
.bsu = oabs(bsu_),
.bsa = NULL,
.bsf = NULL,
.bsr1 = oabs(bsr1_),
.bsw1 = oabs(bsw1_),
.bsrm1 = oabs(bsrm1_),
.bswm1 = oabs(bswm1_),
.bsrr1 = oabs(bsrr1_),
.bswr1 = oabs(bswr1_),
.bssr1 = oabs(bssr1_),
.bscr1 = oabs(bscr1_),
.bsr2 = oabs(bsr2_),
.bsw2 = oabs(bsw2_),
.bsrs2 = oabs(bsr2_),
.bsws2 = oabs(bsw2_),
.bsrm2 = oabs(bsrm2_swap_),
.bswm2 = oabs(bswm2_swap_),
.bsrms2 = oabs(bsrm2_),
.bswms2 = oabs(bswm2_),
.bsrr2 = oabs(bsrr2_),
.bswr2 = oabs(bswr2_),
.bssr2 = oabs(bssr2_),
.bscr2 = oabs(bscr2_),
.bsr4 = oabs(bsr4_swap_),
.bsw4 = oabs(bsw4_swap_),
.bsrs4 = oabs(bsr4_),
.bsws4 = oabs(bsw4_),
.bsrm4 = oabs(bsrm4_),
.bswm4 = oabs(bswm4_),
.bsrms4 = oabs(bsrm4_),
.bswms4 = oabs(bswm4_),
.bsrr4 = oabs(bsrr4_),
.bswr4 = oabs(bswr4_),
.bsrrs4 = oabs(bsrr4_),
.bswrs4 = oabs(bswr4_),
.bssr4 = oabs(bssr4_),
.bscr4 = oabs(bscr4_)
};
const struct amiga_bus_space_methods amiga_bus_stride_1swap = {
.bsm = oabs(bsm_),
.bsms = oabs(bsms_),
.bsu = oabs(bsu_),
.bsa = NULL,
.bsf = NULL,
.bsr1 = oabs(bsr1_),
.bsw1 = oabs(bsw1_),
.bsrm1 = oabs(bsrm1_),
.bswm1 = oabs(bswm1_),
.bsrr1 = oabs(bsrr1_),
.bswr1 = oabs(bswr1_),
.bssr1 = oabs(bssr1_),
.bscr1 = oabs(bscr1_),
.bsr2 = oabs(bsr2_swap_),
.bsw2 = oabs(bsw2_swap_),
.bsrs2 = oabs(bsr2_),
.bsws2 = oabs(bsw2_),
.bsrm2 = oabs(bsrm2_swap_),
.bswm2 = oabs(bswm2_swap_),
.bsrms2 = oabs(bsrm2_),
.bswms2 = oabs(bswm2_),
.bsrr2 = oabs(bsrr2_),
.bswr2 = oabs(bswr2_),
.bsrrs2 = oabs(bsrr2_),
.bswrs2 = oabs(bswr2_),
.bssr2 = oabs(bssr2_),
.bscr2 = oabs(bscr2_),
.bsr4 = oabs(bsr4_swap_),
.bsw4 = oabs(bsw4_swap_),
.bsrs4 = oabs(bsr4_),
.bsws4 = oabs(bsw4_),
.bsrm4 = oabs(bsrm4_),
.bswm4 = oabs(bswm4_),
.bsrms4 = oabs(bsrm4_),
.bswms4 = oabs(bswm4_),
.bsrr4 = oabs(bsrr4_),
.bswr4 = oabs(bswr4_),
.bsrrs4 = oabs(bsrr4_),
.bswrs4 = oabs(bswr4_),
.bssr4 = oabs(bssr4_),
.bscr4 = oabs(bscr4_)
};