Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Dec 2017 01:58:05 +0000 (UTC)
From:      "Landon J. Fuller" <landonf@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r326836 - in head: share/man/man9 sys/dev/bhnd sys/dev/bhnd/bhndb sys/mips/broadcom
Message-ID:  <201712140158.vBE1w5d8095065@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: landonf
Date: Thu Dec 14 01:58:05 2017
New Revision: 326836
URL: https://svnweb.freebsd.org/changeset/base/326836

Log:
  bhnd(4): Include board_devid in the bhnd_board_info structure, and populate
  the expected default board_vendor value on MIPS SoCs.
  
  This is required by bwn(4) to differentiate between single-band and
  dual-band device variants that otherwise share a common chip ID.
  
  Approved by:	adrian (mentor, implicit)
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/share/man/man9/bhnd.9
  head/sys/dev/bhnd/bhnd.c
  head/sys/dev/bhnd/bhnd.h
  head/sys/dev/bhnd/bhnd_match.h
  head/sys/dev/bhnd/bhnd_subr.c
  head/sys/dev/bhnd/bhndb/bhndb_pci.c
  head/sys/mips/broadcom/bhnd_nexus.c

Modified: head/share/man/man9/bhnd.9
==============================================================================
--- head/share/man/man9/bhnd.9	Wed Dec 13 21:17:00 2017	(r326835)
+++ head/share/man/man9/bhnd.9	Thu Dec 14 01:58:05 2017	(r326836)
@@ -1309,8 +1309,9 @@ structure contains the following fields:
 .It Fa board_vendor
 Vendor ID of the board manufacturer (PCI-SIG assigned).
 .It Fa board_type
+Board ID.
+.It Fa board_devid
 Device ID.
-This is generally a Broadcom-assigned globally unique identifier.
 .It Fa board_rev
 Board revision.
 .It Fa board_srom_rev
@@ -1323,12 +1324,25 @@ Board flags (2)
 Board flags (3)
 .El
 .Pp
+The
+.Fa board_devid
+field is the Broadcom PCI device ID that most closely matches the
+capabilities of the BHND device (if any).
+.Pp
 On PCI devices, the
-.Fa board_vendor
+.Fa board_vendor ,
+.Fa board_type ,
 and
-.Fa board_type
-fields default to the PCI Subsystem Vendor ID and PCI Subsystem ID, unless
-overridden in device NVRAM.
+.Fa board_devid
+fields default to the PCI Subsystem Vendor ID, PCI Subsystem ID, and PCI
+device ID, unless overridden in device NVRAM.
+.Pp
+On other devices, including SoCs, the
+.Fa board_vendor ,
+.Fa board_type ,
+and
+.Fa board_devid
+fields will be populated from device NVRAM.
 .Pp
 Symbolic constants for common board flags are defined in
 .In dev/bhnd/bhnd_ids.h .

