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