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
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to