svn commit: r304876 - in head/sys/dev/bhnd: . siba

Landon J. Fuller landonf at FreeBSD.org
Sat Aug 27 00:58:23 UTC 2016


Author: landonf
Date: Sat Aug 27 00:58:21 2016
New Revision: 304876
URL: https://svnweb.freebsd.org/changeset/base/304876

Log:
  Implement siba(4) support for bhnd_(read|write)_config.
  
  This provides access to the siba(4) bus-mapped per-core cfg0 register
  block.
  
  Approved by:	adrian (mentor, implicit)

Modified:
  head/sys/dev/bhnd/bhnd_bus_if.m
  head/sys/dev/bhnd/siba/siba.c

Modified: head/sys/dev/bhnd/bhnd_bus_if.m
==============================================================================
--- head/sys/dev/bhnd/bhnd_bus_if.m	Sat Aug 27 00:56:37 2016	(r304875)
+++ head/sys/dev/bhnd/bhnd_bus_if.m	Sat Aug 27 00:58:21 2016	(r304876)
@@ -565,8 +565,9 @@ METHOD int release_ext_rsrc {
  * @param offset The offset to be read.
  * @param width The size of the access. Must be 1, 2 or 4 bytes.
  *
- * The exact behavior of this method is bus-specific. In the case of
- * bcma(4), this method provides access to the first agent port of @p child.
+ * The exact behavior of this method is bus-specific. On a bcma(4) bus, this
+ * method provides access to the first agent port of @p child; on a siba(4) bus,
+ * this method provides access to the core's CFG0 register block.
  *
  * @note Device drivers should only use this API for functionality
  * that is not available via another bhnd(4) function.

Modified: head/sys/dev/bhnd/siba/siba.c
==============================================================================
--- head/sys/dev/bhnd/siba/siba.c	Sat Aug 27 00:56:37 2016	(r304875)
+++ head/sys/dev/bhnd/siba/siba.c	Sat Aug 27 00:58:21 2016	(r304876)
@@ -263,6 +263,32 @@ siba_suspend_core(device_t dev, device_t
 static uint32_t
 siba_read_config(device_t dev, device_t child, bus_size_t offset, u_int width)
 {
+	struct siba_devinfo	*dinfo;
+	rman_res_t		 r_size;
+
+	/* Must be directly attached */
+	if (device_get_parent(child) != dev)
+		return (UINT32_MAX);
+
+	/* CFG0 registers must be available */
+	dinfo = device_get_ivars(child);
+	if (dinfo->cfg[0] == NULL)
+		return (UINT32_MAX);
+
+	/* Offset must fall within CFG0 */
+	r_size = rman_get_size(dinfo->cfg[0]->res);
+	if (r_size < offset || r_size - offset < width)
+		return (UINT32_MAX);
+
+	switch (width) {
+	case 1:
+		return (bhnd_bus_read_1(dinfo->cfg[0], offset));
+	case 2:
+		return (bhnd_bus_read_2(dinfo->cfg[0], offset));
+	case 4:
+		return (bhnd_bus_read_4(dinfo->cfg[0], offset));
+	}
+	
 	/* Unsuported */
 	return (UINT32_MAX);
 }
@@ -271,8 +297,31 @@ static void
 siba_write_config(device_t dev, device_t child, bus_size_t offset, uint32_t val,
     u_int width)
 {
-	/* Unsuported */
-	return;
+	struct siba_devinfo	*dinfo;
+	rman_res_t		 r_size;
+
+	/* Must be directly attached */
+	if (device_get_parent(child) != dev)
+		return;
+
+	/* CFG0 registers must be available */
+	dinfo = device_get_ivars(child);
+	if (dinfo->cfg[0] == NULL)
+		return;
+
+	/* Offset must fall within CFG0 */
+	r_size = rman_get_size(dinfo->cfg[0]->res);
+	if (r_size < offset || r_size - offset < width)
+		return;
+
+	switch (width) {
+	case 1:
+		bhnd_bus_write_1(dinfo->cfg[0], offset, val);
+	case 2:
+		bhnd_bus_write_2(dinfo->cfg[0], offset, val);
+	case 4:
+		bhnd_bus_write_4(dinfo->cfg[0], offset, val);
+	}
 }
 
 static u_int


More information about the svn-src-head mailing list