svn commit: r339540 - in head/sys: conf dev/virtio/mmio

Andrew Turner andrew at FreeBSD.org
Sun Oct 21 15:43:22 UTC 2018


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 at 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 <br at 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 <br at 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 at 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));
+}


More information about the svn-src-head mailing list