#ifndef _MACHINE_BUS_H_
#define _MACHINE_BUS_H_
typedef u_long bus_addr_t;
typedef u_long bus_size_t;
typedef u_long bus_space_handle_t;
typedef struct luna88k_bus_space_tag *bus_space_tag_t;
struct luna88k_bus_space_tag {
uint8_t bs_stride_1;
uint8_t bs_stride_2;
uint8_t bs_stride_4;
uint8_t bs_stride_8;
bus_size_t bs_offset;
uint bs_flags;
#define TAG_LITTLE_ENDIAN 0x01
};
#define SET_TAG_BIG_ENDIAN(t) ((t))->bs_flags &= ~TAG_LITTLE_ENDIAN
#define SET_TAG_LITTLE_ENDIAN(t) ((t))->bs_flags |= TAG_LITTLE_ENDIAN
#define IS_TAG_LITTLE_ENDIAN(t) ((t)->bs_flags & TAG_LITTLE_ENDIAN)
#define BUS_SPACE_MAP_CACHEABLE 0x01
#define BUS_SPACE_MAP_LINEAR 0x02
static __inline__ int
bus_space_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, int flags,
bus_space_handle_t *bshp)
{
*bshp = (bus_space_handle_t)(bpa + (t->bs_offset));
return 0;
}
static __inline__ void
bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
{
return;
}
static __inline__ int
bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
{
*nbshp = bsh + offset;
return 0;
}
#define bus_space_read_1(t, h, o) \
(*(volatile u_int8_t *)((h) + ((o) << (t->bs_stride_1))))
#define __bus_space_read_2(t, h, o) \
(*(volatile u_int16_t *)((h) + ((o) << (t->bs_stride_2))))
#define __bus_space_read_4(t, h, o) \
(*(volatile u_int32_t *)((h) + ((o) << (t->bs_stride_4))))
#define bus_space_read_2(t, h, o) \
((IS_TAG_LITTLE_ENDIAN(t)) ? \
letoh16(__bus_space_read_2(t, h, o)) : \
__bus_space_read_2(t, h, o))
#define bus_space_read_4(t, h, o) \
((IS_TAG_LITTLE_ENDIAN(t)) ? \
letoh32(__bus_space_read_4(t, h, o)) : \
__bus_space_read_4(t, h, o))
#if 0
#define bus_space_read_8(t, h, o) !!! bus_space_read_8 unimplemented !!!
#endif
static __inline__ void
bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t *dest, size_t count)
{
while ((int)--count >= 0)
*dest++ = bus_space_read_1(tag, handle, offset);
}
static __inline__ void
bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int16_t *dest, size_t count)
{
while ((int)--count >= 0)
*dest++ = bus_space_read_2(tag, handle, offset);
}
static __inline__ void
bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int32_t *dest, size_t count)
{
while ((int)--count >= 0)
*dest++ = bus_space_read_4(tag, handle, offset);
}
#if 0
#define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!!
#endif
static __inline__ void
bus_space_read_raw_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t *dest, size_t size)
{
size >>= 1;
while ((int)--size >= 0) {
*(u_int16_t *)dest =
__bus_space_read_2(tag, handle, offset);
dest += 2;
}
}
static __inline__ void
bus_space_read_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t *dest, size_t size)
{
size >>= 2;
while ((int)--size >= 0) {
*(u_int32_t *)dest =
__bus_space_read_4(tag, handle, offset);
dest += 4;
}
}
static __inline__ void
bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t *dest, size_t count)
{
while ((int)--count >= 0)
*dest++ = bus_space_read_1(tag, handle, offset++);
}
static __inline__ void
bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int16_t *dest, size_t count)
{
while ((int)--count >= 0) {
*dest++ = bus_space_read_2(tag, handle, offset);
offset += 2;
}
}
static __inline__ void
bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int32_t *dest, size_t count)
{
while ((int)--count >= 0) {
*dest++ = bus_space_read_4(tag, handle, offset);
offset += 4;
}
}
#if 0
#define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!!
#endif
#define bus_space_write_1(t, h, o, v) \
((void)(*(volatile u_int8_t *)((h) + ((o) << (t->bs_stride_1))) = (v)))
#define __bus_space_write_2(t, h, o, v) \
((void)(*(volatile u_int16_t *)((h) + ((o) << (t->bs_stride_2))) = (v)))
#define __bus_space_write_4(t, h, o, v) \
((void)(*(volatile u_int32_t *)((h) + ((o) << (t->bs_stride_4))) = (v)))
#define bus_space_write_2(t, h, o, v) \
__bus_space_write_2(t, h, o, \
(IS_TAG_LITTLE_ENDIAN(t)) ? htole16(v) : (v))
#define bus_space_write_4(t, h, o, v) \
__bus_space_write_4(t, h, o, \
(IS_TAG_LITTLE_ENDIAN(t)) ? htole32(v) : (v))
#if 0
#define bus_space_write_8 !!! bus_space_write_8 not implemented !!!
#endif
static __inline__ void
bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t *dest, size_t count)
{
while ((int)--count >= 0)
bus_space_write_1(tag, handle, offset, *dest++);
}
static __inline__ void
bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int16_t *dest, size_t count)
{
while ((int)--count >= 0)
bus_space_write_2(tag, handle, offset, *dest++);
}
static __inline__ void
bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int32_t *dest, size_t count)
{
while ((int)--count >= 0)
bus_space_write_4(tag, handle, offset, *dest++);
}
#if 0
#define bus_space_write_multi_8(t, h, o, a, c) \
!!! bus_space_write_multi_8 unimplemented !!!
#endif
static __inline__ void
bus_space_write_raw_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t *dest, size_t size)
{
size >>= 1;
while ((int)--size >= 0) {
__bus_space_write_2(tag, handle, offset,*(u_int16_t *)dest);
dest += 2;
}
}
static __inline__ void
bus_space_write_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t *dest, size_t size)
{
size >>= 2;
while ((int)--size >= 0) {
__bus_space_write_4(tag, handle, offset, *(u_int32_t *)dest);
dest += 4;
}
}
static __inline__ void
bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t *dest, size_t count)
{
while ((int)--count >= 0)
bus_space_write_1(tag, handle, offset++, *dest++);
}
static __inline__ void
bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int16_t *dest, size_t count)
{
while ((int)--count >= 0) {
bus_space_write_2(tag, handle, offset, *dest++);
offset += 2;
}
}
static __inline__ void
bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int32_t *dest, size_t count)
{
while ((int)--count >= 0) {
bus_space_write_4(tag, handle, offset, *dest++);
offset += 4;
}
}
#if 0
#define bus_space_write_region_8 \
!!! bus_space_write_region_8 unimplemented !!!
#endif
static __inline__ void
bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t value, size_t count)
{
while ((int)--count >= 0)
bus_space_write_1(tag, handle, offset, value);
}
static __inline__ void
bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int16_t value, size_t count)
{
while ((int)--count >= 0)
bus_space_write_2(tag, handle, offset, value);
}
static __inline__ void
bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int32_t value, size_t count)
{
while ((int)--count >= 0)
bus_space_write_4(tag, handle, offset, value);
}
#if 0
#define bus_space_set_multi_8 \
!!! bus_space_set_multi_8 unimplemented !!!
#endif
static __inline__ void
bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int8_t value, size_t count)
{
while ((int)--count >= 0)
bus_space_write_1(tag, handle, offset++, value);
}
static __inline__ void
bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int16_t value, size_t count)
{
while ((int)--count >= 0) {
bus_space_write_2(tag, handle, offset, value);
offset += 2;
}
}
static __inline__ void
bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
bus_addr_t offset, u_int32_t value, size_t count)
{
while ((int)--count >= 0) {
bus_space_write_4(tag, handle, offset, value);
offset += 4;
}
}
#if 0
#define bus_space_set_region_8 \
!!! bus_space_set_region_8 unimplemented !!!
#endif
#define __LUNA88K_copy_N(BYTES) \
static __inline void __CONCAT(bus_space_copy_,BYTES) \
(bus_space_tag_t, \
bus_space_handle_t bsh1, bus_size_t off1, \
bus_space_handle_t bsh2, bus_size_t off2, \
bus_size_t count); \
\
static __inline void \
__CONCAT(bus_space_copy_,BYTES)(bus_space_tag_t t, bus_space_handle_t h1,\
bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) \
{ \
bus_size_t o; \
\
if ((h1 + o1) >= (h2 + o2)) { \
\
for (o = 0; c != 0; c--, o += BYTES) \
__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \
__CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
} else { \
\
for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES) \
__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \
__CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
} \
}
__LUNA88K_copy_N(1)
__LUNA88K_copy_N(2)
__LUNA88K_copy_N(4)
#if 0
#define bus_space_copy_8 \
!!! bus_space_copy_8 unimplemented !!!
#endif
#undef __LUNA88K_copy_N
#define bus_space_barrier(t, h, o, l, f) \
((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
#define BUS_SPACE_BARRIER_READ 0x01
#define BUS_SPACE_BARRIER_WRITE 0x02
#endif