Author: andrew
Date: Sun Oct 21 15:43:20 2018
New Revision: 339540
URL: https://svnweb.freebsd.org/changeset/base/339540

Log:
  Split out the virtio mmio FDT attachment and add an ACPI attachment.
  
  This allows the memory mapped I/O virtio driver to attach when we boot
  with ACPI tables, for example in some cases with QEMU emulating arm64.
  
  MFC after:    1 month

Added:
  head/sys/dev/virtio/mmio/virtio_mmio_acpi.c   (contents, props changed)
  head/sys/dev/virtio/mmio/virtio_mmio_fdt.c   (contents, props changed)
Modified:
  head/sys/conf/files
  head/sys/dev/virtio/mmio/virtio_mmio.c
  head/sys/dev/virtio/mmio/virtio_mmio.h

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Sun Oct 21 15:10:59 2018        (r339539)
+++ head/sys/conf/files Sun Oct 21 15:43:20 2018        (r339540)
@@ -3430,8 +3430,10 @@ dev/virtio/virtqueue.c                   optional        
virtio
 dev/virtio/virtio_bus_if.m             optional        virtio
 dev/virtio/virtio_if.m                 optional        virtio
 dev/virtio/pci/virtio_pci.c            optional        virtio_pci
-dev/virtio/mmio/virtio_mmio.c          optional        virtio_mmio fdt
-dev/virtio/mmio/virtio_mmio_if.m       optional        virtio_mmio fdt
+dev/virtio/mmio/virtio_mmio.c          optional        virtio_mmio
+dev/virtio/mmio/virtio_mmio_acpi.c     optional        virtio_mmio acpi
+dev/virtio/mmio/virtio_mmio_fdt.c      optional        virtio_mmio fdt
+dev/virtio/mmio/virtio_mmio_if.m       optional        virtio_mmio
 dev/virtio/network/if_vtnet.c          optional        vtnet
 dev/virtio/block/virtio_blk.c          optional        virtio_blk
 dev/virtio/balloon/virtio_balloon.c    optional        virtio_balloon

Modified: head/sys/dev/virtio/mmio/virtio_mmio.c
==============================================================================
--- head/sys/dev/virtio/mmio/virtio_mmio.c      Sun Oct 21 15:10:59 2018        
(r339539)
+++ head/sys/dev/virtio/mmio/virtio_mmio.c      Sun Oct 21 15:43:20 2018        
(r339540)
@@ -37,16 +37,6 @@
  * This driver is heavily based on VirtIO PCI interface driver.
  */
 
-/*
- * FDT example:
- *             virtio_block@1000 {
- *                     compatible = "virtio,mmio";
- *                     reg = <0x1000 0x100>;
- *                     interrupts = <63>;
- *                     interrupt-parent = <&GIC>;
- *             };
- */
-
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
@@ -61,11 +51,6 @@ __FBSDID("$FreeBSD$");
 #include <machine/bus.h>
 #include <machine/resource.h>
 
-#include <dev/fdt/fdt_common.h>
-#include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-
 #include <dev/virtio/virtio.h>
 #include <dev/virtio/virtqueue.h>
 #include <dev/virtio/mmio/virtio_mmio.h>
@@ -81,25 +66,6 @@ struct vtmmio_virtqueue {
        int                      vtv_no_intr;
 };
 
-struct vtmmio_softc {
-       device_t                        dev;
-       device_t                        platform;
-       struct resource                 *res[2];
-
-       uint64_t                        vtmmio_features;
-       uint32_t                        vtmmio_flags;
-
-       /* This "bus" will only ever have one child. */
-       device_t                        vtmmio_child_dev;
-       struct virtio_feature_desc      *vtmmio_child_feat_desc;
-
-       int                             vtmmio_nvqs;
-       struct vtmmio_virtqueue         *vtmmio_vqs;
-       void                            *ih;
-};
-
-static int     vtmmio_probe(device_t);
-static int     vtmmio_attach(device_t);
 static int     vtmmio_detach(device_t);
 static int     vtmmio_suspend(device_t);
 static int     vtmmio_resume(device_t);
