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-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"