#ifndef _VIRTIO_MMIO_H_ #define _VIRTIO_MMIO_H_ /* * A minimal implementation of virtio-mmio. Adapted from the Linux Kernel. * * Copyright (C) 2017, Red Hat Inc, Andrew Jones * * This work is licensed under the terms of the GNU GPL, version 2. */ #include "libcflat.h" #include "asm/page.h" #include "virtio.h" #define VIRTIO_MMIO_MAGIC_VALUE 0x000 #define VIRTIO_MMIO_VERSION 0x004 #define VIRTIO_MMIO_DEVICE_ID 0x008 #define VIRTIO_MMIO_VENDOR_ID 0x00c #define VIRTIO_MMIO_HOST_FEATURES 0x010 #define VIRTIO_MMIO_HOST_FEATURES_SEL 0x014 #define VIRTIO_MMIO_GUEST_FEATURES 0x020 #define VIRTIO_MMIO_GUEST_FEATURES_SEL 0x024 #define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028 #define VIRTIO_MMIO_QUEUE_SEL 0x030 #define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034 #define VIRTIO_MMIO_QUEUE_NUM 0x038 #define VIRTIO_MMIO_QUEUE_ALIGN 0x03c #define VIRTIO_MMIO_QUEUE_PFN 0x040 #define VIRTIO_MMIO_QUEUE_NOTIFY 0x050 #define VIRTIO_MMIO_INTERRUPT_STATUS 0x060 #define VIRTIO_MMIO_INTERRUPT_ACK 0x064 #define VIRTIO_MMIO_STATUS 0x070 #define VIRTIO_MMIO_CONFIG 0x100 #define VIRTIO_MMIO_INT_VRING (1 << 0) #define VIRTIO_MMIO_INT_CONFIG (1 << 1) #define VIRTIO_MMIO_VRING_ALIGN PAGE_SIZE /* * The minimum queue size is 2*VIRTIO_MMIO_VRING_ALIGN, which * means the largest queue num for the minimum queue size is 128, i.e. * 2*VIRTIO_MMIO_VRING_ALIGN = vring_size(128, VIRTIO_MMIO_VRING_ALIGN), * where vring_size is * * unsigned vring_size(unsigned num, unsigned long align) * { * return ((sizeof(struct vring_desc) * num + sizeof(u16) * (3 + num) * + align - 1) & ~(align - 1)) * + sizeof(u16) * 3 + sizeof(struct vring_used_elem) * num; * } */ #define VIRTIO_MMIO_QUEUE_SIZE_MIN (2*VIRTIO_MMIO_VRING_ALIGN) #define VIRTIO_MMIO_QUEUE_NUM_MIN 128 #define to_virtio_mmio_device(vdev_ptr) \ container_of(vdev_ptr, struct virtio_mmio_device, vdev) struct virtio_mmio_device { struct virtio_device vdev; void *base; }; extern struct virtio_device *virtio_mmio_bind(u32 devid); #endif /* _VIRTIO_MMIO_H_ */