The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/virtio/mmio/virtio_mmio_fdt.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2014 Ruslan Bukin <br@bsdpad.com>
    3  * Copyright (c) 2014 The FreeBSD Foundation
    4  * All rights reserved.
    5  *
    6  * This software was developed by SRI International and the University of
    7  * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
    8  * ("CTSRD"), as part of the DARPA CRASH research programme.
    9  *
   10  * Portions of this software were developed by Andrew Turner
   11  * under sponsorship from the FreeBSD Foundation.
   12  *
   13  * Redistribution and use in source and binary forms, with or without
   14  * modification, are permitted provided that the following conditions
   15  * are met:
   16  * 1. Redistributions of source code must retain the above copyright
   17  *    notice, this list of conditions and the following disclaimer.
   18  * 2. Redistributions in binary form must reproduce the above copyright
   19  *    notice, this list of conditions and the following disclaimer in the
   20  *    documentation and/or other materials provided with the distribution.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   32  * SUCH DAMAGE.
   33  */
   34 
   35 /*
   36  * VirtIO MMIO interface.
   37  * This driver is heavily based on VirtIO PCI interface driver.
   38  */
   39 
   40 /*
   41  * FDT example:
   42  *              virtio_block@1000 {
   43  *                      compatible = "virtio,mmio";
   44  *                      reg = <0x1000 0x100>;
   45  *                      interrupts = <63>;
   46  *                      interrupt-parent = <&GIC>;
   47  *              };
   48  */
   49 
   50 #include "opt_platform.h"
   51 
   52 #include <sys/cdefs.h>
   53 __FBSDID("$FreeBSD$");
   54 
   55 #include <sys/param.h>
   56 #include <sys/systm.h>
   57 #include <sys/bus.h>
   58 #include <sys/kernel.h>
   59 #include <sys/module.h>
   60 
   61 #include <dev/fdt/fdt_common.h>
   62 #include <dev/ofw/openfirm.h>
   63 #include <dev/ofw/ofw_bus.h>
   64 #include <dev/ofw/ofw_bus_subr.h>
   65 
   66 #include <dev/virtio/mmio/virtio_mmio.h>
   67 
   68 static int      vtmmio_fdt_probe(device_t);
   69 static int      vtmmio_fdt_attach(device_t);
   70 
   71 static device_method_t vtmmio_fdt_methods[] = {
   72         /* Device interface. */
   73         DEVMETHOD(device_probe,         vtmmio_fdt_probe),
   74         DEVMETHOD(device_attach,        vtmmio_fdt_attach),
   75 
   76         DEVMETHOD_END
   77 };
   78 
   79 DEFINE_CLASS_1(virtio_mmio, vtmmio_fdt_driver, vtmmio_fdt_methods,
   80     sizeof(struct vtmmio_softc), vtmmio_driver);
   81 
   82 DRIVER_MODULE(virtio_mmio, simplebus, vtmmio_fdt_driver, 0, 0);
   83 DRIVER_MODULE(virtio_mmio, ofwbus, vtmmio_fdt_driver, 0,0);
   84 MODULE_DEPEND(virtio_mmio, simplebus, 1, 1, 1);
   85 MODULE_DEPEND(virtio_mmio, virtio, 1, 1, 1);
   86 
   87 static int
   88 vtmmio_fdt_probe(device_t dev)
   89 {
   90 
   91         if (!ofw_bus_status_okay(dev))
   92                 return (ENXIO);
   93 
   94         if (!ofw_bus_is_compatible(dev, "virtio,mmio"))
   95                 return (ENXIO);
   96 
   97         return (vtmmio_probe(dev));
   98 }
   99 
  100 static int
  101 vtmmio_setup_platform(device_t dev, struct vtmmio_softc *sc)
  102 {
  103         phandle_t platform_node;
  104         struct fdt_ic *ic;
  105         phandle_t xref;
  106         phandle_t node;
  107 
  108         sc->platform = NULL;
  109 
  110         if ((node = ofw_bus_get_node(dev)) == -1)
  111                 return (ENXIO);
  112 
  113         if (OF_searchencprop(node, "platform", &xref,
  114                 sizeof(xref)) == -1) {
  115                 return (ENXIO);
  116         }
  117 
  118         platform_node = OF_node_from_xref(xref);
  119 
  120         SLIST_FOREACH(ic, &fdt_ic_list_head, fdt_ics) {
  121                 if (ic->iph == platform_node) {
  122                         sc->platform = ic->dev;
  123                         break;
  124                 }
  125         }
  126 
  127         if (sc->platform == NULL) {
  128                 /* No platform-specific device. Ignore it. */
  129         }
  130 
  131         return (0);
  132 }
  133 
  134 static int
  135 vtmmio_fdt_attach(device_t dev)
  136 {
  137         struct vtmmio_softc *sc;
  138 
  139         sc = device_get_softc(dev);
  140         vtmmio_setup_platform(dev, sc);
  141 
  142         return (vtmmio_attach(dev));
  143 }

Cache object: 19a972f850fff9d746d612575aba7ae9


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.