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
206 uintptr_t cfg_mem_ptr,
void *user_data);
Structure definition for virtio devices for use by the applications/drivers.
Definition virtio.h:176
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
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
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
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