From: Joerg Roedel <[email protected]> Inject MSI and MSI-X IRQs into the correct device plane.
Signed-off-by: Joerg Roedel <[email protected]> --- accel/kvm/kvm-all.c | 2 +- hw/i386/kvm/apic.c | 6 +++++- hw/pci/msi.c | 3 +++ hw/pci/msix.c | 3 +++ include/hw/pci/msi.h | 1 + 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index c5fe6d189e62..31d80f7ac48b 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -2407,7 +2407,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) msi.flags = 0; memset(msi.pad, 0, sizeof(msi.pad)); - return kvm_vm_ioctl(s, KVM_SIGNAL_MSI, &msi); + return kvm_vm_plane_ioctl(s, msg.plane_id, KVM_SIGNAL_MSI, &msi); } int kvm_irqchip_add_msi_route(KVMRouteChange *c, int vector, PCIDevice *dev) diff --git a/hw/i386/kvm/apic.c b/hw/i386/kvm/apic.c index 82355f04631a..4dd946d6f26b 100644 --- a/hw/i386/kvm/apic.c +++ b/hw/i386/kvm/apic.c @@ -210,7 +210,11 @@ static uint64_t kvm_apic_mem_read(void *opaque, hwaddr addr, static void kvm_apic_mem_write(void *opaque, hwaddr addr, uint64_t data, unsigned size) { - MSIMessage msg = { .address = addr, .data = data }; + MSIMessage msg = { + .address = addr, + .data = data, + .plane_id = qdev_default_plane(), + }; kvm_send_msi(&msg); } diff --git a/hw/pci/msi.c b/hw/pci/msi.c index b9f5b45920b6..d0373131dd06 100644 --- a/hw/pci/msi.c +++ b/hw/pci/msi.c @@ -142,6 +142,7 @@ static MSIMessage msi_prepare_message(PCIDevice *dev, unsigned int vector) uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev)); bool msi64bit = flags & PCI_MSI_FLAGS_64BIT; unsigned int nr_vectors = msi_nr_vectors(flags); + DeviceState *dev_state= DEVICE(dev); MSIMessage msg; assert(vector < nr_vectors); @@ -159,6 +160,8 @@ static MSIMessage msi_prepare_message(PCIDevice *dev, unsigned int vector) msg.data |= vector; } + msg.plane_id = dev_state->plane; + return msg; } diff --git a/hw/pci/msix.c b/hw/pci/msix.c index 1b23eaf10079..1773f8eccae8 100644 --- a/hw/pci/msix.c +++ b/hw/pci/msix.c @@ -37,10 +37,13 @@ static MSIMessage msix_prepare_message(PCIDevice *dev, unsigned vector) { uint8_t *table_entry = dev->msix_table + vector * PCI_MSIX_ENTRY_SIZE; + DeviceState *dev_state= DEVICE(dev); MSIMessage msg; msg.address = pci_get_quad(table_entry + PCI_MSIX_ENTRY_LOWER_ADDR); msg.data = pci_get_long(table_entry + PCI_MSIX_ENTRY_DATA); + msg.plane_id = dev_state->plane; + return msg; } diff --git a/include/hw/pci/msi.h b/include/hw/pci/msi.h index abcfd1392521..6bedf97b6f03 100644 --- a/include/hw/pci/msi.h +++ b/include/hw/pci/msi.h @@ -26,6 +26,7 @@ struct MSIMessage { uint64_t address; uint32_t data; + uint8_t plane_id; }; extern bool msi_nonbroken; -- 2.53.0
