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