blob: a3e07016a44017c8c9f25c5dd51e77a09152e127 [file] [log] [blame]
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +02001#ifndef LINUX_VIRTIO_H
2#define LINUX_VIRTIO_H
Rusty Russell61d0b5a42013-03-18 13:22:19 +10303#include <linux/scatterlist.h>
4#include <linux/kernel.h>
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +02005
6/* TODO: empty stubs for now. Broken but enough for virtio_ring.c */
7#define list_add_tail(a, b) do {} while (0)
8#define list_del(a) do {} while (0)
Michael S. Tsirkin2d7ce0e2014-12-15 23:47:07 +02009#define list_for_each_entry(a, b, c) while (0)
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020010/* end of stubs */
11
12struct virtio_device {
13 void *dev;
Michael S. Tsirkind0254772014-10-07 16:39:43 +020014 u64 features;
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020015};
16
17struct virtqueue {
18 /* TODO: commented as list macros are empty stubs for now.
19 * Broken but enough for virtio_ring.c
20 * struct list_head list; */
21 void (*callback)(struct virtqueue *vq);
22 const char *name;
23 struct virtio_device *vdev;
Michael S. Tsirkin73640c92013-03-18 13:22:18 +103024 unsigned int index;
25 unsigned int num_free;
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020026 void *priv;
27};
28
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020029/* Interfaces exported by virtio_ring. */
Rusty Russell13816c72013-03-20 15:37:09 +103030int virtqueue_add_sgs(struct virtqueue *vq,
31 struct scatterlist *sgs[],
32 unsigned int out_sgs,
33 unsigned int in_sgs,
34 void *data,
35 gfp_t gfp);
36
Rusty Russelle538eba2013-03-20 15:44:26 +103037int virtqueue_add_outbuf(struct virtqueue *vq,
38 struct scatterlist sg[], unsigned int num,
39 void *data,
40 gfp_t gfp);
41
42int virtqueue_add_inbuf(struct virtqueue *vq,
43 struct scatterlist sg[], unsigned int num,
44 void *data,
45 gfp_t gfp);
46
Joel Stanleyd1b8c4c2014-02-13 15:03:44 +103047bool virtqueue_kick(struct virtqueue *vq);
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020048
49void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len);
50
51void virtqueue_disable_cb(struct virtqueue *vq);
52
53bool virtqueue_enable_cb(struct virtqueue *vq);
Michael S. Tsirkin64d09882012-04-16 10:11:12 -040054bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020055
56void *virtqueue_detach_unused_buf(struct virtqueue *vq);
Michael S. Tsirkin73640c92013-03-18 13:22:18 +103057struct virtqueue *vring_new_virtqueue(unsigned int index,
58 unsigned int num,
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020059 unsigned int vring_align,
60 struct virtio_device *vdev,
Rusty Russell7b21e342012-01-12 15:44:42 +103061 bool weak_barriers,
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020062 void *pages,
Joel Stanleyd1b8c4c2014-02-13 15:03:44 +103063 bool (*notify)(struct virtqueue *vq),
Michael S. Tsirkin4e53f782010-11-29 19:16:37 +020064 void (*callback)(struct virtqueue *vq),
65 const char *name);
66void vring_del_virtqueue(struct virtqueue *vq);
67
68#endif