Modified: head/sys/dev/bhnd/bhnd.c
==============================================================================
--- head/sys/dev/bhnd/bhnd.c	Wed Dec 13 21:17:00 2017	(r326835)
+++ head/sys/dev/bhnd/bhnd.c	Thu Dec 14 01:58:05 2017	(r326836)
@@ -1140,7 +1140,6 @@ static device_method_t bhnd_methods[] = {
 	/* BHND interface */
 	DEVMETHOD(bhnd_bus_get_chipid,		bhnd_bus_generic_get_chipid),
 	DEVMETHOD(bhnd_bus_is_hw_disabled,	bhnd_bus_generic_is_hw_disabled),
-	DEVMETHOD(bhnd_bus_read_board_info,	bhnd_bus_generic_read_board_info),
 
 	DEVMETHOD(bhnd_bus_get_probe_order,	bhnd_generic_get_probe_order),
 

Modified: head/sys/dev/bhnd/bhnd.h
==============================================================================
--- head/sys/dev/bhnd/bhnd.h	Wed Dec 13 21:17:00 2017	(r326835)
+++ head/sys/dev/bhnd/bhnd.h	Thu Dec 14 01:58:05 2017	(r326836)
@@ -163,20 +163,41 @@ BHND_ACCESSOR(pmu_info,		PMU_INFO,	void *);
  * A bhnd(4) board descriptor.
  */
 struct bhnd_board_info {
-	uint16_t	board_vendor;	/**< PCI-SIG vendor ID (even on non-PCI
-					  *  devices).
+	uint16_t	board_vendor;	/**< Board vendor (PCI-SIG vendor ID).
 					  *
-					  *  On PCI devices, this will generally
-					  *  be the subsystem vendor ID, but the
-					  *  value may be overridden in device
-					  *  NVRAM.
+					  * On PCI devices, this will default to
+					  * the PCI subsystem vendor ID, but may
+					  * be overridden by the 'boardtype'
+					  * NVRAM variable.
+					  *
+					  * On SoCs, this will default to
+					  * PCI_VENDOR_BROADCOM, but may be
+					  * overridden by the 'boardvendor'
+					  * NVRAM variable.
 					  */
 	uint16_t	board_type;	/**< Board type (See BHND_BOARD_*)
 					  *
-					  *  On PCI devices, this will generally
-					  *  be the subsystem device ID, but the
-					  *  value may be overridden in device
-					  *  NVRAM.
+					  *  This value is usually a
+					  *  Broadcom-assigned reference board
+					  *  identifier (see BHND_BOARD_*), but
+					  *  may be set to an arbitrary value
+					  *  assigned by the board vendor.
+					  *
+					  *  On PCI devices, this will default
+					  *  to the PCI subsystem ID, but may be
+					  *  overridden by the 'boardtype'
+					  *  NVRAM variable.
+					  *
+					  *  On SoCs, this will always be
+					  *  populated with the value of the
+					  * 'boardtype' NVRAM variable.
+					  */
+	uint16_t	board_devid;	/**< Board device ID.
+					  *
+					  *  On PCI devices, this will default
+					  *  to the PCI device ID, but may
+					  *  be overridden by the 'devid'
+					  *  NVRAM variable.
 					  */
 	uint16_t	board_rev;	/**< Board revision. */
 	uint8_t		board_srom_rev;	/**< Board SROM format revision */

Modified: head/sys/dev/bhnd/bhnd_match.h
==============================================================================
--- head/sys/dev/bhnd/bhnd_match.h	Wed Dec 13 21:17:00 2017	(r326835)
+++ head/sys/dev/bhnd/bhnd_match.h	Thu Dec 14 01:58:05 2017	(r326836)
@@ -217,14 +217,16 @@ struct bhnd_board_match {
 			uint8_t
 			    board_vendor:1,
 			    board_type:1,
+			    board_devid:1,
 			    board_rev:1,
 			    board_srom_rev:1,
-			    flags_unused:4;
+			    flags_unused:3;
 		} match;
 	} m;
 
 	uint16_t		board_vendor;	/**< required board vendor */
 	uint16_t		board_type;	/**< required board type */
+	uint16_t		board_devid;	/**< required board devid */
 	struct bhnd_hwrev_match	board_rev;	/**< matching board revisions */
 	struct bhnd_hwrev_match	board_srom_rev;	/**< matching board srom revisions */
 };
@@ -232,6 +234,7 @@ struct bhnd_board_match {
 #define	_BHND_BOARD_MATCH_COPY(_src)			\
 	_BHND_COPY_MATCH_FIELD(_src, board_vendor),	\
 	_BHND_COPY_MATCH_FIELD(_src, board_type),	\
+	_BHND_COPY_MATCH_FIELD(_src, board_devid),	\
 	_BHND_COPY_MATCH_FIELD(_src, board_rev),	\
 	_BHND_COPY_MATCH_FIELD(_src, board_srom_rev)
 
@@ -241,6 +244,11 @@ struct bhnd_board_match {
 /** Set the required board type within a bhnd match descriptor */
 #define	BHND_MATCH_BOARD_TYPE(_type)	_BHND_SET_MATCH_FIELD(board_type, \
 					    BHND_BOARD_ ## _type)
+
+/** Set the required board devid within a bhnd match descriptor */
+#define	BHND_MATCH_BOARD_DEVID(_devid)	_BHND_SET_MATCH_FIELD(board_devid, \
+					    (_devid))
+
 /** Set the required SROM revision range within a bhnd match descriptor */
 #define	BHND_MATCH_SROMREV(_rev)	_BHND_SET_MATCH_FIELD(board_srom_rev, \
 					    BHND_HWREV_ ## _rev)
@@ -278,9 +286,10 @@ struct bhnd_device_match {
 			chip_type:1,
 			board_vendor:1,
 			board_type:1,
+			board_devid:1,
 			board_rev:1,
 			board_srom_rev:1,
-			flags_unused:16;
+			flags_unused:15;
 		} match;
 	} m;
 	
@@ -298,6 +307,7 @@ struct bhnd_device_match {
 
 	uint16_t		board_vendor;	/**< required board vendor */
 	uint16_t		board_type;	/**< required board type */
+	uint16_t		board_devid;	/**< required board devid */
 	struct bhnd_hwrev_match	board_rev;	/**< matching board revisions */
 	struct bhnd_hwrev_match	board_srom_rev;	/**< matching board srom revisions */
 };

