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
20struct vring_desc {
21
22	__virtio64 addr;
23
24	__virtio32 len;
25
26	__virtio16 flags;
27
28	__virtio16 next;
29};
30struct vring_avail {
31	__virtio16 flags;
32	__virtio16 idx;
33	__virtio16 ring[];
34};
35struct vring_used_elem {
36
37	__virtio32 id;
38
39	__virtio32 len;
40};
41struct vring_used {
42	__virtio16 flags;
43	__virtio16 idx;
44	struct vring_used_elem ring[];
45};
46struct 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])
57static 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}
66static 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}
72static 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