svn commit: r300252 - in head/sys/dev/bhnd: bcma soc

Adrian Chadd adrian at FreeBSD.org
Fri May 20 01:03:00 UTC 2016


Author: adrian
Date: Fri May 20 01:02:58 2016
New Revision: 300252
URL: https://svnweb.freebsd.org/changeset/base/300252

Log:
  [bhnd] Add BHND SoC support (only BCMA case)
  
  This patch introduces support of BHND on SoC: nexus-to-bhnd drivers.
  
  bhnd_soc is attached under nexus and responsible for all BHND-style calls
  from bhnd(4) bus to parents.
  
  bcma_nexus is bhnd(4) bus, attached to bhnd_soc and implement all
  nexus-style behaviour of BHND.
  
  Submitted by:	Michael Zhilin <mizhka at gmail.com>
  Reviewed by:	Landon Fuller <landonf at landonf.org>
  Differential Revision:	https://reviews.freebsd.org/D6248

Added:
  head/sys/dev/bhnd/bcma/bcma_nexus.c   (contents, props changed)
  head/sys/dev/bhnd/soc/
  head/sys/dev/bhnd/soc/bhnd_soc.c   (contents, props changed)
  head/sys/dev/bhnd/soc/bhnd_soc.h   (contents, props changed)

Added: head/sys/dev/bhnd/bcma/bcma_nexus.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/bhnd/bcma/bcma_nexus.c	Fri May 20 01:02:58 2016	(r300252)
@@ -0,0 +1,111 @@
+/*-
+ * Copyright (c) 2016 Michael Zhilin <mizhka at gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+ *    redistribution must be conditioned upon including a substantially
+ *    similar Disclaimer requirement for further binary redistribution.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/errno.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+
+#include <dev/bhnd/bhnd.h>
+
+#include "bhnd_bus_if.h"
+#include "bcmavar.h"
+#include "bcma_eromreg.h"
+
+#define	BCMA_NEXUS_EROM_RID	10
+
+static int
+bcma_nexus_probe(device_t dev)
+{
+	const struct bhnd_chipid *cid = BHND_BUS_GET_CHIPID(device_get_parent(dev), dev);
+
+	/* Check bus type */
+	if (cid->chip_type != BHND_CHIPTYPE_BCMA)
+		return (ENXIO);
+
+	/* Delegate to default probe implementation */
+	return (bcma_probe(dev));
+}
+
+static int
+bcma_nexus_attach(device_t dev)
+{
+	int 		 erom_rid;
+	int 		 error;
+	struct resource	*erom_res;
+	const struct bhnd_chipid *cid = BHND_BUS_GET_CHIPID(device_get_parent(dev), dev);
+
+  	erom_rid = BCMA_NEXUS_EROM_RID;
+ 	error = bus_set_resource(dev, SYS_RES_MEMORY, erom_rid, cid->enum_addr, BCMA_EROM_TABLE_SIZE);
+ 	if (error != 0) {
+ 		BHND_ERROR_DEV(dev, "failed to set EROM resource");
+ 		return (error);
+ 	}
+
+ 	/* Map the EROM resource and enumerate our children. */
+ 	BHND_DEBUG_DEV(dev, "erom enum address: %jx", cid->enum_addr);
+ 	erom_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &erom_rid, RF_ACTIVE);
+ 	if (erom_res == NULL) {
+ 		BHND_ERROR_DEV(dev, "failed to allocate EROM resource");
+ 		return (ENXIO);
+ 	}
+
+ 	BHND_DEBUG_DEV(dev, "erom scanning start address: %p", rman_get_virtual(erom_res));
+ 	error = bcma_add_children(dev, erom_res, BCMA_EROM_TABLE_START);
+
+ 	/* Clean up */
+ 	bus_release_resource(dev, SYS_RES_MEMORY, erom_rid, erom_res);
+ 	if (error)
+ 		return (error);
+
+ 	/* Call our superclass' implementation */
+ 	return (bcma_attach(dev));
+}
+
+static device_method_t bcma_nexus_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_probe,			bcma_nexus_probe),
+	DEVMETHOD(device_attach,		bcma_nexus_attach),
+	DEVMETHOD_END
+};
+
+DEFINE_CLASS_1(bhnd, bcma_nexus_driver, bcma_nexus_methods, sizeof(struct bcma_softc), bcma_driver);
+EARLY_DRIVER_MODULE(bcma_nexus, bhnd_soc, bcma_nexus_driver, bhnd_devclass,
+    NULL, NULL, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);
+
+MODULE_VERSION(bcma_nexus, 1);
+MODULE_DEPEND(bcma_nexus, bcma, 1, 1, 1);
+MODULE_DEPEND(bcma_nexus, bhnd_soc, 1, 1, 1);

