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