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/virtio.h

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  * SPDX-License-Identifier: BSD-2-Clause
    3  *
    4  * Copyright (c) 2014, Bryan Venteicher <bryanv@FreeBSD.org>
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice unmodified, this list of conditions, and the following
   12  *    disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   27  *
   28  * $FreeBSD$
   29  */
   30 
   31 #ifndef _VIRTIO_H_
   32 #define _VIRTIO_H_
   33 
   34 #include <dev/virtio/virtio_endian.h>
   35 #include <dev/virtio/virtio_ids.h>
   36 #include <dev/virtio/virtio_config.h>
   37 
   38 #ifdef _KERNEL
   39 
   40 struct sbuf;
   41 struct vq_alloc_info;
   42 
   43 /*
   44  * Each virtqueue indirect descriptor list must be physically contiguous.
   45  * To allow us to malloc(9) each list individually, limit the number
   46  * supported to what will fit in one page. With 4KB pages, this is a limit
   47  * of 256 descriptors. If there is ever a need for more, we can switch to
   48  * contigmalloc(9) for the larger allocations, similar to what
   49  * bus_dmamem_alloc(9) does.
   50  *
   51  * Note the sizeof(struct vring_desc) is 16 bytes.
   52  */
   53 #define VIRTIO_MAX_INDIRECT ((int) (PAGE_SIZE / 16))
   54 
   55 /*
   56  * VirtIO instance variables indices.
   57  */
   58 #define VIRTIO_IVAR_DEVTYPE             1
   59 #define VIRTIO_IVAR_FEATURE_DESC        2
   60 #define VIRTIO_IVAR_VENDOR              3
   61 #define VIRTIO_IVAR_DEVICE              4
   62 #define VIRTIO_IVAR_SUBVENDOR           5
   63 #define VIRTIO_IVAR_SUBDEVICE           6
   64 #define VIRTIO_IVAR_MODERN              7
   65 
   66 struct virtio_feature_desc {
   67         uint64_t         vfd_val;
   68         const char      *vfd_str;
   69 };
   70 
   71 #define VIRTIO_DRIVER_MODULE(name, driver, evh, arg)                    \
   72         DRIVER_MODULE(name, virtio_mmio, driver, evh, arg);             \
   73         DRIVER_MODULE(name, virtio_pci, driver, evh, arg)
   74 
   75 struct virtio_pnp_match {
   76         uint32_t         device_type;
   77         const char      *description;
   78 };
   79 #define VIRTIO_SIMPLE_PNPINFO(driver, devtype, desc)                    \
   80         static const struct virtio_pnp_match driver ## _match = {       \
   81                 .device_type = devtype,                                 \
   82                 .description = desc,                                    \
   83         };                                                              \
   84         MODULE_PNP_INFO("U32:device_type;D:#", virtio_mmio, driver,     \
   85             &driver ## _match, 1);                                      \
   86         MODULE_PNP_INFO("U32:device_type;D:#", virtio_pci, driver,      \
   87             &driver ## _match, 1)
   88 #define VIRTIO_SIMPLE_PROBE(dev, driver)                                \
   89         (virtio_simple_probe(dev, &driver ## _match))
   90 
   91 const char *virtio_device_name(uint16_t devid);
   92 void     virtio_describe(device_t dev, const char *msg,
   93              uint64_t features, struct virtio_feature_desc *desc);
   94 int      virtio_describe_sbuf(struct sbuf *sb, uint64_t features,
   95              struct virtio_feature_desc *desc);
   96 uint64_t virtio_filter_transport_features(uint64_t features);
   97 int      virtio_bus_is_modern(device_t dev);
   98 void     virtio_read_device_config_array(device_t dev, bus_size_t offset,
   99              void *dst, int size, int count);
  100 
  101 /*
  102  * VirtIO Bus Methods.
  103  */
  104 void     virtio_read_ivar(device_t dev, int ivar, uintptr_t *val);
  105 void     virtio_write_ivar(device_t dev, int ivar, uintptr_t val);
  106 uint64_t virtio_negotiate_features(device_t dev, uint64_t child_features);
  107 int      virtio_finalize_features(device_t dev);
  108 int      virtio_alloc_virtqueues(device_t dev, int flags, int nvqs,
  109              struct vq_alloc_info *info);
  110 int      virtio_setup_intr(device_t dev, enum intr_type type);
  111 int      virtio_with_feature(device_t dev, uint64_t feature);
  112 void     virtio_stop(device_t dev);
  113 int      virtio_config_generation(device_t dev);
  114 int      virtio_reinit(device_t dev, uint64_t features);
  115 void     virtio_reinit_complete(device_t dev);
  116 int      virtio_child_pnpinfo(device_t busdev, device_t child, struct sbuf *sb);
  117 
  118 /*
  119  * Read/write a variable amount from the device specific (ie, network)
  120  * configuration region. This region is encoded in the same endian as
  121  * the guest.
  122  */
  123 void     virtio_read_device_config(device_t dev, bus_size_t offset,
  124              void *dst, int length);
  125 void     virtio_write_device_config(device_t dev, bus_size_t offset,
  126              const void *src, int length);
  127 
  128 /* Inlined device specific read/write functions for common lengths. */
  129 #define VIRTIO_RDWR_DEVICE_CONFIG(size, type)                           \
  130 static inline type                                                      \
  131 __CONCAT(virtio_read_dev_config_,size)(device_t dev,                    \
  132     bus_size_t offset)                                                  \
  133 {                                                                       \
  134         type val;                                                       \
  135         virtio_read_device_config(dev, offset, &val, sizeof(type));     \
  136         return (val);                                                   \
  137 }                                                                       \
  138                                                                         \
  139 static inline void                                                      \
  140 __CONCAT(virtio_write_dev_config_,size)(device_t dev,                   \
  141     bus_size_t offset, type val)                                        \
  142 {                                                                       \
  143         virtio_write_device_config(dev, offset, &val, sizeof(type));    \
  144 }
  145 
  146 VIRTIO_RDWR_DEVICE_CONFIG(1, uint8_t);
  147 VIRTIO_RDWR_DEVICE_CONFIG(2, uint16_t);
  148 VIRTIO_RDWR_DEVICE_CONFIG(4, uint32_t);
  149 
  150 #undef VIRTIO_RDWR_DEVICE_CONFIG
  151 
  152 #define VIRTIO_READ_IVAR(name, ivar)                                    \
  153 static inline int                                                       \
  154 __CONCAT(virtio_get_,name)(device_t dev)                                \
  155 {                                                                       \
  156         uintptr_t val;                                                  \
  157         virtio_read_ivar(dev, ivar, &val);                              \
  158         return ((int) val);                                             \
  159 }
  160 
  161 VIRTIO_READ_IVAR(device_type,   VIRTIO_IVAR_DEVTYPE);
  162 VIRTIO_READ_IVAR(vendor,        VIRTIO_IVAR_VENDOR);
  163 VIRTIO_READ_IVAR(device,        VIRTIO_IVAR_DEVICE);
  164 VIRTIO_READ_IVAR(subvendor,     VIRTIO_IVAR_SUBVENDOR);
  165 VIRTIO_READ_IVAR(subdevice,     VIRTIO_IVAR_SUBDEVICE);
  166 VIRTIO_READ_IVAR(modern,        VIRTIO_IVAR_MODERN);
  167 
  168 #undef VIRTIO_READ_IVAR
  169 
  170 #define VIRTIO_WRITE_IVAR(name, ivar)                                   \
  171 static inline void                                                      \
  172 __CONCAT(virtio_set_,name)(device_t dev, void *val)                     \
  173 {                                                                       \
  174         virtio_write_ivar(dev, ivar, (uintptr_t) val);                  \
  175 }
  176 
  177 VIRTIO_WRITE_IVAR(feature_desc, VIRTIO_IVAR_FEATURE_DESC);
  178 
  179 #undef VIRTIO_WRITE_IVAR
  180 
  181 static inline int
  182 virtio_simple_probe(device_t dev, const struct virtio_pnp_match *match)
  183 {
  184 
  185         if (virtio_get_device_type(dev) != match->device_type)
  186                 return (ENXIO);
  187         device_set_desc(dev, match->description);
  188         return (BUS_PROBE_DEFAULT);
  189 }
  190 
  191 #endif /* _KERNEL */
  192 
  193 #endif /* _VIRTIO_H_ */

Cache object: 02909a256e43cf5c3da6664be0761dfa


[ 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.