linux/include/linux/virtio.h
<<
>>
Prefs
   1#ifndef _LINUX_VIRTIO_H
   2#define _LINUX_VIRTIO_H
   3/* Everything a virtio driver needs to work with any particular virtio
   4 * implementation. */
   5#include <linux/types.h>
   6#include <linux/scatterlist.h>
   7#include <linux/spinlock.h>
   8#include <linux/device.h>
   9#include <linux/mod_devicetable.h>
  10#include <linux/gfp.h>
  11
  12/**
  13 * virtqueue - a queue to register buffers for sending or receiving.
  14 * @list: the chain of virtqueues for this device
  15 * @callback: the function to call when buffers are consumed (can be NULL).
  16 * @name: the name of this virtqueue (mainly for debugging)
  17 * @vdev: the virtio device this queue was created for.
  18 * @priv: a pointer for the virtqueue implementation to use.
  19 */
  20struct virtqueue {
  21        struct list_head list;
  22        void (*callback)(struct virtqueue *vq);
  23        const char *name;
  24        struct virtio_device *vdev;
  25        void *priv;
  26};
  27
  28int virtqueue_add_buf(struct virtqueue *vq,
  29                      struct scatterlist sg[],
  30                      unsigned int out_num,
  31                      unsigned int in_num,
  32                      void *data,
  33                      gfp_t gfp);
  34
  35void virtqueue_kick(struct virtqueue *vq);
  36
  37bool virtqueue_kick_prepare(struct virtqueue *vq);
  38
  39void virtqueue_notify(struct virtqueue *vq);
  40
  41void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len);
  42
  43void virtqueue_disable_cb(struct virtqueue *vq);
  44
  45bool virtqueue_enable_cb(struct virtqueue *vq);
  46
  47bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
  48
  49void *virtqueue_detach_unused_buf(struct virtqueue *vq);
  50
  51unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
  52
  53/**
  54 * virtio_device - representation of a device using virtio
  55 * @index: unique position on the virtio bus
  56 * @dev: underlying device.
  57 * @id: the device type identification (used to match it with a driver).
  58 * @config: the configuration ops for this device.
  59 * @vqs: the list of virtqueues for this device.
  60 * @features: the features supported by both driver and device.
  61 * @priv: private pointer for the driver's use.
  62 */
  63struct virtio_device {
  64        int index;
  65        struct device dev;
  66        struct virtio_device_id id;
  67        struct virtio_config_ops *config;
  68        struct list_head vqs;
  69        /* Note that this is a Linux set_bit-style bitmap. */
  70        unsigned long features[1];
  71        void *priv;
  72};
  73
  74#define dev_to_virtio(dev) container_of(dev, struct virtio_device, dev)
  75int register_virtio_device(struct virtio_device *dev);
  76void unregister_virtio_device(struct virtio_device *dev);
  77
  78/**
  79 * virtio_driver - operations for a virtio I/O driver
  80 * @driver: underlying device driver (populate name and owner).
  81 * @id_table: the ids serviced by this driver.
  82 * @feature_table: an array of feature numbers supported by this driver.
  83 * @feature_table_size: number of entries in the feature table array.
  84 * @probe: the function to call when a device is found.  Returns 0 or -errno.
  85 * @remove: the function to call when a device is removed.
  86 * @config_changed: optional function to call when the device configuration
  87 *    changes; may be called in interrupt context.
  88 */
  89struct virtio_driver {
  90        struct device_driver driver;
  91        const struct virtio_device_id *id_table;
  92        const unsigned int *feature_table;
  93        unsigned int feature_table_size;
  94        int (*probe)(struct virtio_device *dev);
  95        void (*remove)(struct virtio_device *dev);
  96        void (*config_changed)(struct virtio_device *dev);
  97#ifdef CONFIG_PM
  98        int (*freeze)(struct virtio_device *dev);
  99        int (*restore)(struct virtio_device *dev);
 100#endif
 101};
 102
 103int register_virtio_driver(struct virtio_driver *drv);
 104void unregister_virtio_driver(struct virtio_driver *drv);
 105#endif /* _LINUX_VIRTIO_H */
 106