@@ -170,7 +136,6 @@ do {                                                        
        \
 
 static device_method_t vtmmio_methods[] = {
        /* Device interface. */
-       DEVMETHOD(device_probe,                   vtmmio_probe),
        DEVMETHOD(device_attach,                  vtmmio_attach),
        DEVMETHOD(device_detach,                  vtmmio_detach),
        DEVMETHOD(device_suspend,                 vtmmio_suspend),
@@ -199,19 +164,10 @@ static device_method_t vtmmio_methods[] = {
        DEVMETHOD_END
 };
 
-static driver_t vtmmio_driver = {
-       "virtio_mmio",
-       vtmmio_methods,
-       sizeof(struct vtmmio_softc)
-};
+DEFINE_CLASS_0(virtio_mmio, vtmmio_driver, vtmmio_methods,
+    sizeof(struct vtmmio_softc));
 
-devclass_t vtmmio_devclass;
-
-DRIVER_MODULE(virtio_mmio, simplebus, vtmmio_driver, vtmmio_devclass, 0, 0);
-DRIVER_MODULE(virtio_mmio, ofwbus, vtmmio_driver, vtmmio_devclass, 0, 0);
 MODULE_VERSION(virtio_mmio, 1);
-MODULE_DEPEND(virtio_mmio, simplebus, 1, 1, 1);
-MODULE_DEPEND(virtio_mmio, virtio, 1, 1, 1);
 
 static int
 vtmmio_setup_intr(device_t dev, enum intr_type type)
@@ -248,55 +204,7 @@ vtmmio_setup_intr(device_t dev, enum intr_type type)
        return (0);
 }
 
-static int
-vtmmio_probe(device_t dev)
-{
-
-       if (!ofw_bus_status_okay(dev))
-               return (ENXIO);
-
-       if (!ofw_bus_is_compatible(dev, "virtio,mmio"))
-               return (ENXIO);
-
-       device_set_desc(dev, "VirtIO MMIO adapter");
-       return (BUS_PROBE_DEFAULT);
-}
-
-static int
-vtmmio_setup_platform(struct vtmmio_softc *sc)
-{
-       phandle_t platform_node;
-       struct fdt_ic *ic;
-       phandle_t xref;
-       phandle_t node;
-
-       sc->platform = NULL;
-
-       if ((node = ofw_bus_get_node(sc->dev)) == -1)
-               return (ENXIO);
-
-       if (OF_searchencprop(node, "platform", &xref,
-               sizeof(xref)) == -1) {
-               return (ENXIO);
-       }
-
-       platform_node = OF_node_from_xref(xref);
-
-       SLIST_FOREACH(ic, &fdt_ic_list_head, fdt_ics) {
-               if (ic->iph == platform_node) {
-                       sc->platform = ic->dev;
-                       break;
-               }
-       }
-
-       if (sc->platform == NULL) {
-               /* No platform-specific device. Ignore it. */
-       }
-
-       return (0);
-}
-
-static int
+int
 vtmmio_attach(device_t dev)
 {
        struct vtmmio_softc *sc;
@@ -305,8 +213,6 @@ vtmmio_attach(device_t dev)
 
        sc = device_get_softc(dev);
        sc->dev = dev;
-
-       vtmmio_setup_platform(sc);
 
        rid = 0;
        sc->res[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,

Modified: head/sys/dev/virtio/mmio/virtio_mmio.h
==============================================================================
--- head/sys/dev/virtio/mmio/virtio_mmio.h      Sun Oct 21 15:10:59 2018        
(r339539)
+++ head/sys/dev/virtio/mmio/virtio_mmio.h      Sun Oct 21 15:43:20 2018        
(r339540)
@@ -33,6 +33,29 @@
 #ifndef        _VIRTIO_MMIO_H
 #define        _VIRTIO_MMIO_H
 
+DECLARE_CLASS(vtmmio_driver);
+
+struct vtmmio_virtqueue;
+
+struct vtmmio_softc {
+       device_t                        dev;
+       device_t                        platform;
+       struct resource                 *res[2];
+
+       uint64_t                        vtmmio_features;
+       uint32_t                        vtmmio_flags;
+
+       /* This "bus" will only ever have one child. */
+       device_t                        vtmmio_child_dev;
+       struct virtio_feature_desc      *vtmmio_child_feat_desc;
+
+       int                             vtmmio_nvqs;
+       struct vtmmio_virtqueue         *vtmmio_vqs;
+       void                            *ih;
+};
+
+int vtmmio_attach(device_t);
+
 #define        VIRTIO_MMIO_MAGIC_VALUE         0x000
 #define        VIRTIO_MMIO_VERSION             0x004
 #define        VIRTIO_MMIO_DEVICE_ID           0x008

Added: head/sys/dev/virtio/mmio/virtio_mmio_acpi.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/dev/virtio/mmio/virtio_mmio_acpi.c Sun Oct 21 15:43:20 2018        
(r339540)
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2014 Ruslan Bukin <b...@bsdpad.com>
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
+ * ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Portions of this software were developed by Andrew Turner
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * 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.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, 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 DAMAGE.
+ */
+
+/*
+ * VirtIO MMIO interface.
+ * This driver is heavily based on VirtIO PCI interface driver.
+ */
+
+#include "opt_acpi.h"
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+
+#include <contrib/dev/acpica/include/acpi.h>
+#include <dev/acpica/acpivar.h>
+
+#include <dev/virtio/mmio/virtio_mmio.h>
+
+static int     vtmmio_acpi_probe(device_t);
+
+static device_method_t vtmmio_acpi_methods[] = {
+       /* Device interface. */
+       DEVMETHOD(device_probe,         vtmmio_acpi_probe),
+
+       DEVMETHOD_END
+};
+
+DEFINE_CLASS_1(virtio_mmio, vtmmio_acpi_driver, vtmmio_acpi_methods,
+    sizeof(struct vtmmio_softc), vtmmio_driver);
+
+static devclass_t vtmmio_acpi_devclass;
+
+DRIVER_MODULE(virtio_mmio, acpi, vtmmio_acpi_driver, vtmmio_acpi_devclass, 
0,0);
+MODULE_DEPEND(virtio_mmio, acpi, 1, 1, 1);
+
+static int
+vtmmio_acpi_probe(device_t dev)
+{
+       ACPI_HANDLE h;
+
+       if ((h = acpi_get_handle(dev)) == NULL)
+               return (ENXIO);
+
+       if (!acpi_MatchHid(h, "LNRO0005"))
+               return (ENXIO);
+
+       device_set_desc(dev, "VirtIO MMIO adapter");
+       return (BUS_PROBE_DEFAULT);
+}

Added: head/sys/dev/virtio/mmio/virtio_mmio_fdt.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/dev/virtio/mmio/virtio_mmio_fdt.c  Sun Oct 21 15:43:20 2018        
(r339540)
@@ -0,0 +1,147 @@
+/*-
+ * Copyright (c) 2014 Ruslan Bukin <b...@bsdpad.com>
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
+ * ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Portions of this software were developed by Andrew Turner
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * 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.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, 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 DAMAGE.
+ */
+
+/*
+ * VirtIO MMIO interface.
+ * This driver is heavily based on VirtIO PCI interface driver.
+ */
+
+/*
+ * FDT example:
+ *             virtio_block@1000 {
+ *                     compatible = "virtio,mmio";
+ *                     reg = <0x1000 0x100>;
+ *                     interrupts = <63>;
+ *                     interrupt-parent = <&GIC>;
+ *             };
+ */
+
+#include "opt_platform.h"
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include <dev/virtio/mmio/virtio_mmio.h>
+
+static int     vtmmio_fdt_probe(device_t);
+static int     vtmmio_fdt_attach(device_t);
+
+static device_method_t vtmmio_fdt_methods[] = {
+       /* Device interface. */
+       DEVMETHOD(device_probe,         vtmmio_fdt_probe),
+       DEVMETHOD(device_attach,        vtmmio_fdt_attach),
+
+       DEVMETHOD_END
+};
+
+DEFINE_CLASS_1(virtio_mmio, vtmmio_fdt_driver, vtmmio_fdt_methods,
+    sizeof(struct vtmmio_softc), vtmmio_driver);
+
+static devclass_t vtmmio_fdt_devclass;
+
+DRIVER_MODULE(virtio_mmio, simplebus, vtmmio_fdt_driver, vtmmio_fdt_devclass,
+    0, 0);
+DRIVER_MODULE(virtio_mmio, ofwbus, vtmmio_fdt_driver, vtmmio_fdt_devclass, 
0,0);
+MODULE_DEPEND(virtio_mmio, simplebus, 1, 1, 1);
+MODULE_DEPEND(virtio_mmio, virtio, 1, 1, 1);
+
+static int
+vtmmio_fdt_probe(device_t dev)
+{
+
+       if (!ofw_bus_status_okay(dev))
+               return (ENXIO);
+
+       if (!ofw_bus_is_compatible(dev, "virtio,mmio"))
+               return (ENXIO);
+
+       device_set_desc(dev, "VirtIO MMIO adapter");
+       return (BUS_PROBE_DEFAULT);
+}
+
+static int
+vtmmio_setup_platform(device_t dev, struct vtmmio_softc *sc)
+{
+       phandle_t platform_node;
+       struct fdt_ic *ic;
+       phandle_t xref;
+       phandle_t node;
+
+       sc->platform = NULL;
+
+       if ((node = ofw_bus_get_node(dev)) == -1)
+               return (ENXIO);
+
+       if (OF_searchencprop(node, "platform", &xref,
+               sizeof(xref)) == -1) {
+               return (ENXIO);
+       }
+
+       platform_node = OF_node_from_xref(xref);
+
+       SLIST_FOREACH(ic, &fdt_ic_list_head, fdt_ics) {
+               if (ic->iph == platform_node) {
+                       sc->platform = ic->dev;
+                       break;
+               }
+       }
+
+       if (sc->platform == NULL) {
+               /* No platform-specific device. Ignore it. */
+       }
+
+       return (0);
+}
+
+static int
+vtmmio_fdt_attach(device_t dev)
+{
+       struct vtmmio_softc *sc;
+
+       sc = device_get_softc(dev);
+       vtmmio_setup_platform(dev, sc);
+
+       return (vtmmio_attach(dev));
+}
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to