svn commit: r300250 - in head/sys/dev/bhnd: . bhndb nvram tools

Adrian Chadd adrian at FreeBSD.org
Fri May 20 00:45:18 UTC 2016


Author: adrian
Date: Fri May 20 00:45:16 2016
New Revision: 300250
URL: https://svnweb.freebsd.org/changeset/base/300250

Log:
  [bhnd] Add remaining bus_(read|write|set)_(1|2|4) APIs
  
  This adds bhnd-compatible implementations of bus_(read|write|set)_(1|2|4) APIs,
  and upgrades the SPROM parsing code to use bhnd_bus_read_region_stream_2().
  
  This a precursor to bridge support for resource adjustment and the new
  ChipCommon bus support.
  
  Tested:
  
  * Tested against BCM4331
  * Kernel build verified via tinderbox.
  
  Submitted by:	Landon Fuller <landonf at landonf.org>
  Differential Revision:	https://reviews.freebsd.org/D6469

Modified:
  head/sys/dev/bhnd/bhnd.c
  head/sys/dev/bhnd/bhnd.h
  head/sys/dev/bhnd/bhnd_bus_if.m
  head/sys/dev/bhnd/bhndb/bhndb.c
  head/sys/dev/bhnd/nvram/bhnd_sprom.c
  head/sys/dev/bhnd/tools/bus_macro.sh

Modified: head/sys/dev/bhnd/bhnd.c
==============================================================================
--- head/sys/dev/bhnd/bhnd.c	Fri May 20 00:03:22 2016	(r300249)
+++ head/sys/dev/bhnd/bhnd.c	Fri May 20 00:45:16 2016	(r300250)
@@ -529,36 +529,36 @@ bhnd_generic_resume_child(device_t dev, 
 /*
  * Delegate all indirect I/O to the parent device. When inherited by
  * non-bridged bus implementations, resources will never be marked as
- * indirect, and these methods should never be called.
+ * indirect, and these methods will never be called.
  */
-#define	BHND_IO_READ(_type, _name, _method)			\
-static _type							\
-bhnd_read_ ## _name (device_t dev, device_t child,		\
-    struct bhnd_resource *r, bus_size_t offset)			\
-{								\
-	return (BHND_BUS_READ_ ## _method(			\
-		    device_get_parent(dev), child, r, offset));	\
+#define	BHND_IO_READ(_type, _name, _method)				\
+static _type								\
+bhnd_read_ ## _name (device_t dev, device_t child,			\
+    struct bhnd_resource *r, bus_size_t offset)				\
+{									\
+	return (BHND_BUS_READ_ ## _method(				\
+		    device_get_parent(dev), child, r, offset));		\
 }
 
-#define	BHND_IO_WRITE(_type, _name, _method)			\
-static void							\
-bhnd_write_ ## _name (device_t dev, device_t child,		\
-    struct bhnd_resource *r, bus_size_t offset, _type value)	\
-{								\
-	return (BHND_BUS_WRITE_ ## _method(			\
-		    device_get_parent(dev), child, r, offset,	\
+#define	BHND_IO_WRITE(_type, _name, _method)				\
+static void								\
+bhnd_write_ ## _name (device_t dev, device_t child,			\
+    struct bhnd_resource *r, bus_size_t offset, _type value)		\
+{									\
+	return (BHND_BUS_WRITE_ ## _method(				\
+		    device_get_parent(dev), child, r, offset,		\
 		    value));	\
 }
 
-#define	BHND_IO_MULTI(_type, _rw, _name, _method)			\
+#define	BHND_IO_MISC(_type, _op, _method)				\
 static void								\
-bhnd_ ## _rw ## _multi_ ## _name (device_t dev, device_t child,	\
-    struct bhnd_resource *r, bus_size_t offset, _type *datap,		\
+bhnd_ ## _op (device_t dev, device_t child,				\
+    struct bhnd_resource *r, bus_size_t offset, _type datap,		\
     bus_size_t count)							\
 {									\
 	BHND_BUS_ ## _method(device_get_parent(dev), child, r,		\
 	    offset, datap, count);					\
-}
+}	
 
 #define	BHND_IO_METHODS(_type, _size)					\
 	BHND_IO_READ(_type, _size, _size)				\
