summaryrefslogtreecommitdiffstats
path: root/rtemsbsd/freebsd/machine/bus.h
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@oarcorp.com>2012-07-06 10:57:12 -0500
committerJoel Sherrill <joel.sherrill@oarcorp.com>2012-07-06 10:57:12 -0500
commitdbda80875a56e0ad08169c0799e0458a0148d812 (patch)
treef678e5c50620b9f75b0f0a23aea9a56bfd89aa11 /rtemsbsd/freebsd/machine/bus.h
parentAdded back in a couple of methods. (diff)
downloadrtems-libbsd-dbda80875a56e0ad08169c0799e0458a0148d812.tar.bz2
Put CPU specific bus_space routines into separate files
The code in rtemsbsd/freebsd/machine/bus.h assumed that all bus space accesses were through memory in a simple fashion. The i386 has a true distinction between I/O and memory space which must be accounted for. This may not be the eventual structure of this code but we must have different bus space accessors for different hardware configurations. And in many, if not most, cases we will want these to be inlined for performance.
Diffstat (limited to 'rtemsbsd/freebsd/machine/bus.h')
-rw-r--r--rtemsbsd/freebsd/machine/bus.h570
1 files changed, 7 insertions, 563 deletions
diff --git a/rtemsbsd/freebsd/machine/bus.h b/rtemsbsd/freebsd/machine/bus.h
index a2b21954..f62ca45b 100644
--- a/rtemsbsd/freebsd/machine/bus.h
+++ b/rtemsbsd/freebsd/machine/bus.h
@@ -212,569 +212,13 @@ void
bus_space_free(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t size);
-static __inline void
-bus_space_barrier(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
- bus_size_t size, int flags)
-{
- /* Do nothing */
-}
-
-
-/*
- * Read 1 unit of data from bus space described by the tag, handle and ofs
- * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is returned.
- */
-static __inline uint8_t
-bus_space_read_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
-{
- uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
- return (*bsp);
-}
-
-static __inline uint16_t
-bus_space_read_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
-{
- uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
- return (*bsp);
-}
-
-static __inline uint32_t
-bus_space_read_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
-{
- uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
- return (*bsp);
-}
-
-static __inline uint64_t
-bus_space_read_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
-{
- uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
- return (*bsp);
-}
-
-
-/*
- * Write 1 unit of data to bus space described by the tag, handle and ofs
- * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is passed by value.
- */
-static __inline void
-bus_space_write_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
- uint8_t val)
-{
- uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
- *bsp = val;
-}
-
-static __inline void
-bus_space_write_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
- uint16_t val)
-{
- uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
- *bsp = val;
-}
-
-static __inline void
-bus_space_write_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
- uint32_t val)
-{
- uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
- *bsp = val;
-}
-
-static __inline void
-bus_space_write_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
- uint64_t val)
-{
- uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
- *bsp = val;
-}
-
-
-/*
- * Read count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is returned in the buffer passed by reference.
- */
-static __inline void
-bus_space_read_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint8_t *bufp, bus_size_t count)
-{
- uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bufp++ = *bsp;
- }
-}
-
-static __inline void
-bus_space_read_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint16_t *bufp, bus_size_t count)
-{
- uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bufp++ = *bsp;
- }
-}
-
-static __inline void
-bus_space_read_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint32_t *bufp, bus_size_t count)
-{
- uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bufp++ = *bsp;
- }
-}
-
-static __inline void
-bus_space_read_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint64_t *bufp, bus_size_t count)
-{
- uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bufp++ = *bsp;
- }
-}
-
-
-/*
- * Write count units of data to bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is read from the buffer passed by reference.
- */
-static __inline void
-bus_space_write_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, const uint8_t *bufp, bus_size_t count)
-{
- uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bsp = *bufp++;
- }
-}
-
-static __inline void
-bus_space_write_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, const uint16_t *bufp, bus_size_t count)
-{
- uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bsp = *bufp++;
- }
-}
-
-static __inline void
-bus_space_write_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, const uint32_t *bufp, bus_size_t count)
-{
- uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bsp = *bufp++;
- }
-}
-
-static __inline void
-bus_space_write_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, const uint64_t *bufp, bus_size_t count)
-{
- uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bsp = *bufp++;
- }
-}
-
-
-/*
- * Read count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is written to the buffer passed by reference and read from successive
- * bus space addresses. Access is unordered.
- */
-static __inline void
-bus_space_read_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint8_t *bufp, bus_size_t count)
-{
- while (count-- > 0) {
- uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
- *bufp++ = *bsp;
- ofs += 1;
- }
-}
-
-static __inline void
-bus_space_read_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint16_t *bufp, bus_size_t count)
-{
- while (count-- > 0) {
- uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
- *bufp++ = *bsp;
- ofs += 2;
- }
-}
-
-static __inline void
-bus_space_read_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint32_t *bufp, bus_size_t count)
-{
- while (count-- > 0) {
- uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
- *bufp++ = *bsp;
- ofs += 4;
- }
-}
-
-static __inline void
-bus_space_read_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint64_t *bufp, bus_size_t count)
-{
- while (count-- > 0) {
- uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
- *bufp++ = *bsp;
- ofs += 8;
- }
-}
-
-
-/*
- * Write count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is read from the buffer passed by reference and written to successive
- * bus space addresses. Access is unordered.
- */
-static __inline void
-bus_space_write_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, const uint8_t *bufp, bus_size_t count)
-{
- while (count-- > 0) {
- uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
- *bsp = *bufp++;
- ofs += 1;
- }
-}
-
-static __inline void
-bus_space_write_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, const uint16_t *bufp, bus_size_t count)
-{
- while (count-- > 0) {
- uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
- *bsp = *bufp++;
- ofs += 2;
- }
-}
-
-static __inline void
-bus_space_write_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, const uint32_t *bufp, bus_size_t count)
-{
- while (count-- > 0) {
- uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
- *bsp = *bufp++;
- ofs += 4;
- }
-}
-
-static __inline void
-bus_space_write_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, const uint64_t *bufp, bus_size_t count)
-{
- while (count-- > 0) {
- uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
- *bsp = *bufp++;
- ofs += 8;
- }
-}
-
-
-/*
- * Write count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is passed by value. Writes are unordered.
- */
-static __inline void
-bus_space_set_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint8_t val, bus_size_t count)
-{
- uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bsp = val;
- }
-}
-
-static __inline void
-bus_space_set_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint16_t val, bus_size_t count)
-{
- uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bsp = val;
- }
-}
-
-static __inline void
-bus_space_set_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint32_t val, bus_size_t count)
-{
- uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bsp = val;
- }
-}
-
-static __inline void
-bus_space_set_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint64_t val, bus_size_t count)
-{
- uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
- while (count-- > 0) {
- *bsp = val;
- }
-}
-
-
-/*
- * Write count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is passed by value and written to successive bus space addresses.
- * Writes are unordered.
- */
-static __inline void
-bus_space_set_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint8_t val, bus_size_t count)
-{
- while (count-- > 0) {
- uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
- *bsp = val;
- ofs += 1;
- }
-}
-
-static __inline void
-bus_space_set_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint16_t val, bus_size_t count)
-{
- while (count-- > 0) {
- uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
- *bsp = val;
- ofs += 2;
- }
-}
-
-static __inline void
-bus_space_set_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint32_t val, bus_size_t count)
-{
- while (count-- > 0) {
- uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
- *bsp = val;
- ofs += 4;
- }
-}
-
-static __inline void
-bus_space_set_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
- bus_size_t ofs, uint64_t val, bus_size_t count)
-{
- while (count-- > 0) {
- uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
- *bsp = val;
- ofs += 8;
- }
-}
-
-
-/*
- * Copy count units of data from bus space described by the tag and the first
- * handle and ofs pair to bus space described by the tag and the second handle
- * and ofs pair. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes.
- * The data is read from successive bus space addresses and also written to
- * successive bus space addresses. Both reads and writes are unordered.
- */
-static __inline void
-bus_space_copy_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
- bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
-{
- bus_addr_t dst = bsh1 + ofs1;
- bus_addr_t src = bsh2 + ofs2;
- uint8_t __volatile *dstp = (uint8_t __volatile *) dst;
- uint8_t __volatile *srcp = (uint8_t __volatile *) src;
- if (dst > src) {
- src += count - 1;
- dst += count - 1;
- while (count-- > 0) {
- *dstp = *srcp;
- src -= 1;
- dst -= 1;
- }
- } else {
- while (count-- > 0) {
- *dstp = *srcp;
- src += 1;
- dst += 1;
- }
- }
-}
-
-static __inline void
-bus_space_copy_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
- bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
-{
- bus_addr_t dst = bsh1 + ofs1;
- bus_addr_t src = bsh2 + ofs2;
- uint16_t __volatile *dstp = (uint16_t __volatile *) dst;
- uint16_t __volatile *srcp = (uint16_t __volatile *) src;
- if (dst > src) {
- src += (count - 1) << 1;
- dst += (count - 1) << 1;
- while (count-- > 0) {
- *dstp = *srcp;
- src -= 2;
- dst -= 2;
- }
- } else {
- while (count-- > 0) {
- *dstp = *srcp;
- src += 2;
- dst += 2;
- }
- }
-}
-
-static __inline void
-bus_space_copy_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
- bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
-{
- bus_addr_t dst = bsh1 + ofs1;
- bus_addr_t src = bsh2 + ofs2;
- uint32_t __volatile *dstp = (uint32_t __volatile *) dst;
- uint32_t __volatile *srcp = (uint32_t __volatile *) src;
- if (dst > src) {
- src += (count - 1) << 2;
- dst += (count - 1) << 2;
- while (count-- > 0) {
- *dstp = *srcp;
- src -= 4;
- dst -= 4;
- }
- } else {
- while (count-- > 0) {
- *dstp = *srcp;
- src += 4;
- dst += 4;
- }
- }
-}
-
-static __inline void
-bus_space_copy_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
- bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
-{
- bus_addr_t dst = bsh1 + ofs1;
- bus_addr_t src = bsh2 + ofs2;
- uint64_t __volatile *dstp = (uint64_t __volatile *) dst;
- uint64_t __volatile *srcp = (uint64_t __volatile *) src;
- if (dst > src) {
- src += (count - 1) << 3;
- dst += (count - 1) << 3;
- while (count-- > 0) {
- *dstp = *srcp;
- src -= 8;
- dst -= 8;
- }
- } else {
- while (count-- > 0) {
- *dstp = *srcp;
- src += 8;
- dst += 8;
- }
- }
-}
-
-
-/*
- * Stream accesses are the same as normal accesses on RTEMS; there are no
- * supported bus systems with an endianess different from the host one.
- */
-#define bus_space_read_stream_1(t, h, o) \
- bus_space_read_1(t, h, o)
-#define bus_space_read_stream_2(t, h, o) \
- bus_space_read_2(t, h, o)
-#define bus_space_read_stream_4(t, h, o) \
- bus_space_read_4(t, h, o)
-#define bus_space_read_stream_8(t, h, o) \
- bus_space_read_8(t, h, o)
-
-#define bus_space_read_multi_stream_1(t, h, o, a, c) \
- bus_space_read_multi_1(t, h, o, a, c)
-#define bus_space_read_multi_stream_2(t, h, o, a, c) \
- bus_space_read_multi_2(t, h, o, a, c)
-#define bus_space_read_multi_stream_4(t, h, o, a, c) \
- bus_space_read_multi_4(t, h, o, a, c)
-#define bus_space_read_multi_stream_8(t, h, o, a, c) \
- bus_space_read_multi_8(t, h, o, a, c)
-
-#define bus_space_write_stream_1(t, h, o, v) \
- bus_space_write_1(t, h, o, v)
-#define bus_space_write_stream_2(t, h, o, v) \
- bus_space_write_2(t, h, o, v)
-#define bus_space_write_stream_4(t, h, o, v) \
- bus_space_write_4(t, h, o, v)
-#define bus_space_write_stream_8(t, h, o, v) \
- bus_space_write_8(t, h, o, v)
-
-#define bus_space_write_multi_stream_1(t, h, o, a, c) \
- bus_space_write_multi_1(t, h, o, a, c)
-#define bus_space_write_multi_stream_2(t, h, o, a, c) \
- bus_space_write_multi_2(t, h, o, a, c)
-#define bus_space_write_multi_stream_4(t, h, o, a, c) \
- bus_space_write_multi_4(t, h, o, a, c)
-#define bus_space_write_multi_stream_8(t, h, o, a, c) \
- bus_space_write_multi_8(t, h, o, a, c)
-
-#define bus_space_set_multi_stream_1(t, h, o, v, c) \
- bus_space_set_multi_1(t, h, o, v, c)
-#define bus_space_set_multi_stream_2(t, h, o, v, c) \
- bus_space_set_multi_2(t, h, o, v, c)
-#define bus_space_set_multi_stream_4(t, h, o, v, c) \
- bus_space_set_multi_4(t, h, o, v, c)
-#define bus_space_set_multi_stream_8(t, h, o, v, c) \
- bus_space_set_multi_8(t, h, o, v, c)
-
-#define bus_space_read_region_stream_1(t, h, o, a, c) \
- bus_space_read_region_1(t, h, o, a, c)
-#define bus_space_read_region_stream_2(t, h, o, a, c) \
- bus_space_read_region_2(t, h, o, a, c)
-#define bus_space_read_region_stream_4(t, h, o, a, c) \
- bus_space_read_region_4(t, h, o, a, c)
-#define bus_space_read_region_stream_8(t, h, o, a, c) \
- bus_space_read_region_8(t, h, o, a, c)
-
-#define bus_space_write_region_stream_1(t, h, o, a, c) \
- bus_space_write_region_1(t, h, o, a, c)
-#define bus_space_write_region_stream_2(t, h, o, a, c) \
- bus_space_write_region_2(t, h, o, a, c)
-#define bus_space_write_region_stream_4(t, h, o, a, c) \
- bus_space_write_region_4(t, h, o, a, c)
-#define bus_space_write_region_stream_8(t, h, o, a, c) \
- bus_space_write_region_8(t, h, o, a, c)
-
-#define bus_space_set_region_stream_1(t, h, o, v, c) \
- bus_space_set_region_1(t, h, o, v, c)
-#define bus_space_set_region_stream_2(t, h, o, v, c) \
- bus_space_set_region_2(t, h, o, v, c)
-#define bus_space_set_region_stream_4(t, h, o, v, c) \
- bus_space_set_region_4(t, h, o, v, c)
-#define bus_space_set_region_stream_8(t, h, o, v, c) \
- bus_space_set_region_8(t, h, o, v, c)
-
-#define bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c) \
- bus_space_copy_region_1(t, h1, o1, h2, o2, c)
-#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \
- bus_space_copy_region_2(t, h1, o1, h2, o2, c)
-#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \
- bus_space_copy_region_4(t, h1, o1, h2, o2, c)
-#define bus_space_copy_region_stream_8(t, h1, o1, h2, o2, c) \
- bus_space_copy_region_8(t, h1, o1, h2, o2, c)
+#if defined(__i386__)
+ #include <freebsd/machine/bus_space-i386.h>
+#elif defined(__ppc__)
+ #include <freebsd/machine/bus_space-simple_memory.h>
+#else
+ #error "Bus space routines not implemented for this architecture!!"
+#endif
#include <freebsd/machine/bus_dma.h>