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