@@ -567,13 +567,28 @@ bhnd_ ## _rw ## _multi_ ## _name (device
 	BHND_IO_READ(_type, stream_ ## _size, STREAM_ ## _size)		\
 	BHND_IO_WRITE(_type, stream_ ## _size, STREAM_ ## _size)	\
 									\
-	BHND_IO_MULTI(_type, read, _size, READ_MULTI_ ## _size)		\
-	BHND_IO_MULTI(_type, write, _size, WRITE_MULTI_ ## _size)	\
+	BHND_IO_MISC(_type*, read_multi_ ## _size,			\
+	    READ_MULTI_ ## _size)					\
+	BHND_IO_MISC(_type*, write_multi_ ## _size,			\
+	    WRITE_MULTI_ ## _size)					\
 									\
-	BHND_IO_MULTI(_type, read, stream_ ## _size,			\
+	BHND_IO_MISC(_type*, read_multi_stream_ ## _size,		\
 	   READ_MULTI_STREAM_ ## _size)					\
-	BHND_IO_MULTI(_type, write, stream_ ## _size,			\
+	BHND_IO_MISC(_type*, write_multi_stream_ ## _size,		\
 	   WRITE_MULTI_STREAM_ ## _size)				\
+									\
+	BHND_IO_MISC(_type, set_multi_ ## _size, SET_MULTI_ ## _size)	\
+	BHND_IO_MISC(_type, set_region_ ## _size, SET_REGION_ ## _size)	\
+									\
+	BHND_IO_MISC(_type*, read_region_ ## _size,			\
+	    READ_REGION_ ## _size)					\
+	BHND_IO_MISC(_type*, write_region_ ## _size,			\
+	    WRITE_REGION_ ## _size)					\
+									\
+	BHND_IO_MISC(_type*, read_region_stream_ ## _size,		\
+	    READ_REGION_STREAM_ ## _size)				\
+	BHND_IO_MISC(_type*, write_region_stream_ ## _size,		\
+	    WRITE_REGION_STREAM_ ## _size)				\
 
 BHND_IO_METHODS(uint8_t, 1);
 BHND_IO_METHODS(uint16_t, 2);
@@ -627,12 +642,15 @@ static device_method_t bhnd_methods[] = 
 	DEVMETHOD(bhnd_bus_is_region_valid,	bhnd_generic_is_region_valid),
 	DEVMETHOD(bhnd_bus_is_hw_disabled,	bhnd_bus_generic_is_hw_disabled),
 	DEVMETHOD(bhnd_bus_get_nvram_var,	bhnd_bus_generic_get_nvram_var),
+
+	/* BHND interface (bus I/O) */
 	DEVMETHOD(bhnd_bus_read_1,		bhnd_read_1),
 	DEVMETHOD(bhnd_bus_read_2,		bhnd_read_2),
 	DEVMETHOD(bhnd_bus_read_4,		bhnd_read_4),
 	DEVMETHOD(bhnd_bus_write_1,		bhnd_write_1),
 	DEVMETHOD(bhnd_bus_write_2,		bhnd_write_2),
 	DEVMETHOD(bhnd_bus_write_4,		bhnd_write_4),
+
 	DEVMETHOD(bhnd_bus_read_stream_1,	bhnd_read_stream_1),
 	DEVMETHOD(bhnd_bus_read_stream_2,	bhnd_read_stream_2),
 	DEVMETHOD(bhnd_bus_read_stream_4,	bhnd_read_stream_4),
@@ -654,7 +672,29 @@ static device_method_t bhnd_methods[] = 
 	DEVMETHOD(bhnd_bus_write_multi_stream_2,bhnd_write_multi_stream_2),
 	DEVMETHOD(bhnd_bus_write_multi_stream_4,bhnd_write_multi_stream_4),
 
-	DEVMETHOD(bhnd_bus_barrier,		bhnd_barrier),
+	DEVMETHOD(bhnd_bus_set_multi_1,		bhnd_set_multi_1),
+	DEVMETHOD(bhnd_bus_set_multi_2,		bhnd_set_multi_2),
+	DEVMETHOD(bhnd_bus_set_multi_4,		bhnd_set_multi_4),
+
+	DEVMETHOD(bhnd_bus_set_region_1,	bhnd_set_region_1),
+	DEVMETHOD(bhnd_bus_set_region_2,	bhnd_set_region_2),
+	DEVMETHOD(bhnd_bus_set_region_4,	bhnd_set_region_4),
+
+	DEVMETHOD(bhnd_bus_read_region_1,	bhnd_read_region_1),
+	DEVMETHOD(bhnd_bus_read_region_2,	bhnd_read_region_2),
+	DEVMETHOD(bhnd_bus_read_region_4,	bhnd_read_region_4),
+	DEVMETHOD(bhnd_bus_write_region_1,	bhnd_write_region_1),
+	DEVMETHOD(bhnd_bus_write_region_2,	bhnd_write_region_2),
+	DEVMETHOD(bhnd_bus_write_region_4,	bhnd_write_region_4),
+
+	DEVMETHOD(bhnd_bus_read_region_stream_1,bhnd_read_region_stream_1),
+	DEVMETHOD(bhnd_bus_read_region_stream_2,bhnd_read_region_stream_2),
+	DEVMETHOD(bhnd_bus_read_region_stream_4,bhnd_read_region_stream_4),
+	DEVMETHOD(bhnd_bus_write_region_stream_1, bhnd_write_region_stream_1),
+	DEVMETHOD(bhnd_bus_write_region_stream_2, bhnd_write_region_stream_2),
+	DEVMETHOD(bhnd_bus_write_region_stream_4, bhnd_write_region_stream_4),
+
+	DEVMETHOD(bhnd_bus_barrier,			bhnd_barrier),
 
 	DEVMETHOD_END
 };

Modified: head/sys/dev/bhnd/bhnd.h
==============================================================================
--- head/sys/dev/bhnd/bhnd.h	Fri May 20 00:03:22 2016	(r300249)
+++ head/sys/dev/bhnd/bhnd.h	Fri May 20 00:45:16 2016	(r300250)
@@ -869,6 +869,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_READ_MULTI_1( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_read_region_1(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_read_region_1((r)->res, (o), (d), (c)) : \
+	BHND_BUS_READ_REGION_1( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_write_1(r, o, v) \
     ((r)->direct) ? \
 	bus_write_1((r)->res, (o), (v)) : \
@@ -881,6 +887,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_WRITE_MULTI_1( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_write_region_1(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_write_region_1((r)->res, (o), (d), (c)) : \
+	BHND_BUS_WRITE_REGION_1( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_read_stream_1(r, o) \
     ((r)->direct) ? \
 	bus_read_stream_1((r)->res, (o)) : \
@@ -893,6 +905,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_READ_MULTI_STREAM_1( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_read_region_stream_1(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_read_region_stream_1((r)->res, (o), (d), (c)) : \
+	BHND_BUS_READ_REGION_STREAM_1( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_write_stream_1(r, o, v) \
     ((r)->direct) ? \
 	bus_write_stream_1((r)->res, (o), (v)) : \
@@ -905,6 +923,24 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_WRITE_MULTI_STREAM_1( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_write_region_stream_1(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_write_region_stream_1((r)->res, (o), (d), (c)) : \
+	BHND_BUS_WRITE_REGION_STREAM_1( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_set_multi_1(r, o, v, c) \
+    ((r)->direct) ? \
+	bus_set_multi_1((r)->res, (o), (v), (c)) : \
+	BHND_BUS_SET_MULTI_1( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (v), (c))
+#define bhnd_bus_set_region_1(r, o, v, c) \
+    ((r)->direct) ? \
+	bus_set_region_1((r)->res, (o), (v), (c)) : \
+	BHND_BUS_SET_REGION_1( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (v), (c))
 #define bhnd_bus_read_2(r, o) \
     ((r)->direct) ? \
 	bus_read_2((r)->res, (o)) : \
@@ -917,6 +953,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_READ_MULTI_2( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_read_region_2(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_read_region_2((r)->res, (o), (d), (c)) : \
+	BHND_BUS_READ_REGION_2( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_write_2(r, o, v) \
     ((r)->direct) ? \
 	bus_write_2((r)->res, (o), (v)) : \
@@ -929,6 +971,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_WRITE_MULTI_2( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_write_region_2(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_write_region_2((r)->res, (o), (d), (c)) : \
+	BHND_BUS_WRITE_REGION_2( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_read_stream_2(r, o) \
     ((r)->direct) ? \
 	bus_read_stream_2((r)->res, (o)) : \
@@ -941,6 +989,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_READ_MULTI_STREAM_2( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_read_region_stream_2(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_read_region_stream_2((r)->res, (o), (d), (c)) : \
+	BHND_BUS_READ_REGION_STREAM_2( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_write_stream_2(r, o, v) \
     ((r)->direct) ? \
 	bus_write_stream_2((r)->res, (o), (v)) : \
@@ -953,6 +1007,24 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_WRITE_MULTI_STREAM_2( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_write_region_stream_2(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_write_region_stream_2((r)->res, (o), (d), (c)) : \
+	BHND_BUS_WRITE_REGION_STREAM_2( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_set_multi_2(r, o, v, c) \
+    ((r)->direct) ? \
+	bus_set_multi_2((r)->res, (o), (v), (c)) : \
+	BHND_BUS_SET_MULTI_2( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (v), (c))
+#define bhnd_bus_set_region_2(r, o, v, c) \
+    ((r)->direct) ? \
+	bus_set_region_2((r)->res, (o), (v), (c)) : \
+	BHND_BUS_SET_REGION_2( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (v), (c))
 #define bhnd_bus_read_4(r, o) \
     ((r)->direct) ? \
 	bus_read_4((r)->res, (o)) : \
@@ -965,6 +1037,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_READ_MULTI_4( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_read_region_4(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_read_region_4((r)->res, (o), (d), (c)) : \
+	BHND_BUS_READ_REGION_4( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_write_4(r, o, v) \
     ((r)->direct) ? \
 	bus_write_4((r)->res, (o), (v)) : \
@@ -977,6 +1055,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_WRITE_MULTI_4( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_write_region_4(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_write_region_4((r)->res, (o), (d), (c)) : \
+	BHND_BUS_WRITE_REGION_4( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_read_stream_4(r, o) \
     ((r)->direct) ? \
 	bus_read_stream_4((r)->res, (o)) : \
@@ -989,6 +1073,12 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_READ_MULTI_STREAM_4( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_read_region_stream_4(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_read_region_stream_4((r)->res, (o), (d), (c)) : \
+	BHND_BUS_READ_REGION_STREAM_4( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
 #define bhnd_bus_write_stream_4(r, o, v) \
     ((r)->direct) ? \
 	bus_write_stream_4((r)->res, (o), (v)) : \
@@ -1001,5 +1091,23 @@ bhnd_get_region_addr(device_t dev, bhnd_
 	BHND_BUS_WRITE_MULTI_STREAM_4( \
 	    device_get_parent(rman_get_device((r)->res)),	\
 	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_write_region_stream_4(r, o, d, c) \
+    ((r)->direct) ? \
+	bus_write_region_stream_4((r)->res, (o), (d), (c)) : \
+	BHND_BUS_WRITE_REGION_STREAM_4( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (d), (c))
+#define bhnd_bus_set_multi_4(r, o, v, c) \
+    ((r)->direct) ? \
+	bus_set_multi_4((r)->res, (o), (v), (c)) : \
+	BHND_BUS_SET_MULTI_4( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (v), (c))
+#define bhnd_bus_set_region_4(r, o, v, c) \
+    ((r)->direct) ? \
+	bus_set_region_4((r)->res, (o), (v), (c)) : \
+	BHND_BUS_SET_REGION_4( \
+	    device_get_parent(rman_get_device((r)->res)),	\
+	    rman_get_device((r)->res), (r), (o), (v), (c))
 
 #endif /* _BHND_BHND_H_ */

Modified: head/sys/dev/bhnd/bhnd_bus_if.m
==============================================================================
--- head/sys/dev/bhnd/bhnd_bus_if.m	Fri May 20 00:03:22 2016	(r300249)
+++ head/sys/dev/bhnd/bhnd_bus_if.m	Fri May 20 00:45:16 2016	(r300250)
@@ -670,6 +670,192 @@ METHOD void write_multi_stream_4 {
 	bus_size_t count;
 }
 
+/** An implementation of bus_set_multi_1() compatible with bhnd_resource */
+METHOD void set_multi_1 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint8_t value;
+	bus_size_t count;
+}
+
+/** An implementation of bus_set_multi_2() compatible with bhnd_resource */
+METHOD void set_multi_2 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint16_t value;
+	bus_size_t count;
+}
+
+/** An implementation of bus_set_multi_4() compatible with bhnd_resource */
+METHOD void set_multi_4 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint32_t value;
+	bus_size_t count;
+}
+
+/** An implementation of bus_set_region_1() compatible with bhnd_resource */
+METHOD void set_region_1 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint8_t value;
+	bus_size_t count;
+}
+
+/** An implementation of bus_set_region_2() compatible with bhnd_resource */
+METHOD void set_region_2 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint16_t value;
+	bus_size_t count;
+}
+
+/** An implementation of bus_set_region_4() compatible with bhnd_resource */
+METHOD void set_region_4 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint32_t value;
+	bus_size_t count;
+}
+
+/** An implementation of bus_read_region_1() compatible with bhnd_resource */
+METHOD void read_region_1 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint8_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_read_region_2() compatible with bhnd_resource */
+METHOD void read_region_2 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint16_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_read_region_4() compatible with bhnd_resource */
+METHOD void read_region_4 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint32_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_read_region_stream_1() compatible with
+  * bhnd_resource */
+METHOD void read_region_stream_1 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint8_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_read_region_stream_2() compatible with
+  * bhnd_resource */
+METHOD void read_region_stream_2 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint16_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_read_region_stream_4() compatible with
+  * bhnd_resource */
+METHOD void read_region_stream_4 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint32_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_write_region_1() compatible with bhnd_resource */
+METHOD void write_region_1 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint8_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_write_region_2() compatible with bhnd_resource */
+METHOD void write_region_2 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint16_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_write_region_4() compatible with bhnd_resource */
+METHOD void write_region_4 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint32_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_write_region_stream_1() compatible with
+  * bhnd_resource */
+METHOD void write_region_stream_1 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint8_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_write_region_stream_2() compatible with
+  * bhnd_resource */
+METHOD void write_region_stream_2 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint16_t *datap;
+	bus_size_t count;
+}
+
+/** An implementation of bus_write_region_stream_4() compatible with
+  * bhnd_resource */
+METHOD void write_region_stream_4 {
+	device_t dev;
+	device_t child;
+	struct bhnd_resource *r;
+	bus_size_t offset;
+	uint32_t *datap;
+	bus_size_t count;
+}
+
 /** An implementation of bus_barrier() compatible with bhnd_resource */
 METHOD void barrier {
 	device_t dev;

Modified: head/sys/dev/bhnd/bhndb/bhndb.c
==============================================================================
--- head/sys/dev/bhnd/bhndb/bhndb.c	Fri May 20 00:03:22 2016	(r300249)
+++ head/sys/dev/bhnd/bhndb/bhndb.c	Fri May 20 00:45:16 2016	(r300250)
@@ -1766,15 +1766,15 @@ bhndb_bus_write_ ## _name (device_t dev,
 	BHNDB_IO_COMMON_TEARDOWN();				\
 }
 
-/* Defines a bhndb_bus_(read|write)_multi_* method implementation */
-#define	BHNDB_IO_MULTI(_type, _rw, _name)			\
+/* Defines a bhndb_bus_(read|write|set)_(multi|region)_* method */
+#define	BHNDB_IO_MISC(_type, _ptr, _op, _size)			\
 static void							\
-bhndb_bus_ ## _rw ## _multi_ ## _name (device_t dev,		\
+bhndb_bus_ ## _op ## _ ## _size (device_t dev,			\
     device_t child, struct bhnd_resource *r, bus_size_t offset,	\
-    _type *datap, bus_size_t count)				\
+    _type _ptr datap, bus_size_t count)				\
 {								\
 	BHNDB_IO_COMMON_SETUP(sizeof(_type) * count);		\
-	bus_ ## _rw ## _multi_ ## _name (io_res, io_offset,	\
+	bus_ ## _op ## _ ## _size (io_res, io_offset,		\
 	    datap, count);					\
 	BHNDB_IO_COMMON_TEARDOWN();				\
 }
@@ -1787,11 +1787,19 @@ bhndb_bus_ ## _rw ## _multi_ ## _name (d
 	BHNDB_IO_READ(_type, stream_ ## _size)			\
 	BHNDB_IO_WRITE(_type, stream_ ## _size)			\
 								\
-	BHNDB_IO_MULTI(_type, read, _size)			\
-	BHNDB_IO_MULTI(_type, write, _size)			\
+	BHNDB_IO_MISC(_type, *, read_multi, _size)		\
+	BHNDB_IO_MISC(_type, *, write_multi, _size)		\
 								\
-	BHNDB_IO_MULTI(_type, read, stream_ ## _size)		\
-	BHNDB_IO_MULTI(_type, write, stream_ ## _size)
+	BHNDB_IO_MISC(_type, *, read_multi_stream, _size)	\
+	BHNDB_IO_MISC(_type, *, write_multi_stream, _size)	\
+								\
+	BHNDB_IO_MISC(_type,  , set_multi, _size)		\
+	BHNDB_IO_MISC(_type,  , set_region, _size)		\
+	BHNDB_IO_MISC(_type, *, read_region, _size)		\
+	BHNDB_IO_MISC(_type, *, write_region, _size)		\
+								\
+	BHNDB_IO_MISC(_type, *, read_region_stream, _size)	\
+	BHNDB_IO_MISC(_type, *, write_region_stream, _size)
 
 BHNDB_IO_METHODS(uint8_t, 1);
 BHNDB_IO_METHODS(uint16_t, 2);
@@ -1804,24 +1812,9 @@ static void 
 bhndb_bus_barrier(device_t dev, device_t child, struct bhnd_resource *r,
     bus_size_t offset, bus_size_t length, int flags)
 {
-	bus_size_t remain;
-
 	BHNDB_IO_COMMON_SETUP(length);
 
-	/* TODO: It's unclear whether we need a barrier implementation,
-	 * and if we do, what it needs to actually do. This may need
-	 * revisiting once we have a better idea of requirements after
-	 * porting the core drivers. */
-	panic("implementation incorrect");
-
-	/* Use 4-byte reads where possible */
-	remain = length % sizeof(uint32_t);
-	for (bus_size_t i = 0; i < (length - remain); i += 4)
-		bus_read_4(io_res, io_offset + offset + i);
-
-	/* Use 1 byte reads for the remainder */
-	for (bus_size_t i = 0; i < remain; i++)
-		bus_read_1(io_res, io_offset + offset + length + i);
+	bus_barrier(io_res, io_offset + offset, length, flags);
 
 	BHNDB_IO_COMMON_TEARDOWN();
 }
@@ -1970,6 +1963,27 @@ static device_method_t bhndb_methods[] =
 	DEVMETHOD(bhnd_bus_write_multi_stream_2,bhndb_bus_write_multi_stream_2),
 	DEVMETHOD(bhnd_bus_write_multi_stream_4,bhndb_bus_write_multi_stream_4),
 
+	DEVMETHOD(bhnd_bus_set_multi_1,		bhndb_bus_set_multi_1),
+	DEVMETHOD(bhnd_bus_set_multi_2,		bhndb_bus_set_multi_2),
+	DEVMETHOD(bhnd_bus_set_multi_4,		bhndb_bus_set_multi_4),
+	DEVMETHOD(bhnd_bus_set_region_1,	bhndb_bus_set_region_1),
+	DEVMETHOD(bhnd_bus_set_region_2,	bhndb_bus_set_region_2),
+	DEVMETHOD(bhnd_bus_set_region_4,	bhndb_bus_set_region_4),
+
+	DEVMETHOD(bhnd_bus_read_region_1,	bhndb_bus_read_region_1),
+	DEVMETHOD(bhnd_bus_read_region_2,	bhndb_bus_read_region_2),
+	DEVMETHOD(bhnd_bus_read_region_4,	bhndb_bus_read_region_4),
+	DEVMETHOD(bhnd_bus_write_region_1,	bhndb_bus_write_region_1),
+	DEVMETHOD(bhnd_bus_write_region_2,	bhndb_bus_write_region_2),
+	DEVMETHOD(bhnd_bus_write_region_4,	bhndb_bus_write_region_4),
+
+	DEVMETHOD(bhnd_bus_read_region_stream_1,bhndb_bus_read_region_stream_1),
+	DEVMETHOD(bhnd_bus_read_region_stream_2,bhndb_bus_read_region_stream_2),
+	DEVMETHOD(bhnd_bus_read_region_stream_4,bhndb_bus_read_region_stream_4),
+	DEVMETHOD(bhnd_bus_write_region_stream_1,bhndb_bus_write_region_stream_1),
+	DEVMETHOD(bhnd_bus_write_region_stream_2,bhndb_bus_write_region_stream_2),
+	DEVMETHOD(bhnd_bus_write_region_stream_4,bhndb_bus_write_region_stream_4),
+
 	DEVMETHOD(bhnd_bus_barrier,		bhndb_bus_barrier),
 
 	DEVMETHOD_END

Modified: head/sys/dev/bhnd/nvram/bhnd_sprom.c
==============================================================================
--- head/sys/dev/bhnd/nvram/bhnd_sprom.c	Fri May 20 00:03:22 2016	(r300249)
+++ head/sys/dev/bhnd/nvram/bhnd_sprom.c	Fri May 20 00:45:16 2016	(r300250)
@@ -508,7 +508,6 @@ sprom_direct_read(struct bhnd_sprom *sc,
     size_t nbytes, uint8_t *crc)
 {
 	bus_size_t	 res_offset;
-	size_t		 nread;
 	uint16_t	*p;
 
 	KASSERT(nbytes % sizeof(uint16_t) == 0, ("unaligned sprom size"));
@@ -520,15 +519,12 @@ sprom_direct_read(struct bhnd_sprom *sc,
 		return (EINVAL);
 	}
 
+	/* Perform read and update CRC */
 	p = (uint16_t *)buf;
 	res_offset = sc->sp_res_off + offset;
 
-	/* Perform read */
-	for (nread = 0; nread < nbytes; nread += 2) {
-		*p = bhnd_bus_read_stream_2(sc->sp_res, res_offset+nread);
-		*crc = bhnd_nvram_crc8(p, sizeof(*p), *crc);
-		p++;
-	};
+	bhnd_bus_read_region_stream_2(sc->sp_res, res_offset, p, nbytes);
+	*crc = bhnd_nvram_crc8(p, nbytes, *crc);
 
 	return (0);
 }
@@ -569,4 +565,4 @@ sprom_var_defn(struct bhnd_sprom *sc, co
 
 	/* Not supported by this SPROM revision */
 	return (ENOENT);
-}
\ No newline at end of file
+}

Modified: head/sys/dev/bhnd/tools/bus_macro.sh
==============================================================================
--- head/sys/dev/bhnd/tools/bus_macro.sh	Fri May 20 00:03:22 2016	(r300249)
+++ head/sys/dev/bhnd/tools/bus_macro.sh	Fri May 20 00:45:16 2016	(r300250)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright (c) 2015 Landon Fuller <landon at landonf.org>
+# Copyright (c) 2015-2016 Landon Fuller <landon at landonf.org>
 # Copyright (c) 2004-2005 Poul-Henning Kamp.
 # All rights reserved.
 #
@@ -63,8 +63,6 @@ macro () {
 
 macro barrier o l f
 
-# We only support a subset of the bus I/O methods; this may 
-# be expanded when/if additional functions are required.
 for w in 1 2 4 #8
 do
 	# macro copy_region_$w so dh do c
@@ -74,11 +72,20 @@ do
 	do
 		macro read_$s$w o
 		macro read_multi_$s$w o d c
-#		macro read_region_$s$w o d c
-#		macro set_multi_$s$w o v c
-#		macro set_region_$s$w o v c
+		macro read_region_$s$w o d c
 		macro write_$s$w o v
 		macro write_multi_$s$w o d c
-#		macro write_region_$s$w o d c
+		macro write_region_$s$w o d c
+	done
+	
+	# set_(multi_)?_stream is not supported on ARM/ARM64, and so for
+	# simplicity, we don't support their use with bhnd resources.
+	# 
+	# if that changes, these can be merged back into the stream-eanbled
+	# loop above.
+	for s in ""
+	do
+		macro set_multi_$s$w o v c
+		macro set_region_$s$w o v c
 	done
 done


More information about the svn-src-all mailing list