return fd;
if (pci_shmem_pci_device.msix.ctrl & PCI_MSIX_FLAGS_ENABLE) {
- gsi = irq__add_msix_route(kvm,
- msix_table[0].low,
- msix_table[0].high,
- msix_table[0].data);
+ gsi = irq__add_msix_route(kvm, &msix_table[0].msg);
} else {
gsi = pci_shmem_pci_device.irq_line;
}
#include <linux/types.h>
#include <linux/rbtree.h>
#include <linux/list.h>
+#include <linux/kvm.h>
+#include <linux/msi.h>
struct kvm;
struct rb_node *irq__get_pci_tree(void);
void irq__init(struct kvm *kvm);
-int irq__add_msix_route(struct kvm *kvm, u32 low, u32 high, u32 data);
+int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg);
#endif
#define KVM__PCI_H
#include <linux/types.h>
-
+#include <linux/kvm.h>
#include <linux/pci_regs.h>
+#include <linux/msi.h>
/*
* PCI Configuration Mechanism #1 I/O ports. See Section 3.7.4.1.
};
struct msix_table {
- u32 low;
- u32 high;
- u32 data;
+ struct msi_msg msg;
u32 ctrl;
};
die("Failed setting GSI routes");
}
-int irq__add_msix_route(struct kvm *kvm, u32 low, u32 high, u32 data)
+int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg)
{
int r;
(struct kvm_irq_routing_entry) {
.gsi = gsi,
.type = KVM_IRQ_ROUTING_MSI,
- .u.msi.address_lo = low,
- .u.msi.address_hi = high,
- .u.msi.data = data,
+ .u.msi.address_hi = msg->address_hi,
+ .u.msi.address_lo = msg->address_lo,
+ .u.msi.data = msg->data,
};
r = ioctl(kvm->vm_fd, KVM_SET_GSI_ROUTING, irq_routing);
case VIRTIO_MSI_CONFIG_VECTOR:
vec = vpci->config_vector = ioport__read16(data);
- gsi = irq__add_msix_route(kvm,
- vpci->msix_table[vec].low,
- vpci->msix_table[vec].high,
- vpci->msix_table[vec].data);
+ gsi = irq__add_msix_route(kvm, &vpci->msix_table[vec].msg);
vpci->config_gsi = gsi;
break;
case VIRTIO_MSI_QUEUE_VECTOR: {
vec = vpci->vq_vector[vpci->queue_selector] = ioport__read16(data);
- gsi = irq__add_msix_route(kvm,
- vpci->msix_table[vec].low,
- vpci->msix_table[vec].high,
- vpci->msix_table[vec].data);
+ gsi = irq__add_msix_route(kvm, &vpci->msix_table[vec].msg);
vpci->gsis[vpci->queue_selector] = gsi;
break;
}