12 #include <metal/compiler.h>
14 #if defined __cplusplus
19 #define VRING_DESC_F_NEXT 1
21 #define VRING_DESC_F_WRITE 2
23 #define VRING_DESC_F_INDIRECT 4
29 #define VRING_USED_F_NO_NOTIFY 1
34 #define VRING_AVAIL_F_NO_INTERRUPT 1
178 #define vring_used_event(vr) ((vr)->avail->ring[(vr)->num])
179 #define vring_avail_event(vr) ((vr)->used->ring[(vr)->num].event)
181 static inline int vring_size(
unsigned int num,
unsigned long align)
186 size +=
sizeof(
struct vring_avail) + (num *
sizeof(uint16_t)) +
188 size = (size + align - 1) & ~(align - 1);
202 (((
unsigned long)&vr->
avail->
ring[num] +
sizeof(uint16_t) +
203 align - 1) & ~(align - 1));
216 return (uint16_t)(new_idx - event_idx - 1) <
217 (uint16_t)(new_idx - old);
220 #if defined __cplusplus
Used to offer buffers to the device.
Definition: virtio_ring.h:68
uint16_t idx
Indicates where the driver puts the next descriptor entry in the ring (modulo the queue size)
Definition: virtio_ring.h:76
uint16_t flags
Flag which determines whether device notifications are required.
Definition: virtio_ring.h:70
uint16_t ring[0]
The ring of descriptors.
Definition: virtio_ring.h:79
VirtIO ring descriptors.
Definition: virtio_ring.h:47
uint64_t addr
Address (guest-physical)
Definition: virtio_ring.h:49
uint16_t next
We chain unused descriptors via this, too.
Definition: virtio_ring.h:58
uint16_t flags
Flags relevant to the descriptors.
Definition: virtio_ring.h:55
uint32_t len
Length.
Definition: virtio_ring.h:52
Definition: virtio_ring.h:84
uint16_t event
Definition: virtio_ring.h:86
uint32_t id
Definition: virtio_ring.h:88
uint32_t len
Definition: virtio_ring.h:91
The device returns buffers to this structure when done with them.
Definition: virtio_ring.h:100
struct vring_used_elem ring[0]
The ring of descriptors.
Definition: virtio_ring.h:111
uint16_t idx
Indicates where the driver puts the next descriptor entry in the ring (modulo the queue size)
Definition: virtio_ring.h:108
uint16_t flags
Flag which determines whether device notifications are required.
Definition: virtio_ring.h:102
The virtqueue layout structure.
Definition: virtio_ring.h:157
struct vring_desc * desc
The actual buffer descriptors, 16 bytes each.
Definition: virtio_ring.h:165
struct vring_avail * avail
A ring of available descriptor heads with free-running index.
Definition: virtio_ring.h:168
unsigned int num
The maximum number of buffer descriptors in the virtqueue.
Definition: virtio_ring.h:162
struct vring_used * used
A ring of used descriptor heads with free-running index.
Definition: virtio_ring.h:171
METAL_PACKED_BEGIN struct vring_desc METAL_PACKED_END
static int vring_size(unsigned int num, unsigned long align)
Definition: virtio_ring.h:181
static int vring_need_event(uint16_t event_idx, uint16_t new_idx, uint16_t old)
Definition: virtio_ring.h:214
static void vring_init(struct vring *vr, unsigned int num, uint8_t *p, unsigned long align)
Definition: virtio_ring.h:196