xref: /kvmtool/include/kvm/virtio-pci.h (revision 1599d7242db63a7742d5a526cd9476357d7e1e92)
1 #ifndef KVM__VIRTIO_PCI_H
2 #define KVM__VIRTIO_PCI_H
3 
4 #include "kvm/pci.h"
5 
6 #include <linux/types.h>
7 
8 #define VIRTIO_PCI_MAX_VQ 3
9 
10 struct kvm;
11 
12 struct virtio_pci_ops {
13 	void (*set_config)(struct kvm *kvm, void *dev, u8 data, u32 offset);
14 	u8 (*get_config)(struct kvm *kvm, void *dev, u32 offset);
15 
16 	u32 (*get_host_features)(struct kvm *kvm, void *dev);
17 	void (*set_guest_features)(struct kvm *kvm, void *dev, u32 features);
18 
19 	int (*init_vq)(struct kvm *kvm, void *dev, u32 vq, u32 pfn);
20 	int (*notify_vq)(struct kvm *kvm, void *dev, u32 vq);
21 	int (*get_pfn_vq)(struct kvm *kvm, void *dev, u32 vq);
22 	int (*get_size_vq)(struct kvm *kvm, void *dev, u32 vq);
23 };
24 
25 struct virtio_pci_ioevent_param {
26 	struct virtio_pci	*vpci;
27 	u32			vq;
28 };
29 
30 struct virtio_pci {
31 	struct pci_device_header pci_hdr;
32 	struct virtio_pci_ops	ops;
33 	void			*dev;
34 
35 	u16			base_addr;
36 	u8			status;
37 	u8			isr;
38 
39 	/* MSI-X */
40 	u16			config_vector;
41 	u32			config_gsi;
42 	u32			vq_vector[VIRTIO_PCI_MAX_VQ];
43 	u32			gsis[VIRTIO_PCI_MAX_VQ];
44 	u32			msix_io_block;
45 	int			msix_enabled;
46 
47 	/* virtio queue */
48 	u16			queue_selector;
49 	struct virtio_pci_ioevent_param ioeventfds[VIRTIO_PCI_MAX_VQ];
50 };
51 
52 int virtio_pci__init(struct kvm *kvm, struct virtio_pci *vpci, void *dev,
53 			int device_id, int subsys_id);
54 int virtio_pci__signal_vq(struct kvm *kvm, struct virtio_pci *vpci, u32 vq);
55 int virtio_pci__signal_config(struct kvm *kvm, struct virtio_pci *vpci);
56 
57 #endif
58