b4da2bf23930ed143c7a215aa72efe2512161808
[akaros.git] / user / vmm / include / virtio.h
1 #ifndef VIRTIO_VIRTIO_H
2 #define VIRTIO_VIRTIO_H
3
4 #include <stddef.h>
5 #include "virtio_ring.h"
6 /* this is just an iov but we're going to keep the type for now, in case
7  * we want it at some point.
8  */
9 struct scatterlist {
10         void *v;
11         int length;
12 };
13
14 #ifndef __AKAROS_KERNEL__
15 #define cpu_relax()
16 #define unlikely(x) (x)
17 #define virtio_rmb(x)
18 #define virtio_wmb(x)
19 #define virtio_mb(x)
20 #endif
21 #define sg_phys(x) ((uintptr_t)x)
22 #define virt_to_phys(x) ((uintptr_t)x)
23
24 struct virtqueue *vring_new_virtqueue(unsigned int index,
25                                       unsigned int num,
26                                       unsigned int vring_align,
27                                       bool weak_barriers,
28                                       void *pages,
29                                       bool (*notify)(struct virtqueue *),
30                                       void (*callback)(struct virtqueue *),
31                                       const char *name);
32
33 int virtqueue_add_outbuf_avail(struct virtqueue *vq,
34                          struct scatterlist sg[], unsigned int num,
35                          void *data,
36                                int opts); // Opts only used in kernel functions.
37 unsigned int virtqueue_get_vring_size(struct virtqueue *_vq);
38 void *virtqueue_get_buf_used(struct virtqueue *_vq, unsigned int *len);
39 int virtqueue_add_inbuf_avail(struct virtqueue *vq,
40                         struct scatterlist sg[], unsigned int num,
41                               void *data, int opts);
42
43 /* linux-isms we may or may not ever care about. */
44 #define __user
45 #define __force
46 #define __cold
47 #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
48
49 int avail(struct virtqueue *_vq);
50 void showvq(struct virtqueue *_vq);
51 void showdesc(struct virtqueue *_vq, uint16_t head);
52 int virtio_get_buf_avail_start(struct virtqueue *_vq, uint16_t *last_avail_idx, struct scatterlist **sgp, int *sgplen);
53 void virtio_get_buf_avail_done(struct virtqueue *_vq, uint16_t last_avail_idx, int id, int len);
54 void showscatterlist(struct scatterlist *sg, int num);
55
56 unsigned int wait_for_vq_desc(struct virtqueue *vq,
57                                  struct scatterlist iov[],
58                                  unsigned int *out_num, unsigned int *in_num);
59 void add_used(struct virtqueue *vq, unsigned int head, int len);
60
61 #include "virtio_ring.h"
62 /**
63  * virtqueue - a queue to register buffers for sending or receiving.
64  * @list: the chain of virtqueues for this device
65  * @callback: the function to call when buffers are consumed (can be NULL).
66  * @name: the name of this virtqueue (mainly for debugging)
67  * @vdev: the virtio device this queue was created for.
68  * @priv: a pointer for the virtqueue implementation to use.
69  * @index: the zero-based ordinal number for this queue.
70  * @num_free: number of elements we expect to be able to fit.
71  *
72  * A note on @num_free: with indirect buffers, each buffer needs one
73  * element in the queue, otherwise a buffer will need one element per
74  * sg element.
75  */
76 struct virtqueue {
77         void (*callback)(struct virtqueue *vq);
78         const char *name;
79         unsigned int index;
80         unsigned int num_free;
81         void *priv;
82 };
83
84 int virtqueue_add_outbuf(struct virtqueue *vq,
85                          struct scatterlist sg[], unsigned int num,
86                          void *data,
87                          int flags);
88
89 int virtqueue_add_inbuf(struct virtqueue *vq,
90                         struct scatterlist sg[], unsigned int num,
91                         void *data,
92                         int flags);
93
94 int virtqueue_add_sgs(struct virtqueue *vq,
95                       struct scatterlist *sgs[],
96                       unsigned int out_sgs,
97                       unsigned int in_sgs,
98                       void *data,
99                       int flags);
100
101 bool virtqueue_kick(struct virtqueue *vq);
102
103 bool virtqueue_kick_prepare(struct virtqueue *vq);
104
105 bool virtqueue_notify(struct virtqueue *vq);
106
107 void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len);
108
109 void virtqueue_disable_cb(struct virtqueue *vq);
110
111 bool virtqueue_enable_cb(struct virtqueue *vq);
112
113 unsigned virtqueue_enable_cb_prepare(struct virtqueue *vq);
114
115 bool virtqueue_poll(struct virtqueue *vq, unsigned);
116
117 bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
118
119 void *virtqueue_detach_unused_buf(struct virtqueue *vq);
120
121 unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
122
123 bool virtqueue_is_broken(struct virtqueue *vq);
124 void virtqueue_close(struct virtqueue *vq);
125
126 #endif /* VIRTIO_VIRTIO_H */