svn commit: r313705 - in head/sys: conf dev/bhnd dev/bhnd/bcma dev/bhnd/siba mips/broadcom

Landon J. Fuller landonf at FreeBSD.org
Mon Feb 13 19:58:57 UTC 2017


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 <machine/resource.h>
 
 #include <dev/bhnd/bhnd_ids.h>
-#include <dev/bhnd/bhnd_nexusvar.h>
-#include <dev/bhnd/cores/chipc/chipcreg.h>
 
-#include "bcmavar.h"
-#include "bcma_eromreg.h"
+#include <dev/bhnd/bcma/bcmavar.h>
+
+#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 <sys/cdefs.h>
 __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 <sys/param.h>
@@ -48,50 +47,16 @@ __FBSDID("$FreeBSD$");
 
 #include <machine/bus.h>
 
+#include <dev/bhnd/bhndvar.h>
 #include <dev/bhnd/bhnd_ids.h>
-#include <dev/bhnd/cores/chipc/chipcreg.h>
 
-#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 <sys/param.h>
-#include <sys/kernel.h>
-#include <sys/bus.h>
-#include <sys/module.h>
-
-#include "bhndvar.h"
+#include <sys/kobj.h>
 
 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 <machine/resource.h>
 
 #include <dev/bhnd/bhnd_ids.h>
-#include <dev/bhnd/bhnd_nexusvar.h>
-#include <dev/bhnd/cores/chipc/chipcreg.h>
 
-#include "sibavar.h"
+#include <dev/bhnd/siba/sibavar.h>
+
+#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);


More information about the svn-src-head mailing list