xref: /kvm-unit-tests/lib/virtio-mmio.h (revision 43402ba5fa2dc06e12855a04f6003f1b3f838070)
1*43402ba5SAndrew Jones #ifndef _VIRTIO_MMIO_H_
2*43402ba5SAndrew Jones #define _VIRTIO_MMIO_H_
3*43402ba5SAndrew Jones /*
4*43402ba5SAndrew Jones  * A minimal implementation of virtio-mmio. Adapted from the Linux Kernel.
5*43402ba5SAndrew Jones  *
6*43402ba5SAndrew Jones  * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
7*43402ba5SAndrew Jones  *
8*43402ba5SAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
9*43402ba5SAndrew Jones  */
10*43402ba5SAndrew Jones #include "libcflat.h"
11*43402ba5SAndrew Jones #include "virtio.h"
12*43402ba5SAndrew Jones 
13*43402ba5SAndrew Jones #define VIRTIO_MMIO_MAGIC_VALUE		0x000
14*43402ba5SAndrew Jones #define VIRTIO_MMIO_VERSION		0x004
15*43402ba5SAndrew Jones #define VIRTIO_MMIO_DEVICE_ID		0x008
16*43402ba5SAndrew Jones #define VIRTIO_MMIO_VENDOR_ID		0x00c
17*43402ba5SAndrew Jones #define VIRTIO_MMIO_HOST_FEATURES	0x010
18*43402ba5SAndrew Jones #define VIRTIO_MMIO_HOST_FEATURES_SEL	0x014
19*43402ba5SAndrew Jones #define VIRTIO_MMIO_GUEST_FEATURES	0x020
20*43402ba5SAndrew Jones #define VIRTIO_MMIO_GUEST_FEATURES_SEL	0x024
21*43402ba5SAndrew Jones #define VIRTIO_MMIO_GUEST_PAGE_SIZE	0x028
22*43402ba5SAndrew Jones #define VIRTIO_MMIO_QUEUE_SEL		0x030
23*43402ba5SAndrew Jones #define VIRTIO_MMIO_QUEUE_NUM_MAX	0x034
24*43402ba5SAndrew Jones #define VIRTIO_MMIO_QUEUE_NUM		0x038
25*43402ba5SAndrew Jones #define VIRTIO_MMIO_QUEUE_ALIGN		0x03c
26*43402ba5SAndrew Jones #define VIRTIO_MMIO_QUEUE_PFN		0x040
27*43402ba5SAndrew Jones #define VIRTIO_MMIO_QUEUE_NOTIFY	0x050
28*43402ba5SAndrew Jones #define VIRTIO_MMIO_INTERRUPT_STATUS	0x060
29*43402ba5SAndrew Jones #define VIRTIO_MMIO_INTERRUPT_ACK	0x064
30*43402ba5SAndrew Jones #define VIRTIO_MMIO_STATUS		0x070
31*43402ba5SAndrew Jones #define VIRTIO_MMIO_CONFIG		0x100
32*43402ba5SAndrew Jones 
33*43402ba5SAndrew Jones #define VIRTIO_MMIO_INT_VRING		(1 << 0)
34*43402ba5SAndrew Jones #define VIRTIO_MMIO_INT_CONFIG		(1 << 1)
35*43402ba5SAndrew Jones 
36*43402ba5SAndrew Jones 
37*43402ba5SAndrew Jones #define to_virtio_mmio_device(vdev_ptr) \
38*43402ba5SAndrew Jones 	container_of(vdev_ptr, struct virtio_mmio_device, vdev)
39*43402ba5SAndrew Jones 
40*43402ba5SAndrew Jones struct virtio_mmio_device {
41*43402ba5SAndrew Jones 	struct virtio_device vdev;
42*43402ba5SAndrew Jones 	void *base;
43*43402ba5SAndrew Jones };
44*43402ba5SAndrew Jones 
45*43402ba5SAndrew Jones extern struct virtio_device *virtio_mmio_bind(u32 devid);
46*43402ba5SAndrew Jones 
47*43402ba5SAndrew Jones #endif /* _VIRTIO_MMIO_H_ */
48