From owner-svn-src-all@freebsd.org Mon Feb 13 19:58:57 2017 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 118A6CDD519; Mon, 13 Feb 2017 19:58:57 +0000 (UTC) (envelope-from landonf@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id D14825FA; Mon, 13 Feb 2017 19:58:56 +0000 (UTC) (envelope-from landonf@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v1DJwtud021621; Mon, 13 Feb 2017 19:58:55 GMT (envelope-from landonf@FreeBSD.org) Received: (from landonf@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v1DJwtvd021615; Mon, 13 Feb 2017 19:58:55 GMT (envelope-from landonf@FreeBSD.org) Message-Id: <201702131958.v1DJwtvd021615@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: landonf set sender to landonf@FreeBSD.org using -f From: "Landon J. Fuller" Date: Mon, 13 Feb 2017 19:58:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r313705 - in head/sys: conf dev/bhnd dev/bhnd/bcma dev/bhnd/siba mips/broadcom X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Feb 2017 19:58:57 -0000 Author: landonf Date: Mon Feb 13 19:58:55 2017 New Revision: 313705 URL: https://svnweb.freebsd.org/changeset/base/313705 Log: [mips/broadcom] Move MIPS-specific bhnd(4) nexus drivers to sys/mips/broadcom, and add MIPS/BCM4706-specific workaround to bhnd_nexus_is_hw_disabled() -- the BCM4706 low-cost package leaves secondary GMAC cores floating. Reviewed by: mizhka Approved by: adrian (mentor) Differential Revision: https://reviews.freebsd.org/D9499 Added: head/sys/mips/broadcom/bcma_nexus.c - copied, changed from r313704, head/sys/dev/bhnd/bcma/bcma_nexus.c head/sys/mips/broadcom/bhnd_nexus.c - copied, changed from r313704, head/sys/dev/bhnd/bhnd_nexus.c head/sys/mips/broadcom/bhnd_nexusvar.h - copied, changed from r313704, head/sys/dev/bhnd/bhnd_nexusvar.h head/sys/mips/broadcom/siba_nexus.c - copied, changed from r313704, head/sys/dev/bhnd/siba/siba_nexus.c Deleted: head/sys/dev/bhnd/bcma/bcma_nexus.c head/sys/dev/bhnd/bhnd_nexus.c head/sys/dev/bhnd/bhnd_nexusvar.h head/sys/dev/bhnd/siba/siba_nexus.c Modified: head/sys/conf/files head/sys/mips/broadcom/files.broadcom Modified: head/sys/conf/files ============================================================================== --- head/sys/conf/files Mon Feb 13 19:00:09 2017 (r313704) +++ head/sys/conf/files Mon Feb 13 19:58:55 2017 (r313705) @@ -1190,8 +1190,6 @@ dev/bge/if_bge.c optional bge dev/bhnd/bhnd.c optional bhnd dev/bhnd/bhnd_erom.c optional bhnd dev/bhnd/bhnd_erom_if.m optional bhnd -dev/bhnd/bhnd_nexus.c optional bhnd siba_nexus | \ - bhnd bcma_nexus dev/bhnd/bhnd_subr.c optional bhnd dev/bhnd/bhnd_bus_if.m optional bhnd dev/bhnd/bhndb/bhnd_bhndb.c optional bhndb bhnd @@ -1206,7 +1204,6 @@ dev/bhnd/bhndb/bhndb_subr.c optional bh dev/bhnd/bcma/bcma.c optional bcma bhnd dev/bhnd/bcma/bcma_bhndb.c optional bcma bhnd bhndb dev/bhnd/bcma/bcma_erom.c optional bcma bhnd -dev/bhnd/bcma/bcma_nexus.c optional bcma_nexus bcma bhnd dev/bhnd/bcma/bcma_subr.c optional bcma bhnd dev/bhnd/cores/chipc/bhnd_chipc_if.m optional bhnd dev/bhnd/cores/chipc/bhnd_sprom_chipc.c optional bhnd @@ -1252,7 +1249,6 @@ dev/bhnd/nvram/bhnd_sprom.c optional bh dev/bhnd/siba/siba.c optional siba bhnd dev/bhnd/siba/siba_bhndb.c optional siba bhnd bhndb dev/bhnd/siba/siba_erom.c optional siba bhnd -dev/bhnd/siba/siba_nexus.c optional siba_nexus siba bhnd dev/bhnd/siba/siba_subr.c optional siba bhnd # dev/bktr/bktr_audio.c optional bktr pci Copied and modified: head/sys/mips/broadcom/bcma_nexus.c (from r313704, head/sys/dev/bhnd/bcma/bcma_nexus.c) ============================================================================== --- head/sys/dev/bhnd/bcma/bcma_nexus.c Mon Feb 13 19:00:09 2017 (r313704, copy source) +++ head/sys/mips/broadcom/bcma_nexus.c Mon Feb 13 19:58:55 2017 (r313705) @@ -43,49 +43,41 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include "bcmavar.h" -#include "bcma_eromreg.h" +#include + +#include "bcm_machdep.h" + +#include "bhnd_nexusvar.h" /* - * Supports bcma(4) attachment to a nexus bus. + * Supports bcma(4) attachment to a MIPS nexus bus. */ static int bcma_nexus_attach(device_t); static int bcma_nexus_probe(device_t); -struct bcma_nexus_softc { - struct bcma_softc parent_sc; - struct bhnd_chipid bcma_cid; -}; - static int bcma_nexus_probe(device_t dev) { - struct bcma_nexus_softc *sc; - int error; - - sc = device_get_softc(dev); - - /* Read the ChipCommon info using the hints the kernel - * was compiled with. */ - if ((error = bhnd_nexus_read_chipid(dev, &sc->bcma_cid))) - return (error); + int error; - if (sc->bcma_cid.chip_type != BHND_CHIPTYPE_BCMA) + switch (bcm_get_platform()->cid.chip_type) { + case BHND_CHIPTYPE_BCMA: + case BHND_CHIPTYPE_BCMA_ALT: + case BHND_CHIPTYPE_UBUS: + break; + default: return (ENXIO); + } - if ((error = bcma_probe(dev)) > 0) { - device_printf(dev, "error %d in probe\n", error); + if ((error = bcma_probe(dev)) > 0) return (error); - } /* Set device description */ - bhnd_set_default_bus_desc(dev, &sc->bcma_cid); + bhnd_set_default_bus_desc(dev, &bcm_get_platform()->cid); - return (0); + return (BUS_PROBE_SPECIFIC); } static int @@ -108,25 +100,15 @@ failed: return (error); } -static const struct bhnd_chipid * -bcma_nexus_get_chipid(device_t dev, device_t child) { - struct bcma_nexus_softc *sc = device_get_softc(dev); - return (&sc->bcma_cid); -} - static device_method_t bcma_nexus_methods[] = { - /* Device interface */ DEVMETHOD(device_probe, bcma_nexus_probe), DEVMETHOD(device_attach, bcma_nexus_attach), - /* bhnd interface */ - DEVMETHOD(bhnd_bus_get_chipid, bcma_nexus_get_chipid), - DEVMETHOD_END }; DEFINE_CLASS_2(bhnd, bcma_nexus_driver, bcma_nexus_methods, - sizeof(struct bcma_nexus_softc), bhnd_nexus_driver, bcma_driver); + sizeof(struct bcma_softc), bhnd_nexus_driver, bcma_driver); EARLY_DRIVER_MODULE(bcma_nexus, nexus, bcma_nexus_driver, bhnd_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE); Copied and modified: head/sys/mips/broadcom/bhnd_nexus.c (from r313704, head/sys/dev/bhnd/bhnd_nexus.c) ============================================================================== --- head/sys/dev/bhnd/bhnd_nexus.c Mon Feb 13 19:00:09 2017 (r313704, copy source) +++ head/sys/mips/broadcom/bhnd_nexus.c Mon Feb 13 19:58:55 2017 (r313705) @@ -32,10 +32,9 @@ #include __FBSDID("$FreeBSD$"); - /* * bhnd(4) driver mix-in providing shared common methods for - * bhnd bus devices attached via a root nexus. + * bhnd bus devices attached via a MIPS root nexus. */ #include @@ -48,50 +47,16 @@ __FBSDID("$FreeBSD$"); #include +#include #include -#include -#include "bhnd_nexusvar.h" +#include "bcm_machdep.h" -static const struct resource_spec bhnd_nexus_res_spec[] = { - { SYS_RES_MEMORY, 0, RF_ACTIVE }, /* chipc registers */ - { -1, 0, 0 } -}; +#include "bhnd_nexusvar.h" /** - * Map ChipCommon's register block and read the chip identifier data. - * - * @param dev A bhnd_nexus device. - * @param chipid On success, will be populated with the chip identifier. - * @retval 0 success - * @retval non-zero An error occurred reading the chip identifier.. - */ -int -bhnd_nexus_read_chipid(device_t dev, struct bhnd_chipid *chipid) -{ - struct resource_spec rspec[nitems(bhnd_nexus_res_spec)]; - int error; - - memcpy(rspec, bhnd_nexus_res_spec, sizeof(rspec)); - error = bhnd_read_chipid(dev, rspec, 0, chipid); - if (error) - device_printf(dev, "error %d reading chip ID\n", error); - - return (error); -} - -static bool -bhnd_nexus_is_hw_disabled(device_t dev, device_t child) -{ - return (false); -} - -static bhnd_attach_type -bhnd_nexus_get_attach_type(device_t dev, device_t child) -{ - return (BHND_ATTACH_NATIVE); -} - + * Default bhnd_nexus implementation of BHND_BUS_ACTIVATE_RESOURCE(). + */ static int bhnd_nexus_activate_resource(device_t dev, device_t child, int type, int rid, struct bhnd_resource *r) @@ -106,6 +71,9 @@ bhnd_nexus_activate_resource(device_t de return (0); } +/** + * Default bhnd_nexus implementation of BHND_BUS_DEACTIVATE_RESOURCE(). + */ static int bhnd_nexus_deactivate_resource(device_t dev, device_t child, int type, int rid, struct bhnd_resource *r) @@ -122,6 +90,52 @@ bhnd_nexus_deactivate_resource(device_t return (0); } +/** + * Default bhnd_nexus implementation of BHND_BUS_IS_HW_DISABLED(). + */ +static bool +bhnd_nexus_is_hw_disabled(device_t dev, device_t child) +{ + struct bcm_platform *bp; + struct bhnd_chipid *cid; + + bp = bcm_get_platform(); + cid = &bp->cid; + + /* The BCM4706 low-cost package leaves secondary GMAC cores + * floating */ + if (cid->chip_id == BHND_CHIPID_BCM4706 && + cid->chip_pkg == BHND_PKGID_BCM4706L && + bhnd_get_device(child) == BHND_COREID_4706_GMAC && + bhnd_get_core_unit(child) != 0) + { + return (true); + } + + return (false); +} + +/** + * Default bhnd_nexus implementation of BHND_BUS_AGET_ATTACH_TYPE(). + */ +static bhnd_attach_type +bhnd_nexus_get_attach_type(device_t dev, device_t child) +{ + return (BHND_ATTACH_NATIVE); +} + +/** + * Default bhnd_nexus implementation of BHND_BUS_GET_CHIPID(). + */ +static const struct bhnd_chipid * +bhnd_nexus_get_chipid(device_t dev, device_t child) +{ + return (&bcm_get_platform()->cid); +} + +/** + * Default bhnd_nexus implementation of BHND_BUS_GET_INTR_COUNT(). + */ static int bhnd_nexus_get_intr_count(device_t dev, device_t child) { @@ -129,14 +143,30 @@ bhnd_nexus_get_intr_count(device_t dev, return (0); } +/** + * Default bhnd_nexus implementation of BHND_BUS_ASSIGN_INTR(). + */ +static int +bhnd_nexus_assign_intr(device_t dev, device_t child, int rid) +{ + uint32_t ivec; + int error; + + if ((error = bhnd_get_core_ivec(child, rid, &ivec))) + return (error); + + return (bus_set_resource(child, SYS_RES_IRQ, rid, ivec, 1)); +} + static device_method_t bhnd_nexus_methods[] = { /* bhnd interface */ DEVMETHOD(bhnd_bus_activate_resource, bhnd_nexus_activate_resource), DEVMETHOD(bhnd_bus_deactivate_resource, bhnd_nexus_deactivate_resource), DEVMETHOD(bhnd_bus_is_hw_disabled, bhnd_nexus_is_hw_disabled), DEVMETHOD(bhnd_bus_get_attach_type, bhnd_nexus_get_attach_type), - + DEVMETHOD(bhnd_bus_get_chipid, bhnd_nexus_get_chipid), DEVMETHOD(bhnd_bus_get_intr_count, bhnd_nexus_get_intr_count), + DEVMETHOD(bhnd_bus_assign_intr, bhnd_nexus_assign_intr), DEVMETHOD_END }; Copied and modified: head/sys/mips/broadcom/bhnd_nexusvar.h (from r313704, head/sys/dev/bhnd/bhnd_nexusvar.h) ============================================================================== --- head/sys/dev/bhnd/bhnd_nexusvar.h Mon Feb 13 19:00:09 2017 (r313704, copy source) +++ head/sys/mips/broadcom/bhnd_nexusvar.h Mon Feb 13 19:58:55 2017 (r313705) @@ -29,18 +29,12 @@ * $FreeBSD$ */ -#ifndef _BHND_BHND_NEXUSVAR_H_ -#define _BHND_BHND_NEXUSVAR_H_ +#ifndef _MIPS_BROADCOM_BHND_NEXUSVAR_H_ +#define _MIPS_BROADCOM_BHND_NEXUSVAR_H_ #include -#include -#include -#include - -#include "bhndvar.h" +#include DECLARE_CLASS(bhnd_nexus_driver); -int bhnd_nexus_read_chipid(device_t dev, struct bhnd_chipid *chipid); - -#endif /* _BHND_BHND_NEXUSVAR_H_ */ +#endif /* _MIPS_BROADCOM_BHND_NEXUSVAR_H_ */ Modified: head/sys/mips/broadcom/files.broadcom ============================================================================== --- head/sys/mips/broadcom/files.broadcom Mon Feb 13 19:00:09 2017 (r313704) +++ head/sys/mips/broadcom/files.broadcom Mon Feb 13 19:58:55 2017 (r313705) @@ -10,6 +10,12 @@ mips/broadcom/bcm_mips74k.c optional bc mips/broadcom/bcm_nvram_cfe.c optional bhnd siba_nexus cfe | \ bhnd bcma_nexus cfe mips/broadcom/bcm_pmu.c standard + +mips/broadcom/bhnd_nexus.c optional bhnd siba_nexus | \ + bhnd bcma_nexus +mips/broadcom/bcma_nexus.c optional bcma_nexus bcma bhnd +mips/broadcom/siba_nexus.c optional siba_nexus siba bhnd + mips/mips/tick.c standard mips/broadcom/uart_cpu_chipc.c optional uart Copied and modified: head/sys/mips/broadcom/siba_nexus.c (from r313704, head/sys/dev/bhnd/siba/siba_nexus.c) ============================================================================== --- head/sys/dev/bhnd/siba/siba_nexus.c Mon Feb 13 19:00:09 2017 (r313704, copy source) +++ head/sys/mips/broadcom/siba_nexus.c Mon Feb 13 19:58:55 2017 (r313705) @@ -38,10 +38,12 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include "sibavar.h" +#include + +#include "bcm_machdep.h" + +#include "bhnd_nexusvar.h" /* * Supports siba(4) attachment to a MIPS nexus bus. @@ -49,36 +51,21 @@ __FBSDID("$FreeBSD$"); * Derived from Bruce M. Simpson' original siba(4) driver. */ -struct siba_nexus_softc { - struct siba_softc parent_sc; - struct bhnd_chipid siba_cid; -}; - static int siba_nexus_probe(device_t dev) { - struct siba_nexus_softc *sc; - int error; - - sc = device_get_softc(dev); - - /* Read the ChipCommon info using the hints the kernel - * was compiled with. */ - if ((error = bhnd_nexus_read_chipid(dev, &sc->siba_cid))) - return (error); + int error; - if (sc->siba_cid.chip_type != BHND_CHIPTYPE_SIBA) + if (bcm_get_platform()->cid.chip_type != BHND_CHIPTYPE_SIBA) return (ENXIO); - if ((error = siba_probe(dev)) > 0) { - device_printf(dev, "error %d in probe\n", error); + if ((error = siba_probe(dev)) > 0) return (error); - } /* Set device description */ - bhnd_set_default_bus_desc(dev, &sc->siba_cid); + bhnd_set_default_bus_desc(dev, &bcm_get_platform()->cid); - return (0); + return (BUS_PROBE_SPECIFIC); } static int @@ -101,25 +88,16 @@ failed: return (error); } -static const struct bhnd_chipid * -siba_nexus_get_chipid(device_t dev, device_t child) { - struct siba_nexus_softc *sc = device_get_softc(dev); - return (&sc->siba_cid); -} - static device_method_t siba_nexus_methods[] = { /* Device interface */ DEVMETHOD(device_probe, siba_nexus_probe), DEVMETHOD(device_attach, siba_nexus_attach), - /* bhnd interface */ - DEVMETHOD(bhnd_bus_get_chipid, siba_nexus_get_chipid), - DEVMETHOD_END }; DEFINE_CLASS_2(bhnd, siba_nexus_driver, siba_nexus_methods, - sizeof(struct siba_nexus_softc), bhnd_nexus_driver, siba_driver); + sizeof(struct siba_softc), bhnd_nexus_driver, siba_driver); EARLY_DRIVER_MODULE(siba_nexus, nexus, siba_nexus_driver, bhnd_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);