Commit f9ef46f2 authored by Andre Przywara's avatar Andre Przywara Committed by Will Deacon
Browse files

extend GSI IRQ routing to take a device ID



For ITS emulation we need the device ID along with the MSI payload
and doorbell address to identify an MSI, so we need to put it in the
GSI IRQ routing table too.
There is a per-VM capability by which the kernel signals the need for
a device ID, so check this and put the device ID into the routing
table if needed.
For PCI devices we take the bus/device/function triplet and and that
to the routing setup call.

Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Andre Przywara's avatarAndre Przywara <andre.przywara@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 69ae77c5
......@@ -135,7 +135,8 @@ int pci_shmem__get_local_irqfd(struct kvm *kvm)
return fd;
if (pci_shmem_pci_device.msix.ctrl & cpu_to_le16(PCI_MSIX_FLAGS_ENABLE)) {
gsi = irq__add_msix_route(kvm, &msix_table[0].msg);
gsi = irq__add_msix_route(kvm, &msix_table[0].msg,
pci_shmem_device.dev_num << 3);
if (gsi < 0)
return gsi;
} else {
......
......@@ -20,7 +20,7 @@ int irq__init(struct kvm *kvm);
int irq__exit(struct kvm *kvm);
int irq__allocate_routing_entry(void);
int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg);
int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg, u32 device_id);
void irq__update_msix_route(struct kvm *kvm, u32 gsi, struct msi_msg *msg);
#endif
......@@ -66,7 +66,7 @@ static bool check_for_irq_routing(struct kvm *kvm)
return has_irq_routing > 0;
}
int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg)
int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg, u32 device_id)
{
int r;
......@@ -77,7 +77,7 @@ int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg)
if (r)
return r;
irq_routing->entries[irq_routing->nr++] =
irq_routing->entries[irq_routing->nr] =
(struct kvm_irq_routing_entry) {
.gsi = next_gsi,
.type = KVM_IRQ_ROUTING_MSI,
......@@ -86,6 +86,12 @@ int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg)
.u.msi.data = msg->data,
};
if (kvm->msix_needs_devid) {
irq_routing->entries[irq_routing->nr].flags = KVM_MSI_VALID_DEVID;
irq_routing->entries[irq_routing->nr].u.msi.devid = device_id;
}
irq_routing->nr++;
r = ioctl(kvm->vm_fd, KVM_SET_GSI_ROUTING, irq_routing);
if (r)
return r;
......
......@@ -192,7 +192,8 @@ static bool virtio_pci__specific_io_out(struct kvm *kvm, struct virtio_device *v
break;
gsi = irq__add_msix_route(kvm,
&vpci->msix_table[vec].msg);
&vpci->msix_table[vec].msg,
vpci->dev_hdr.dev_num << 3);
/*
* We don't need IRQ routing if we can use
* MSI injection via the KVM_SIGNAL_MSI ioctl.
......@@ -216,7 +217,8 @@ static bool virtio_pci__specific_io_out(struct kvm *kvm, struct virtio_device *v
break;
gsi = irq__add_msix_route(kvm,
&vpci->msix_table[vec].msg);
&vpci->msix_table[vec].msg,
vpci->dev_hdr.dev_num << 3);
/*
* We don't need IRQ routing if we can use
* MSI injection via the KVM_SIGNAL_MSI ioctl.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment