diff options
author | Landon J. Fuller <landonf@FreeBSD.org> | 2017-03-17 22:02:02 +0000 |
---|---|---|
committer | Landon J. Fuller <landonf@FreeBSD.org> | 2017-03-17 22:02:02 +0000 |
commit | b86f80276b8cb2b778024e502e50e51322cfa1e6 (patch) | |
tree | 1103cde9bda9c90e3c4693884f73b68ad503d67e /sys/mips/broadcom | |
parent | e683c328f86eec53792d3bf5072ea666b458534b (diff) | |
download | src-b86f80276b8cb2b778024e502e50e51322cfa1e6.tar.gz src-b86f80276b8cb2b778024e502e50e51322cfa1e6.zip |
Add MIPS boot support for the BCM4706/Northstar ChipCommon core.
This adds support for matching against a core lookup table when performing
early boot core lookup, and includes the BCM4706/Northstar-specific
ChipCommon core ID in the set of supported ChipCommon cores.
Approved by: adrian (mentor)
Differential Revision: https://reviews.freebsd.org/D10033
Notes
Notes:
svn path=/head/; revision=315465
Diffstat (limited to 'sys/mips/broadcom')
-rw-r--r-- | sys/mips/broadcom/bcm_machdep.c | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/sys/mips/broadcom/bcm_machdep.c b/sys/mips/broadcom/bcm_machdep.c index 40fa466ce274..0d7177774847 100644 --- a/sys/mips/broadcom/bcm_machdep.c +++ b/sys/mips/broadcom/bcm_machdep.c @@ -98,9 +98,9 @@ __FBSDID("$FreeBSD$"); static int bcm_init_platform_data(struct bcm_platform *bp); -static int bcm_find_core(struct bcm_platform *bp, uint16_t vendor, - uint16_t device, int unit, struct bhnd_core_info *info, - uintptr_t *addr); +static int bcm_find_core(struct bcm_platform *bp, + const struct bhnd_core_match *descs, size_t num_descs, + struct bhnd_core_info *info, uintptr_t *addr); static int bcm_erom_probe_and_attach(bhnd_erom_class_t **erom_cls, kobj_ops_t erom_ops, bhnd_erom_t *erom, size_t esize, @@ -112,6 +112,15 @@ extern int *end; static struct bcm_platform bcm_platform_data; static bool bcm_platform_data_avail = false; +static const struct bhnd_core_match bcm_chipc_cores[] = { + { BHND_MATCH_CORE(BHND_MFGID_BCM, BHND_COREID_CC) }, + { BHND_MATCH_CORE(BHND_MFGID_BCM, BHND_COREID_4706_CC) }, +}; + +static const struct bhnd_core_match bcm_pmu_cores[] = { + { BHND_MATCH_CORE(BHND_MFGID_BCM, BHND_COREID_PMU) }, +}; + struct bcm_platform * bcm_get_platform(void) { @@ -133,39 +142,41 @@ bcm_get_bus_addr(void) } /** - * Search the device enumeration table for a core matching @p vendor, - * @p device, and @p unit. + * Search the device enumeration table for a core matching @p descs, * * @param bp Platform state containing a valid EROM parser. - * @param vendor The core's required vendor. - * @param device The core's required device id. - * @param unit The core's required unit number. + * @param descs The core match descriptor table. + * @param num_descs The number of match descriptors in @p descs. * @param[out] info If non-NULL, will be populated with the core * info. * @param[out] addr If non-NULL, will be populated with the core's * physical register address. */ static int -bcm_find_core(struct bcm_platform *bp, uint16_t vendor, uint16_t device, - int unit, struct bhnd_core_info *info, uintptr_t *addr) +bcm_find_core(struct bcm_platform *bp, const struct bhnd_core_match *descs, + size_t num_descs, struct bhnd_core_info *info, uintptr_t *addr) { - struct bhnd_core_match md; bhnd_addr_t b_addr; bhnd_size_t b_size; int error; - md = (struct bhnd_core_match) { - BHND_MATCH_CORE_VENDOR(vendor), - BHND_MATCH_CORE_ID(BHND_COREID_CC), - BHND_MATCH_CORE_UNIT(0) - }; - /* Fetch core info */ - error = bhnd_erom_lookup_core_addr(&bp->erom.obj, &md, BHND_PORT_DEVICE, - 0, 0, info, &b_addr, &b_size); - if (error) - return (error); + for (size_t i = 0; i < num_descs; i++) { + error = bhnd_erom_lookup_core_addr(&bp->erom.obj, &descs[i], + BHND_PORT_DEVICE, 0, 0, info, &b_addr, &b_size); + + /* Terminate search on first match */ + if (error == 0) + break; + /* Terminate on first error (other than core not found) */ + if (error != ENOENT) + return (error); + + /* Continue search ... */ + } + + /* Provide the core's base address */ if (addr != NULL && b_addr > UINTPTR_MAX) { BCM_ERR("core address %#jx overflows native address width\n", (uintmax_t)b_addr); @@ -286,8 +297,8 @@ bcm_init_platform_data(struct bcm_platform *bp) } /* Fetch chipcommon core info */ - error = bcm_find_core(bp, BHND_MFGID_BCM, BHND_COREID_CC, 0, &bp->cc_id, - &bp->cc_addr); + error = bcm_find_core(bp, bcm_chipc_cores, nitems(bcm_chipc_cores), + &bp->cc_id, &bp->cc_addr); if (error) { BCM_ERR("error locating chipc core: %d\n", error); return (error); @@ -306,9 +317,8 @@ bcm_init_platform_data(struct bcm_platform *bp) if (pmu && aob) { /* PMU block mapped to a PMU core on the Always-on-Bus (aob) */ - error = bcm_find_core(bp, BHND_MFGID_BCM, BHND_COREID_PMU, 0, + error = bcm_find_core(bp, bcm_pmu_cores, nitems(bcm_pmu_cores), &bp->pmu_id, &bp->pmu_addr); - if (error) { BCM_ERR("error locating pmu core: %d\n", error); return (error); |