1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef LINUX_VIRTIO_H
3#define LINUX_VIRTIO_H
4#include <linux/scatterlist.h>
5#include <linux/kernel.h>
6#include <linux/spinlock.h>
7
8struct device {
9	void *parent;
10};
11
12struct virtio_device {
13	struct device dev;
14	u64 features;
15	struct list_head vqs;
16	spinlock_t vqs_list_lock;
17	const struct virtio_config_ops *config;
18};
19
20struct virtqueue {
21	struct list_head list;
22	void (*callback)(struct virtqueue *vq);
23	const char *name;
24	struct virtio_device *vdev;
25        unsigned int index;
26        unsigned int num_free;
27	unsigned int num_max;
28	void *priv;
29	bool reset;
30};
31
32/* Interfaces exported by virtio_ring. */
33int virtqueue_add_sgs(struct virtqueue *vq,
34		      struct scatterlist *sgs[],
35		      unsigned int out_sgs,
36		      unsigned int in_sgs,
37		      void *data,
38		      gfp_t gfp);
39
40int virtqueue_add_outbuf(struct virtqueue *vq,
41			 struct scatterlist sg[], unsigned int num,
42			 void *data,
43			 gfp_t gfp);
44
45int virtqueue_add_inbuf(struct virtqueue *vq,
46			struct scatterlist sg[], unsigned int num,
47			void *data,
48			gfp_t gfp);
49
50bool virtqueue_kick(struct virtqueue *vq);
51
52void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len);
53
54void virtqueue_disable_cb(struct virtqueue *vq);
55
56bool virtqueue_enable_cb(struct virtqueue *vq);
57bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
58
59void *virtqueue_detach_unused_buf(struct virtqueue *vq);
60struct virtqueue *vring_new_virtqueue(unsigned int index,
61				      unsigned int num,
62				      unsigned int vring_align,
63				      struct virtio_device *vdev,
64				      bool weak_barriers,
65				      bool ctx,
66				      void *pages,
67				      bool (*notify)(struct virtqueue *vq),
68				      void (*callback)(struct virtqueue *vq),
69				      const char *name);
70void vring_del_virtqueue(struct virtqueue *vq);
71
72#endif
73