xref: /kvmtool/include/kvm/virtio-mmio.h (revision 5fe5eb04de80b8bc68f4d57443596d0b935907ef)
1 #ifndef KVM__VIRTIO_MMIO_H
2 #define KVM__VIRTIO_MMIO_H
3 
4 #include <linux/types.h>
5 #include <linux/virtio_mmio.h>
6 
7 #include <kvm/kvm-cpu.h>
8 
9 #define VIRTIO_MMIO_MAX_VQ	32
10 #define VIRTIO_MMIO_MAX_CONFIG	1
11 #define VIRTIO_MMIO_IO_SIZE	0x200
12 
13 struct kvm;
14 
15 struct virtio_mmio_ioevent_param {
16 	struct virtio_device	*vdev;
17 	u32			vq;
18 };
19 
20 struct virtio_mmio_hdr {
21 	char	magic[4];
22 	u32	version;
23 	u32	device_id;
24 	u32	vendor_id;
25 	u32	host_features;
26 	u32	host_features_sel;
27 	u32	reserved_1[2];
28 	u32	guest_features;
29 	u32	guest_features_sel;
30 	u32	guest_page_size;	/* legacy */
31 	u32	reserved_2;
32 	u32	queue_sel;
33 	u32	queue_num_max;
34 	u32	queue_num;
35 	u32	queue_align;		/* legacy */
36 	u32	queue_pfn;		/* legacy */
37 	u32	queue_ready;		/* modern */
38 	u32	reserved_3[2];
39 	u32	queue_notify;
40 	u32	reserved_4[3];
41 	u32	interrupt_state;
42 	u32	interrupt_ack;
43 	u32	reserved_5[2];
44 	u32	status;
45 	u32	reserved_7[3];
46 	u32	queue_desc_low;		/* modern */
47 	u32	queue_desc_high;
48 	u32	reserved_8[2];
49 	u32	queue_avail_low;
50 	u32	queue_avail_high;
51 	u32	reserved_9[2];
52 	u32	queue_used_low;
53 	u32	queue_used_high;
54 } __attribute__((packed));
55 
56 struct virtio_mmio {
57 	u32			addr;
58 	void			*dev;
59 	struct kvm		*kvm;
60 	u8			irq;
61 	struct virtio_mmio_hdr	hdr;
62 	struct device_header	dev_hdr;
63 	struct virtio_mmio_ioevent_param ioeventfds[VIRTIO_MMIO_MAX_VQ];
64 };
65 
66 int virtio_mmio_signal_vq(struct kvm *kvm, struct virtio_device *vdev, u32 vq);
67 int virtio_mmio_signal_config(struct kvm *kvm, struct virtio_device *vdev);
68 int virtio_mmio_exit(struct kvm *kvm, struct virtio_device *vdev);
69 int virtio_mmio_reset(struct kvm *kvm, struct virtio_device *vdev);
70 int virtio_mmio_init(struct kvm *kvm, void *dev, struct virtio_device *vdev,
71 		      int device_id, int subsys_id, int class);
72 int virtio_mmio_init_ioeventfd(struct kvm *kvm, struct virtio_device *vdev,
73 			       u32 vq);
74 
75 void virtio_mmio_legacy_callback(struct kvm_cpu *vcpu, u64 addr, u8 *data,
76 				 u32 len, u8 is_write, void *ptr);
77 void virtio_mmio_modern_callback(struct kvm_cpu *vcpu, u64 addr, u8 *data,
78 				 u32 len, u8 is_write, void *ptr);
79 int virtio_mmio_init_vq(struct kvm *kvm, struct virtio_device *vdev, int vq);
80 void virtio_mmio_exit_vq(struct kvm *kvm, struct virtio_device *vdev, int vq);
81 #endif
82