8 #ifndef OPENAMP_VIRTIO_MMIO_H
9 #define OPENAMP_VIRTIO_MMIO_H
11 #include <metal/device.h>
20 #define VIRTIO_MMIO_LEGACY
25 #define VIRTIO_MMIO_MAGIC_VALUE 0x000
27 #define VIRTIO_MMIO_MAGIC_VALUE_STRING ('v' | ('i' << 8) | ('r' << 16) | ('t' << 24))
30 #define VIRTIO_MMIO_VERSION 0x004
33 #define VIRTIO_MMIO_DEVICE_ID 0x008
36 #define VIRTIO_MMIO_VENDOR_ID 0x00c
42 #define VIRTIO_MMIO_DEVICE_FEATURES 0x010
45 #define VIRTIO_MMIO_DEVICE_FEATURES_SEL 0x014
51 #define VIRTIO_MMIO_DRIVER_FEATURES 0x020
54 #define VIRTIO_MMIO_DRIVER_FEATURES_SEL 0x024
56 #ifndef VIRTIO_MMIO_NO_LEGACY
58 #define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028
62 #define VIRTIO_MMIO_QUEUE_SEL 0x030
65 #define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
68 #define VIRTIO_MMIO_QUEUE_NUM 0x038
70 #ifdef VIRTIO_MMIO_LEGACY
72 #define VIRTIO_MMIO_QUEUE_ALIGN 0x03c
74 #define VIRTIO_MMIO_QUEUE_PFN 0x040
78 #define VIRTIO_MMIO_QUEUE_READY 0x044
81 #define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
84 #define VIRTIO_MMIO_INTERRUPT_STATUS 0x060
87 #define VIRTIO_MMIO_INTERRUPT_ACK 0x064
90 #define VIRTIO_MMIO_STATUS 0x070
93 #define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080
94 #define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084
97 #define VIRTIO_MMIO_QUEUE_AVAIL_LOW 0x090
98 #define VIRTIO_MMIO_QUEUE_AVAIL_HIGH 0x094
101 #define VIRTIO_MMIO_QUEUE_USED_LOW 0x0a0
102 #define VIRTIO_MMIO_QUEUE_USED_HIGH 0x0a4
105 #define VIRTIO_MMIO_SHM_SEL 0x0ac
108 #define VIRTIO_MMIO_SHM_LEN_LOW 0x0b0
109 #define VIRTIO_MMIO_SHM_LEN_HIGH 0x0b4
112 #define VIRTIO_MMIO_SHM_BASE_LOW 0x0b8
113 #define VIRTIO_MMIO_SHM_BASE_HIGH 0x0bc
116 #define VIRTIO_MMIO_CONFIG_GENERATION 0x0fc
122 #define VIRTIO_MMIO_CONFIG 0x100
125 #define VIRTIO_MMIO_INT_VRING (1 << 0)
126 #define VIRTIO_MMIO_INT_CONFIG (1 << 1)
129 #define VIRTIO_MMIO_MAX_DATA_SIZE 128
146 struct metal_io_region
cfg_io;
149 struct metal_io_region
shm_io;
206 uintptr_t cfg_mem_ptr,
void *user_data);
Structure definition for virtio devices for use by the applications/drivers.
Definition: virtio.h:188
VIRTIO MMIO memory area.
Definition: virtio_mmio.h:132
void * base
Memory region physical address.
Definition: virtio_mmio.h:134
size_t size
Memory region size.
Definition: virtio_mmio.h:137
A VIRTIO MMIO device.
Definition: virtio_mmio.h:141
unsigned int irq
Interrupt number.
Definition: virtio_mmio.h:161
struct virtio_mmio_dev_mem shm_mem
VIRTIO device pre-shared memory.
Definition: virtio_mmio.h:155
struct virtio_mmio_dev_mem cfg_mem
VIRTIO device configuration space.
Definition: virtio_mmio.h:152
unsigned int device_mode
VIRTIO_DEV_DRIVER or VIRTIO_DEV_DEVICE.
Definition: virtio_mmio.h:158
struct virtio_device vdev
Base virtio device structure.
Definition: virtio_mmio.h:143
struct metal_io_region shm_io
Pre-shared memory space metal_io_region.
Definition: virtio_mmio.h:149
struct metal_io_region cfg_io
Device configuration space metal_io_region.
Definition: virtio_mmio.h:146
void * user_data
Custom user data.
Definition: virtio_mmio.h:164
Local virtio queue to manage a virtio ring for sending or receiving.
Definition: virtqueue.h:78
const char * vq_name
Name of the virtio queue.
Definition: virtqueue.h:83
void virtio_mmio_register_device(struct virtio_device *vdev, int vq_num, struct virtqueue **vqs)
Register a VIRTIO device with the VIRTIO stack.
Definition: virtio_mmio_drv.c:216
struct virtqueue * virtio_mmio_setup_virtqueue(struct virtio_device *vdev, unsigned int idx, struct virtqueue *vq, void(*cb)(void *), void *cb_arg, const char *vq_name)
Setup a virtqueue structure.
Definition: virtio_mmio_drv.c:228
int virtio_mmio_device_init(struct virtio_mmio_device *vmdev, uintptr_t virt_mem_ptr, uintptr_t cfg_mem_ptr, void *user_data)
VIRTIO MMIO device initialization.
Definition: virtio_mmio_drv.c:170
void virtio_mmio_isr(struct virtio_device *vdev)
VIRTIO MMIO interrupt service routine.
Definition: virtio_mmio_drv.c:310