Subject: Re: Missing bus_space_* things
To: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
From: Martin Husemann <martin@duskware.de>
List: port-sgimips
Date: 06/06/2006 22:19:22
--mYCpIKhGyMATD0i+
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
On Tue, Jun 06, 2006 at 06:00:06PM +0900, Izumi Tsutsui wrote:
> It looks only SGIMIPS_BUS_SPACE_IO and SGIMIPS_BUS_SPACE_MEM
> require byteswapping on stream ops.
Ok - like this?
Martin
--mYCpIKhGyMATD0i+
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=patch
Index: include/bus.h
===================================================================
RCS file: /cvsroot/src/sys/arch/sgimips/include/bus.h,v
retrieving revision 1.20
diff -c -u -p -r1.20 bus.h
--- include/bus.h 26 May 2006 13:23:34 -0000 1.20
+++ include/bus.h 6 Jun 2006 20:18:04 -0000
@@ -151,6 +151,27 @@ u_int32_t bus_space_read_4(bus_space_tag
u_int64_t bus_space_read_8(bus_space_tag_t, bus_space_handle_t, bus_size_t);
/*
+ * u_intN_t bus_space_read_stream_N(bus_space_tag_t tag,
+ * bus_space_handle_t bsh, bus_size_t offset);
+ *
+ * Read a 1, 2, 4, or 8 byte quantity from bus space
+ * described by tag/handle/offset, but w/o any byte order changes.
+ */
+
+static __inline u_int8_t
+bus_space_read_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
+{
+ return bus_space_read_1(t, h, o);
+}
+
+u_int16_t bus_space_read_stream_2(bus_space_tag_t, bus_space_handle_t,
+ bus_size_t);
+u_int32_t bus_space_read_stream_4(bus_space_tag_t, bus_space_handle_t,
+ bus_size_t);
+u_int64_t bus_space_read_stream_8(bus_space_tag_t, bus_space_handle_t,
+ bus_size_t);
+
+/*
* void bus_space_read_multi_N(bus_space_tag_t tag,
* bus_space_handle_t bsh, bus_size_t offset,
* u_intN_t *addr, size_t count);
@@ -159,7 +180,7 @@ u_int64_t bus_space_read_8(bus_space_tag
* described by tag/handle/offset and copy into buffer provided.
*/
-#define __SGIMIPS_bus_space_read_multi(BYTES,BITS) \
+#define __SGIMIPS_bus_space_read_multi(BYTES,BITS) \
static __inline void __CONCAT(bus_space_read_multi_,BYTES) \
(bus_space_tag_t, bus_space_handle_t, bus_size_t, \
__PB_TYPENAME(BITS) *, size_t); \
@@ -187,6 +208,29 @@ __SGIMIPS_bus_space_read_multi(4,32)
#undef __SGIMIPS_bus_space_read_multi
+#define __SGIMIPS_bus_space_read_multi_stream(BYTES,BITS) \
+static __inline void __CONCAT(bus_space_read_multi_stream_,BYTES) \
+ (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
+ __PB_TYPENAME(BITS) *, size_t); \
+ \
+static __inline void \
+__CONCAT(bus_space_read_multi_stream_,BYTES)(t, h, o, a, c) \
+ bus_space_tag_t t; \
+ bus_space_handle_t h; \
+ bus_size_t o; \
+ __PB_TYPENAME(BITS) *a; \
+ size_t c; \
+{ \
+ \
+ while (c--) \
+ *a++ = __CONCAT(bus_space_read_stream_,BYTES)(t, h, o); \
+}
+
+__SGIMIPS_bus_space_read_multi_stream(1,8)
+__SGIMIPS_bus_space_read_multi_stream(2,16)
+__SGIMIPS_bus_space_read_multi_stream(4,32)
+#undef __SGIMIPS_bus_space_read_multi_stream
+
/*
* void bus_space_read_region_N(bus_space_tag_t tag,
* bus_space_handle_t bsh, bus_size_t offset,
@@ -246,6 +290,29 @@ void bus_space_write_8(bus_space_tag_t,
u_int64_t);
/*
+ * void bus_space_write_stream_N(bus_space_tag_t tag,
+ * bus_space_handle_t bsh, bus_size_t offset,
+ * u_intN_t value);
+ *
+ * Write the 1, 2, 4, or 8 byte value `value' to bus space
+ * described by tag/handle/offset. Do not adjust byte order.
+ */
+
+static __inline void
+bus_space_write_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
+ u_int8_t v)
+{
+ bus_space_write_1(t, h, o, v);
+}
+
+void bus_space_write_stream_2(bus_space_tag_t, bus_space_handle_t,
+ bus_size_t, u_int16_t);
+void bus_space_write_stream_4(bus_space_tag_t, bus_space_handle_t,
+ bus_size_t, u_int32_t);
+void bus_space_write_stream_8(bus_space_tag_t, bus_space_handle_t,
+ bus_size_t, u_int64_t);
+
+/*
* void bus_space_write_multi_N(bus_space_tag_t tag,
* bus_space_handle_t bsh, bus_size_t offset,
* const u_intN_t *addr, size_t count);
@@ -283,6 +350,30 @@ __SGIMIPS_bus_space_write_multi(4,32)
#undef __SGIMIPS_bus_space_write_multi
+#define __SGIMIPS_bus_space_write_multi_stream(BYTES,BITS) \
+static __inline void __CONCAT(bus_space_write_multi_stream_,BYTES) \
+ (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
+ const __PB_TYPENAME(BITS) *, size_t); \
+ \
+static __inline void \
+__CONCAT(bus_space_write_multi_stream_,BYTES)(t, h, o, a, c) \
+ bus_space_tag_t t; \
+ bus_space_handle_t h; \
+ bus_size_t o; \
+ const __PB_TYPENAME(BITS) *a; \
+ size_t c; \
+{ \
+ \
+ while (c--) \
+ __CONCAT(bus_space_write_stream_,BYTES)(t, h, o, *a++); \
+}
+
+__SGIMIPS_bus_space_write_multi_stream(1,8)
+__SGIMIPS_bus_space_write_multi_stream(2,16)
+__SGIMIPS_bus_space_write_multi_stream(4,32)
+
+#undef __SGIMIPS_bus_space_write_multi_stream
+
/*
* void bus_space_write_region_N(bus_space_tag_t tag,
* bus_space_handle_t bsh, bus_size_t offset,
@@ -332,7 +423,7 @@ __SGIMIPS_bus_space_write_region(4,32)
* by tag/handle/offset `count' times.
*/
-#define __SGIMIPS_bus_space_set_multi(BYTES,BITS) \
+#define __SGIMIPS_bus_space_set_multi(BYTES,BITS) \
static __inline void __CONCAT(bus_space_set_multi_,BYTES) \
(bus_space_tag_t, bus_space_handle_t, bus_size_t, \
__PB_TYPENAME(BITS), size_t); \
@@ -370,7 +461,7 @@ __SGIMIPS_bus_space_set_multi(4,32)
* by tag/handle starting at `offset'.
*/
-#define __SGIMIPS_bus_space_set_region(BYTES,BITS) \
+#define __SGIMIPS_bus_space_set_region(BYTES,BITS) \
static __inline void __CONCAT(bus_space_set_region_,BYTES) \
(bus_space_tag_t, bus_space_handle_t, bus_size_t, \
__PB_TYPENAME(BITS), size_t); \
Index: sgimips/bus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sgimips/sgimips/bus.c,v
retrieving revision 1.45
diff -c -u -p -r1.45 bus.c
--- sgimips/bus.c 16 Apr 2006 16:39:37 -0000 1.45
+++ sgimips/bus.c 6 Jun 2006 20:18:04 -0000
@@ -212,8 +212,35 @@ bus_space_read_4(bus_space_tag_t tag, bu
return reg;
}
+u_int16_t
+bus_space_read_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
+ bus_size_t o)
+{
+ switch (tag) {
+ case SGIMIPS_BUS_SPACE_IO:
+ case SGIMIPS_BUS_SPACE_MEM:
+ return le16toh(bus_space_read_2(tag, bsh, o));
+ default:
+ return bus_space_read_2(tag, bsh, o);
+ }
+}
+
+u_int32_t
+bus_space_read_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
+ bus_size_t o)
+{
+ switch (tag) {
+ case SGIMIPS_BUS_SPACE_IO:
+ case SGIMIPS_BUS_SPACE_MEM:
+ return le32toh(bus_space_read_4(tag, bsh, o));
+ default:
+ return bus_space_read_4(tag, bsh, o);
+ }
+}
+
void
-bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t o, u_int32_t v)
+bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh,
+ bus_size_t o, u_int32_t v)
{
int s;
@@ -232,6 +259,36 @@ bus_space_write_4(bus_space_tag_t tag, b
}
}
+void
+bus_space_write_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
+ bus_size_t o, u_int16_t v)
+{
+ switch (tag) {
+ case SGIMIPS_BUS_SPACE_IO:
+ case SGIMIPS_BUS_SPACE_MEM:
+ bus_space_write_2(tag, bsh, o, htole16(v));
+ break;
+ default:
+ bus_space_write_2(tag, bsh, o, v);
+ break;
+ }
+}
+
+void
+bus_space_write_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
+ bus_size_t o, u_int32_t v)
+{
+ switch (tag) {
+ case SGIMIPS_BUS_SPACE_IO:
+ case SGIMIPS_BUS_SPACE_MEM:
+ bus_space_write_4(tag, bsh, o, htole32(v));
+ break;
+ default:
+ bus_space_write_4(tag, bsh, o, v);
+ break;
+ }
+}
+
#if defined(MIPS3)
u_int64_t
bus_space_read_8(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t o)
--mYCpIKhGyMATD0i+--