xref: /kvmtool/include/kvm/virtio-pci.h (revision 43c81c74c63e4245d35e56cbb7d832d5bc5a9203)
136f5dc91SSasha Levin #ifndef KVM__VIRTIO_PCI_H
236f5dc91SSasha Levin #define KVM__VIRTIO_PCI_H
336f5dc91SSasha Levin 
436f5dc91SSasha Levin #include "kvm/pci.h"
536f5dc91SSasha Levin 
636f5dc91SSasha Levin #include <linux/types.h>
736f5dc91SSasha Levin 
836f5dc91SSasha Levin #define VIRTIO_PCI_MAX_VQ	3
914bba8a0SAsias He #define VIRTIO_PCI_MAX_CONFIG	1
1036f5dc91SSasha Levin 
1136f5dc91SSasha Levin struct kvm;
1236f5dc91SSasha Levin 
131599d724SSasha Levin struct virtio_pci_ioevent_param {
1402eca50cSAsias He 	struct virtio_device	*vdev;
151599d724SSasha Levin 	u32			vq;
161599d724SSasha Levin };
171599d724SSasha Levin 
18*43c81c74SSasha Levin #define VIRTIO_PCI_F_SIGNAL_MSI (1 << 0)
19*43c81c74SSasha Levin 
2036f5dc91SSasha Levin struct virtio_pci {
2136f5dc91SSasha Levin 	struct pci_device_header pci_hdr;
2236f5dc91SSasha Levin 	void			*dev;
2336f5dc91SSasha Levin 
2436f5dc91SSasha Levin 	u16			base_addr;
2536f5dc91SSasha Levin 	u8			status;
2636f5dc91SSasha Levin 	u8			isr;
27*43c81c74SSasha Levin 	u32			features;
2836f5dc91SSasha Levin 
2936f5dc91SSasha Levin 	/* MSI-X */
3036f5dc91SSasha Levin 	u16			config_vector;
3136f5dc91SSasha Levin 	u32			config_gsi;
3236f5dc91SSasha Levin 	u32			vq_vector[VIRTIO_PCI_MAX_VQ];
3336f5dc91SSasha Levin 	u32			gsis[VIRTIO_PCI_MAX_VQ];
3436f5dc91SSasha Levin 	u32			msix_io_block;
3506f48103SSasha Levin 	u64			msix_pba;
3614bba8a0SAsias He 	struct msix_table	msix_table[VIRTIO_PCI_MAX_VQ + VIRTIO_PCI_MAX_CONFIG];
3736f5dc91SSasha Levin 
3836f5dc91SSasha Levin 	/* virtio queue */
3936f5dc91SSasha Levin 	u16			queue_selector;
401599d724SSasha Levin 	struct virtio_pci_ioevent_param ioeventfds[VIRTIO_PCI_MAX_VQ];
4136f5dc91SSasha Levin };
4236f5dc91SSasha Levin 
4302eca50cSAsias He int virtio_pci__signal_vq(struct kvm *kvm, struct virtio_device *vdev, u32 vq);
4402eca50cSAsias He int virtio_pci__signal_config(struct kvm *kvm, struct virtio_device *vdev);
4502eca50cSAsias He int virtio_pci__exit(struct kvm *kvm, struct virtio_device *vdev);
4602eca50cSAsias He int virtio_pci__init(struct kvm *kvm, void *dev, struct virtio_device *vdev,
47507e02d8SAsias He 		     int device_id, int subsys_id, int class);
4836f5dc91SSasha Levin 
4936f5dc91SSasha Levin #endif
50