Modified: head/sys/dev/bhnd/bhnd_subr.c
==============================================================================
--- head/sys/dev/bhnd/bhnd_subr.c	Wed Dec 13 21:17:00 2017	(r326835)
+++ head/sys/dev/bhnd/bhnd_subr.c	Thu Dec 14 01:58:05 2017	(r326836)
@@ -807,6 +807,10 @@ bhnd_board_matches(const struct bhnd_board_info *board
 	if (desc->m.match.board_type && board->board_type != desc->board_type)
 		return (false);
 
+	if (desc->m.match.board_devid &&
+	    board->board_devid != desc->board_devid)
+		return (false);
+
 	if (desc->m.match.board_rev &&
 	    !bhnd_hwrev_matches(board->board_rev, &desc->board_rev))
 		return (false);
@@ -2325,6 +2329,7 @@ bhnd_bus_generic_read_board_info(device_t dev, device_
 
 	OPT_BHND_GV(info->board_vendor,	BOARDVENDOR,	0);
 	OPT_BHND_GV(info->board_type,	BOARDTYPE,	0);	/* srom >= 2 */
+	OPT_BHND_GV(info->board_devid,	DEVID,		0);	/* srom >= 8 */
 	REQ_BHND_GV(info->board_rev,	BOARDREV);
 	OPT_BHND_GV(info->board_srom_rev,SROMREV,	0);	/* missing in
 								   some SoC

Modified: head/sys/dev/bhnd/bhndb/bhndb_pci.c
==============================================================================
--- head/sys/dev/bhnd/bhndb/bhndb_pci.c	Wed Dec 13 21:17:00 2017	(r326835)
+++ head/sys/dev/bhnd/bhndb/bhndb_pci.c	Thu Dec 14 01:58:05 2017	(r326836)
@@ -1002,13 +1002,16 @@ bhndb_pci_populate_board_info(device_t dev, device_t c
 		}
 	}
 
-	/* If NVRAM did not supply vendor/type info, provide the PCI
-	 * subvendor/subdevice values. */
+	/* If NVRAM did not supply vendor/type/devid info, provide the PCI
+	 * subvendor/subdevice/device values. */
 	if (info->board_vendor == 0)
 		info->board_vendor = pci_get_subvendor(sc->parent);
 
 	if (info->board_type == 0)
 		info->board_type = pci_get_subdevice(sc->parent);
+
+	if (info->board_devid == 0)
+		info->board_devid = pci_get_device(sc->parent);
 
 	return (0);
 }

Modified: head/sys/mips/broadcom/bhnd_nexus.c
==============================================================================
--- head/sys/mips/broadcom/bhnd_nexus.c	Wed Dec 13 21:17:00 2017	(r326835)
+++ head/sys/mips/broadcom/bhnd_nexus.c	Thu Dec 14 01:58:05 2017	(r326836)
@@ -153,6 +153,27 @@ bhnd_nexus_get_chipid(device_t dev, device_t child)
 }
 
 /**
+ * Default bhnd_nexus implementation of BHND_BUS_READ_BOARD_INFO().
+ */
+static int
+bhnd_nexus_read_board_info(device_t dev, device_t child,
+    struct bhnd_board_info *info)
+{
+	int error;
+
+	/* Initialize with NVRAM-derived values */
+	if ((error = bhnd_bus_generic_read_board_info(dev, child, info)))
+		return (error);
+
+	/* The board vendor should default to PCI_VENDOR_BROADCOM if not
+	 * otherwise specified */
+	if (info->board_vendor == 0)
+		info->board_vendor = PCI_VENDOR_BROADCOM;
+
+	return (0);
+}
+
+/**
  * Default bhnd_nexus implementation of BHND_BUS_MAP_INTR().
  */
 static int
@@ -249,6 +270,7 @@ static device_method_t bhnd_nexus_methods[] = {
 	DEVMETHOD(bhnd_bus_get_dma_translation,	bhnd_nexus_get_dma_translation),
 	DEVMETHOD(bhnd_bus_get_intr_domain,	bhnd_bus_generic_get_intr_domain),
 	DEVMETHOD(bhnd_bus_map_intr,		bhnd_nexus_map_intr),
+	DEVMETHOD(bhnd_bus_read_board_info,	bhnd_nexus_read_board_info),
 	DEVMETHOD(bhnd_bus_unmap_intr,		bhnd_nexus_unmap_intr),
 
 	DEVMETHOD_END



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201712140158.vBE1w5d8095065>