66 lines
2 KiB
C
66 lines
2 KiB
C
#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 <drjones@redhat.com>
|
|
*
|
|
* 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_ */
|