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 <miz...@gmail.com>
  Reviewed by:  Landon Fuller <land...@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 <miz...@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 <miz...@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 <miz...@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_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to