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