pci: Move legacy IRQ assignment into devices

So far the (legacy) IRQ line for a PCI device is allocated in devices.c,
which should actually not take care of that. Since we allocate all other
device specific resources in the actual device emulation code, the IRQ
should not be something special.

Remove the PCI specific code from devices.c, and move the IRQ line
allocation to the PCI code.
This drops the IRQ line from the VESA device, since it does not use one.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>
diff --git a/devices.c b/devices.c
index 2c8b266..41cffdd 100644
--- a/devices.c
+++ b/devices.c
@@ -1,6 +1,5 @@
 #include "kvm/devices.h"
 #include "kvm/kvm.h"
-#include "kvm/pci.h"
 
 #include <linux/err.h>
 #include <linux/rbtree.h>
@@ -28,14 +27,6 @@
 	bus = &device_trees[dev->bus_type];
 	dev->dev_num = bus->dev_num++;
 
-	switch (dev->bus_type) {
-	case DEVICE_BUS_PCI:
-		pci__assign_irq(dev);
-		break;
-	default:
-		break;
-	}
-
 	node = &bus->root.rb_node;
 	while (*node) {
 		int num = rb_entry(*node, struct device_header, node)->dev_num;
diff --git a/include/kvm/pci.h b/include/kvm/pci.h
index ccb155e..2c29c09 100644
--- a/include/kvm/pci.h
+++ b/include/kvm/pci.h
@@ -155,7 +155,7 @@
 struct pci_device_header *pci__find_dev(u8 dev_num);
 u32 pci_get_mmio_block(u32 size);
 u16 pci_get_io_port_block(u32 size);
-void pci__assign_irq(struct device_header *dev_hdr);
+int pci__assign_irq(struct pci_device_header *pci_hdr);
 void pci__config_wr(struct kvm *kvm, union pci_config_address addr, void *data, int size);
 void pci__config_rd(struct kvm *kvm, union pci_config_address addr, void *data, int size);
 
diff --git a/pci.c b/pci.c
index b6892d9..3ecdd0f 100644
--- a/pci.c
+++ b/pci.c
@@ -49,10 +49,8 @@
 	return NULL;
 }
 
-void pci__assign_irq(struct device_header *dev_hdr)
+int pci__assign_irq(struct pci_device_header *pci_hdr)
 {
-	struct pci_device_header *pci_hdr = dev_hdr->data;
-
 	/*
 	 * PCI supports only INTA#,B#,C#,D# per device.
 	 *
@@ -64,6 +62,8 @@
 
 	if (!pci_hdr->irq_type)
 		pci_hdr->irq_type = IRQ_TYPE_EDGE_RISING;
+
+	return pci_hdr->irq_line;
 }
 
 static void *pci_config_address_ptr(u16 port)
diff --git a/vfio/pci.c b/vfio/pci.c
index b09557d..89d29b8 100644
--- a/vfio/pci.c
+++ b/vfio/pci.c
@@ -1220,6 +1220,8 @@
 	}
 
 	if (pdev->irq_modes & VFIO_PCI_IRQ_MODE_INTX) {
+		pci__assign_irq(&vdev->pci.hdr);
+
 		ret = vfio_pci_init_intx(kvm, vdev);
 		if (ret)
 			return ret;
diff --git a/virtio/pci.c b/virtio/pci.c
index 281c318..c652949 100644
--- a/virtio/pci.c
+++ b/virtio/pci.c
@@ -524,13 +524,12 @@
 	if (irq__can_signal_msi(kvm))
 		vpci->features |= VIRTIO_PCI_F_SIGNAL_MSI;
 
+	vpci->legacy_irq_line = pci__assign_irq(&vpci->pci_hdr);
+
 	r = device__register(&vpci->dev_hdr);
 	if (r < 0)
 		goto free_msix_mmio;
 
-	/* save the IRQ that device__register() has allocated */
-	vpci->legacy_irq_line = vpci->pci_hdr.irq_line;
-
 	return 0;
 
 free_msix_mmio: