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