Zephyr Project API 4.1.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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
31#define VIRTQ_DESC_F_NEXT 1
35#define VIRTQ_DESC_F_WRITE 2
36
60
80
96
116
123typedef void (*virtq_receive_callback)(void *opaque, uint32_t used_len);
124
141
194
195
203int virtq_create(struct virtq *v, size_t size);
204
210void virtq_free(struct virtq *v);
211
215struct virtq_buf {
219 void *addr;
224};
225
245 struct virtq *v, struct virtq_buf *bufs, uint16_t bufs_size,
246 uint16_t device_readable_count, virtq_receive_callback cb, void *cb_opaque,
247 k_timeout_t timeout
248);
249
256void virtq_add_free_desc(struct virtq *v, uint16_t desc_idx);
257
267int virtq_get_free_desc(struct virtq *v, uint16_t *desc_idx, k_timeout_t timeout);
268
273#ifdef __cplusplus
274}
275#endif
276
277#endif /* ZEPHYR_VIRTIO_VIRTQUEUE_H_ */
void(* virtq_receive_callback)(void *opaque, uint32_t used_len)
receive callback function type
Definition virtqueue.h:123
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 sys_clock.h:65
virtqueue available ring
Definition virtqueue.h:66
uint16_t ring[]
ring with indexes of descriptors
Definition virtqueue.h:78
uint16_t idx
head of the ring, by increasing it newly added descriptors are committed
Definition virtqueue.h:74
uint16_t flags
ring flags, e.g.
Definition virtqueue.h:70
single buffer passed to virtq_add_buffer_chain
Definition virtqueue.h:215
uint32_t len
length of the buffer
Definition virtqueue.h:223
void * addr
virtual address of the buffer
Definition virtqueue.h:219
virtqueue descriptor
Definition virtqueue.h:42
uint64_t addr
physical address of the buffer
Definition virtqueue.h:46
uint32_t len
length of the buffer
Definition virtqueue.h:50
uint16_t next
chaining next descriptor, valid if flags & VIRTQ_DESC_F_NEXT
Definition virtqueue.h:58
uint16_t flags
buffer flags
Definition virtqueue.h:54
callback descriptor
Definition virtqueue.h:131
void * opaque
argument passed to the callback function
Definition virtqueue.h:139
virtq_receive_callback cb
callback function pointer
Definition virtqueue.h:135
used descriptor chain
Definition virtqueue.h:86
uint32_t id
index of the head of descriptor chain
Definition virtqueue.h:90
uint32_t len
total amount of bytes written to descriptor chain by the virtio device
Definition virtqueue.h:94
virtqueue used ring
Definition virtqueue.h:102
struct virtq_used_elem ring[]
ring of struct virtq_used_elem
Definition virtqueue.h:114
uint16_t flags
ring flags, e.g.
Definition virtqueue.h:106
uint16_t idx
head of the ring
Definition virtqueue.h:110
virtqueue
Definition virtqueue.h:147
struct virtq_receive_callback_entry * recv_cbs
array with callbacks invoked after receiving buffers back from the device
Definition virtqueue.h:192
struct k_stack free_desc_stack
Stack containing indexes of free descriptors.
Definition virtqueue.h:182
uint16_t free_desc_n
amount of free descriptors in the free_desc_stack
Definition virtqueue.h:187
struct virtq_used * used
used ring
Definition virtqueue.h:168
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:174
struct virtq_avail * avail
available ring
Definition virtqueue.h:164
struct virtq_desc * desc
array with descriptors
Definition virtqueue.h:160
struct k_spinlock lock
lock used to synchronize operations on virtqueue
Definition virtqueue.h:151
uint16_t num
size of virtqueue
Definition virtqueue.h:156