Zephyr API Documentation 4.2.0-rc3
A Scalable Open Source RTOS
 4.2.0-rc3
virtqueue.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2024 Antmicro <www.antmicro.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_VIRTIO_VIRTQUEUE_H_
8#define ZEPHYR_VIRTIO_VIRTQUEUE_H_
9#include <stdint.h>
10#include <stddef.h>
11#include <zephyr/kernel.h>
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17/*
18 * Based on Virtual I/O Device (VIRTIO) Version 1.3 specification:
19 * https://docs.oasis-open.org/virtio/virtio/v1.3/csd01/virtio-v1.3-csd01.pdf
20 */
21
28
32#define VIRTQ_DESC_F_NEXT 1
36#define VIRTQ_DESC_F_WRITE 2
37
61
81
97
117
124typedef void (*virtq_receive_callback)(void *opaque, uint32_t used_len);
125
142
195
196
204int virtq_create(struct virtq *v, size_t size);
205
211void virtq_free(struct virtq *v);
212
216struct virtq_buf {
220 void *addr;
225};
226
246 struct virtq *v, struct virtq_buf *bufs, uint16_t bufs_size,
247 uint16_t device_readable_count, virtq_receive_callback cb, void *cb_opaque,
248 k_timeout_t timeout
249);
250
257void virtq_add_free_desc(struct virtq *v, uint16_t desc_idx);
258
268int virtq_get_free_desc(struct virtq *v, uint16_t *desc_idx, k_timeout_t timeout);
269
273
274#ifdef __cplusplus
275}
276#endif
277
278#endif /* ZEPHYR_VIRTIO_VIRTQUEUE_H_ */
void(* virtq_receive_callback)(void *opaque, uint32_t used_len)
receive callback function type
Definition virtqueue.h:124
int virtq_create(struct virtq *v, size_t size)
creates virtqueue
void virtq_add_free_desc(struct virtq *v, uint16_t desc_idx)
adds free descriptor back
int virtq_add_buffer_chain(struct virtq *v, struct virtq_buf *bufs, uint16_t bufs_size, uint16_t device_readable_count, virtq_receive_callback cb, void *cb_opaque, k_timeout_t timeout)
adds chain of buffers to the virtqueue
int virtq_get_free_desc(struct virtq *v, uint16_t *desc_idx, k_timeout_t timeout)
gets next free descriptor
void virtq_free(struct virtq *v)
frees virtqueue
Public kernel APIs.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Kernel Spin Lock.
Definition spinlock.h:45
Kernel timeout type.
Definition clock.h:65
virtqueue available ring
Definition virtqueue.h:67
uint16_t ring[]
ring with indexes of descriptors
Definition virtqueue.h:79
uint16_t idx
head of the ring, by increasing it newly added descriptors are committed
Definition virtqueue.h:75
uint16_t flags
ring flags, e.g.
Definition virtqueue.h:71
single buffer passed to virtq_add_buffer_chain
Definition virtqueue.h:216
uint32_t len
length of the buffer
Definition virtqueue.h:224
void * addr
virtual address of the buffer
Definition virtqueue.h:220
virtqueue descriptor
Definition virtqueue.h:43
uint64_t addr
physical address of the buffer
Definition virtqueue.h:47
uint32_t len
length of the buffer
Definition virtqueue.h:51
uint16_t next
chaining next descriptor, valid if flags & VIRTQ_DESC_F_NEXT
Definition virtqueue.h:59
uint16_t flags
buffer flags
Definition virtqueue.h:55
callback descriptor
Definition virtqueue.h:132
void * opaque
argument passed to the callback function
Definition virtqueue.h:140
virtq_receive_callback cb
callback function pointer
Definition virtqueue.h:136
used descriptor chain
Definition virtqueue.h:87
uint32_t id
index of the head of descriptor chain
Definition virtqueue.h:91
uint32_t len
total amount of bytes written to descriptor chain by the virtio device
Definition virtqueue.h:95
virtqueue used ring
Definition virtqueue.h:103
struct virtq_used_elem ring[]
ring of struct virtq_used_elem
Definition virtqueue.h:115
uint16_t flags
ring flags, e.g.
Definition virtqueue.h:107
uint16_t idx
head of the ring
Definition virtqueue.h:111
virtqueue
Definition virtqueue.h:148
struct virtq_receive_callback_entry * recv_cbs
array with callbacks invoked after receiving buffers back from the device
Definition virtqueue.h:193
struct k_stack free_desc_stack
Stack containing indexes of free descriptors.
Definition virtqueue.h:183
uint16_t free_desc_n
amount of free descriptors in the free_desc_stack
Definition virtqueue.h:188
struct virtq_used * used
used ring
Definition virtqueue.h:169
uint16_t last_used_idx
last seen idx in used ring, used to determine first descriptor to process after receiving virtqueue i...
Definition virtqueue.h:175
struct virtq_avail * avail
available ring
Definition virtqueue.h:165
struct virtq_desc * desc
array with descriptors
Definition virtqueue.h:161
struct k_spinlock lock
lock used to synchronize operations on virtqueue
Definition virtqueue.h:152
uint16_t num
size of virtqueue
Definition virtqueue.h:157