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