xref: /kvmtool/include/kvm/virtio-pci.h (revision 14bba8a09c2eb52f2d8fe0ad9d675e394816db5d)
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
9*14bba8a0SAsias He #define VIRTIO_PCI_MAX_CONFIG	1
1036f5dc91SSasha Levin 
1136f5dc91SSasha Levin struct kvm;
1236f5dc91SSasha Levin 
1336f5dc91SSasha Levin struct virtio_pci_ops {
1436f5dc91SSasha Levin 	void (*set_config)(struct kvm *kvm, void *dev, u8 data, u32 offset);
1536f5dc91SSasha Levin 	u8 (*get_config)(struct kvm *kvm, void *dev, u32 offset);
1636f5dc91SSasha Levin 
1736f5dc91SSasha Levin 	u32 (*get_host_features)(struct kvm *kvm, void *dev);
1836f5dc91SSasha Levin 	void (*set_guest_features)(struct kvm *kvm, void *dev, u32 features);
1936f5dc91SSasha Levin 
2036f5dc91SSasha Levin 	int (*init_vq)(struct kvm *kvm, void *dev, u32 vq, u32 pfn);
2136f5dc91SSasha Levin 	int (*notify_vq)(struct kvm *kvm, void *dev, u32 vq);
2236f5dc91SSasha Levin 	int (*get_pfn_vq)(struct kvm *kvm, void *dev, u32 vq);
2336f5dc91SSasha Levin 	int (*get_size_vq)(struct kvm *kvm, void *dev, u32 vq);
2436f5dc91SSasha Levin };
2536f5dc91SSasha Levin 
261599d724SSasha Levin struct virtio_pci_ioevent_param {
271599d724SSasha Levin 	struct virtio_pci	*vpci;
281599d724SSasha Levin 	u32			vq;
291599d724SSasha Levin };
301599d724SSasha Levin 
3136f5dc91SSasha Levin struct virtio_pci {
3236f5dc91SSasha Levin 	struct pci_device_header pci_hdr;
3336f5dc91SSasha Levin 	struct virtio_pci_ops	ops;
3436f5dc91SSasha Levin 	void			*dev;
3536f5dc91SSasha Levin 
3636f5dc91SSasha Levin 	u16			base_addr;
3736f5dc91SSasha Levin 	u8			status;
3836f5dc91SSasha Levin 	u8			isr;
3936f5dc91SSasha Levin 
4036f5dc91SSasha Levin 	/* MSI-X */
4136f5dc91SSasha Levin 	u16			config_vector;
4236f5dc91SSasha Levin 	u32			config_gsi;
4336f5dc91SSasha Levin 	u32			vq_vector[VIRTIO_PCI_MAX_VQ];
4436f5dc91SSasha Levin 	u32			gsis[VIRTIO_PCI_MAX_VQ];
4536f5dc91SSasha Levin 	u32			msix_io_block;
4606f48103SSasha Levin 	u32			msix_pba_block;
4706f48103SSasha Levin 	u64			msix_pba;
48*14bba8a0SAsias He 	struct msix_table	msix_table[VIRTIO_PCI_MAX_VQ + VIRTIO_PCI_MAX_CONFIG];
4936f5dc91SSasha Levin 
5036f5dc91SSasha Levin 	/* virtio queue */
5136f5dc91SSasha Levin 	u16			queue_selector;
521599d724SSasha Levin 	struct virtio_pci_ioevent_param ioeventfds[VIRTIO_PCI_MAX_VQ];
5336f5dc91SSasha Levin };
5436f5dc91SSasha Levin 
5536f5dc91SSasha Levin int virtio_pci__init(struct kvm *kvm, struct virtio_pci *vpci, void *dev,
56507e02d8SAsias He 			int device_id, int subsys_id, int class);
5736f5dc91SSasha Levin int virtio_pci__signal_vq(struct kvm *kvm, struct virtio_pci *vpci, u32 vq);
5836f5dc91SSasha Levin int virtio_pci__signal_config(struct kvm *kvm, struct virtio_pci *vpci);
5936f5dc91SSasha Levin 
6036f5dc91SSasha Levin #endif
61