Added: head/sys/dev/bhnd/soc/bhnd_soc.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/bhnd/soc/bhnd_soc.c	Fri May 20 01:02:58 2016	(r300252)
@@ -0,0 +1,259 @@
+/*-
+ * Copyright (c) 2016 Michael Zhilin <mizhka at gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+ *    redistribution must be conditioned upon including a substantially
+ *    similar Disclaimer requirement for further binary redistribution.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/errno.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/rman.h>
+
+#include <machine/resource.h>
+
+#include <dev/bhnd/bhnd_debug.h>
+#include <dev/bhnd/bhndvar.h>
+#include <dev/bhnd/bhndreg.h>
+#include <dev/bhnd/bhndb/bhndb.h>
+#include <dev/bhnd/soc/bhnd_soc.h>
+
+#include "bhndb_if.h"
+
+/*
+ * **************************** VARIABLES *************************************
+ */
+
+struct resource_spec bhnd_soc_default_rspec = {SYS_RES_MEMORY, 0, RF_ACTIVE};
+
+/*
+ * **************************** PROTOTYPES ************************************
+ */
+
+static int	bhnd_soc_attach_bus(device_t dev, struct bhnd_soc_softc* sc);
+static int	bhnd_soc_probe(device_t dev);
+static int	bhnd_soc_attach(device_t dev);
+int		bhnd_soc_attach_by_class(device_t parent, device_t *child,
+		    int unit, devclass_t child_devclass);
+
+/*
+ * **************************** IMPLEMENTATION ********************************
+ */
+
+int
+bhnd_soc_attach_by_class(device_t parent, device_t *child, int unit,
+		devclass_t child_devclass)
+{
+	int error;
+	struct bhnd_soc_devinfo* devinfo;
+
+	*child = device_add_child(parent, devclass_get_name(child_devclass),
+		unit);
+	if (*child == NULL)
+		return (ENXIO);
+
+	devinfo = malloc(sizeof(struct bhnd_soc_devinfo*), M_BHND, M_NOWAIT);
+	resource_list_init(&devinfo->resources);
+
+	for (int i = 0; i < BHND_SOC_MAXNUM_CORES; i++)
+		resource_list_add(&devinfo->resources, SYS_RES_MEMORY, i,
+				BHND_SOC_RAM_OFFSET, BHND_SOC_RAM_SIZE, 1);
+
+	device_set_ivars(*child, devinfo);
+
+	error = device_probe_and_attach(*child);
+	if (error && device_delete_child(parent, *child))
+		BHND_ERROR_DEV(parent, "failed to detach bhndb child");
+
+	return (error);
+}
+
+static int
+bhnd_soc_attach_bus(device_t dev, struct bhnd_soc_softc* sc)
+{
+	int error;
+
+	error = bhnd_read_chipid(dev, &bhnd_soc_default_rspec,
+			BHND_DEFAULT_CHIPC_ADDR, &sc->chipid);
+
+	if (error) {
+		return (error);
+	}
+
+	return (bhnd_soc_attach_by_class(dev, &(sc->bus), -1, bhnd_devclass));
+}
+
+static int
+bhnd_soc_probe(device_t dev)
+{
+	return (BUS_PROBE_GENERIC);
+}
+
+static int
+bhnd_soc_attach(device_t dev)
+{
+	struct bhnd_soc_softc* sc;
+	sc = device_get_softc(dev);
+	sc->dev = dev;
+	return (bhnd_soc_attach_bus(dev,sc));
+}
+
+static const struct bhnd_chipid *
+bhnd_soc_get_chipid (device_t dev, device_t child)
+{
+	struct bhnd_soc_softc* sc;
+	sc = device_get_softc(dev);
+	return (&sc->chipid);
+}
+
+static struct resource_list *
+bhnd_soc_get_rl(device_t dev, device_t child)
+{
+	struct bhnd_soc_devinfo *dinfo;
+	dinfo = device_get_ivars(child);
+	return (&dinfo->resources);
+}
+
+static struct bhnd_resource *
+bhnd_soc_alloc_resource(device_t dev, device_t child, int type, int *rid,
+		rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
+{
+	struct bhnd_soc_softc	*sc;
+	struct bhnd_resource	*br;
+	int error;
+
+	sc = device_get_softc(dev);
+
+	/* Allocate resource wrapper */
+	br = malloc(sizeof(struct bhnd_resource), M_BHND, M_NOWAIT|M_ZERO);
+	if (br == NULL)
+		return (NULL);
+
+	BHND_TRACE_DEV(child,"trying to allocate resource %d: %jx-%jx (%ju)",
+			*rid, start, end, count);
+
+	/* Configure */
+	br->direct = true;
+	br->res = bus_alloc_resource(child, type, rid, start, end, count,
+	    flags & ~RF_ACTIVE);
+	if (br->res == NULL) {
+		BHND_ERROR_DEV(child, "can't allocate resource %d: %jx-%jx (%ju)",
+				*rid, start, end, count);
+		goto failed;
+	}
+
+	if (flags & RF_ACTIVE) {
+		BHND_TRACE_DEV(child, "trying to activate resource: %d", *rid);
+		error = bhnd_activate_resource(child, type, *rid, br);
+		if (error) {
+			BHND_ERROR_DEV(child, "can't activate BHND resource %d:"
+					"%jx-%jx (%ju) with error: %d",
+					*rid, start, end, count, error);
+			goto failed;
+		}
+	}
+
+	return (br);
+
+failed:
+	if (br->res != NULL)
+		bus_release_resource(child, type, *rid, br->res);
+
+	free(br, M_BHND);
+	return (NULL);
+}
+
+static int
+bhnd_soc_activate_resource(device_t dev, device_t child, int type, int rid,
+		struct bhnd_resource *r)
+{
+	int error;
+
+	/*
+	 * Fallback to direct
+	 */
+	error = bus_activate_resource(child, type, rid, r->res);
+	if (error) {
+		BHND_ERROR_DEV(child, "can't activate resource %d, error: %d",
+				rman_get_rid(r->res), error);
+		return (error);
+	}
+	r->direct = true;
+	return (0);
+}
+
+static bool
+bhnd_soc_is_hw_disabled(device_t dev, device_t child)
+{
+	return false;
+}
+
+/*
+ * **************************** DRIVER METADATA ****************************
+ */
+
+static device_method_t bhnd_soc_methods[] = {
+		//device interface
+	DEVMETHOD(device_probe,		bhnd_soc_probe),
+	DEVMETHOD(device_attach,	bhnd_soc_attach),
+	//resources
+	DEVMETHOD(bus_alloc_resource,	bus_generic_rl_alloc_resource),
+	DEVMETHOD(bus_delete_resource,	bus_generic_rl_delete_resource),
+	DEVMETHOD(bus_set_resource,	bus_generic_rl_set_resource),
+	DEVMETHOD(bus_get_resource,	bus_generic_rl_get_resource),
+	DEVMETHOD(bus_release_resource,	bus_generic_rl_release_resource),
+	//intr
+	DEVMETHOD(bus_setup_intr,	bus_generic_setup_intr),
+	DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
+	DEVMETHOD(bus_config_intr,	bus_generic_config_intr),
+	DEVMETHOD(bus_bind_intr,	bus_generic_bind_intr),
+	DEVMETHOD(bus_describe_intr,	bus_generic_describe_intr),
+
+	DEVMETHOD(bus_activate_resource,	bus_generic_activate_resource),
+	DEVMETHOD(bus_deactivate_resource,	bus_generic_deactivate_resource),
+	//resource list
+	DEVMETHOD(bus_get_resource_list,	bhnd_soc_get_rl),
+
+	//bhnd - BCMA allocates agent resources
+	DEVMETHOD(bhnd_bus_alloc_resource,	bhnd_soc_alloc_resource),
+	DEVMETHOD(bhnd_bus_activate_resource,	bhnd_soc_activate_resource),
+	DEVMETHOD(bhnd_bus_is_hw_disabled,	bhnd_soc_is_hw_disabled),
+	DEVMETHOD(bhnd_bus_get_chipid,		bhnd_soc_get_chipid),
+
+	DEVMETHOD_END
+};
+
+devclass_t bhnd_soc_devclass;
+
+DEFINE_CLASS_0(bhnd_soc, bhnd_soc_driver, bhnd_soc_methods,
+		sizeof(struct bhnd_soc_softc));
+EARLY_DRIVER_MODULE(bhnd_soc, nexus, bhnd_soc_driver, bhnd_soc_devclass, NULL,
+    NULL, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);

Added: head/sys/dev/bhnd/soc/bhnd_soc.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/bhnd/soc/bhnd_soc.h	Fri May 20 01:02:58 2016	(r300252)
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 2016 Michael Zhilin <mizhka at gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+ *    redistribution must be conditioned upon including a substantially
+ *    similar Disclaimer requirement for further binary redistribution.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+/*
+ * $FreeBSD$
+ */
+#ifndef _BHND_SOC_BHND_SOC_H_
+#define _BHND_SOC_BHND_SOC_H_
+
+#define	BHND_SOC_MAXNUM_CORES	0x20
+#define	BHND_SOC_RAM_OFFSET	0x0
+#define	BHND_SOC_RAM_SIZE	0x20000000
+
+struct bhnd_soc_softc {
+	device_t dev;
+	device_t bridge;
+	device_t bus;
+	struct bhnd_chipid	chipid;	/* chip identification */
+};
+
+struct bhnd_soc_devinfo {
+	struct resource_list resources;
+};
+
+#endif /* _BHND_SOC_BHND_SOC_H_ */


More information about the svn-src-head mailing list