1 /*
2 * This header was generated from the Linux kernel headers by update_headers.py,
3 * to provide necessary information from kernel to userspace, such as constants,
4 * structures, and macros, and thus, contains no copyrightable information.
5 */
6 #ifndef _UAPI_LINUX_VIRTIO_RING_H
7 #define _UAPI_LINUX_VIRTIO_RING_H
8 #ifndef __KERNEL__
9 #include <stdint.h>
10 #endif
11 #include <linux/types.h>
12 #include <linux/virtio_types.h>
13 #define VRING_DESC_F_NEXT 1
14 #define VRING_DESC_F_WRITE 2
15 #define VRING_DESC_F_INDIRECT 4
16 #define VRING_USED_F_NO_NOTIFY 1
17 #define VRING_AVAIL_F_NO_INTERRUPT 1
18 #define VIRTIO_RING_F_INDIRECT_DESC 28
19 #define VIRTIO_RING_F_EVENT_IDX 29
20 struct vring_desc {
21
22 __virtio64 addr;
23
24 __virtio32 len;
25
26 __virtio16 flags;
27
28 __virtio16 next;
29 };
30 struct vring_avail {
31 __virtio16 flags;
32 __virtio16 idx;
33 __virtio16 ring[];
34 };
35 struct vring_used_elem {
36
37 __virtio32 id;
38
39 __virtio32 len;
40 };
41 struct vring_used {
42 __virtio16 flags;
43 __virtio16 idx;
44 struct vring_used_elem ring[];
45 };
46 struct vring {
47 unsigned int num;
48 struct vring_desc *desc;
49 struct vring_avail *avail;
50 struct vring_used *used;
51 };
52 #define VRING_AVAIL_ALIGN_SIZE 2
53 #define VRING_USED_ALIGN_SIZE 4
54 #define VRING_DESC_ALIGN_SIZE 16
55 #define vring_used_event(vr) ((vr)->avail->ring[(vr)->num])
56 #define vring_avail_event(vr) (*(__virtio16 *)&(vr)->used->ring[(vr)->num])
vring_init(struct vring *vr, unsigned int num, void *p, unsigned long align)57 static inline void vring_init(struct vring *vr, unsigned int num, void *p,
58 unsigned long align)
59 {
60 vr->num = num;
61 vr->desc = p;
62 vr->avail = p + num*sizeof(struct vring_desc);
63 vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] + sizeof(__virtio16)
64 + align-1) & ~(align - 1));
65 }
vring_size(unsigned int num, unsigned long align)66 static inline unsigned vring_size(unsigned int num, unsigned long align)
67 {
68 return ((sizeof(struct vring_desc) * num + sizeof(__virtio16) * (3 + num)
69 + align - 1) & ~(align - 1))
70 + sizeof(__virtio16) * 3 + sizeof(struct vring_used_elem) * num;
71 }
vring_need_event(__u16 event_idx, __u16 new_idx, __u16 old)72 static inline int vring_need_event(__u16 event_idx, __u16 new_idx, __u16 old)
73 {
74
75 return (__u16)(new_idx - event_idx - 1) < (__u16)(new_idx - old);
76 }
77 #endif
78