apb: split pci_pbm_map_irq() into separate functions for bus A and bus B

After the previous refactoring it is now possible to use separate functions
to improve the clarity of the interrupt paths.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Artyom Tarasenko <atar4qemu@gmail.com>
This commit is contained in:
Mark Cave-Ayland 2017-12-21 07:32:57 +00:00
parent cacd05805e
commit d9e4d6829c

View File

@ -517,15 +517,8 @@ static int pci_apb_map_irq(PCIDevice *pci_dev, int irq_num)
return irq_num; return irq_num;
} }
static int pci_pbm_map_irq(PCIDevice *pci_dev, int irq_num) static int pci_pbmA_map_irq(PCIDevice *pci_dev, int irq_num)
{ {
PBMPCIBridge *br = PBM_PCI_BRIDGE(pci_bridge_get_device(
PCI_BUS(qdev_get_parent_bus(DEVICE(pci_dev)))));
int bus_offset;
if (br->busA) {
bus_offset = 0x0;
/* The on-board devices have fixed (legacy) OBIO intnos */ /* The on-board devices have fixed (legacy) OBIO intnos */
switch (PCI_SLOT(pci_dev->devfn)) { switch (PCI_SLOT(pci_dev->devfn)) {
case 1: case 1:
@ -534,15 +527,17 @@ static int pci_pbm_map_irq(PCIDevice *pci_dev, int irq_num)
case 3: case 3:
/* Onboard IDE */ /* Onboard IDE */
return 0x20; return 0x20;
default: default:
/* Normal intno, fall through */ /* Normal intno, fall through */
break; break;
} }
} else {
bus_offset = 0x10; return ((PCI_SLOT(pci_dev->devfn) << 2) + irq_num) & 0x1f;
} }
return (bus_offset + (PCI_SLOT(pci_dev->devfn) << 2) + irq_num) & 0x1f;
static int pci_pbmB_map_irq(PCIDevice *pci_dev, int irq_num)
{
return (0x10 + (PCI_SLOT(pci_dev->devfn) << 2) + irq_num) & 0x1f;
} }
static void pci_apb_set_irq(void *opaque, int irq_num, int level) static void pci_apb_set_irq(void *opaque, int irq_num, int level)
@ -679,13 +674,13 @@ static void pci_pbm_realize(DeviceState *dev, Error **errp)
pci_dev = pci_create_multifunction(phb->bus, PCI_DEVFN(1, 0), true, pci_dev = pci_create_multifunction(phb->bus, PCI_DEVFN(1, 0), true,
TYPE_PBM_PCI_BRIDGE); TYPE_PBM_PCI_BRIDGE);
s->bridgeB = PCI_BRIDGE(pci_dev); s->bridgeB = PCI_BRIDGE(pci_dev);
pci_bridge_map_irq(s->bridgeB, "pciB", pci_pbm_map_irq); pci_bridge_map_irq(s->bridgeB, "pciB", pci_pbmB_map_irq);
qdev_init_nofail(&pci_dev->qdev); qdev_init_nofail(&pci_dev->qdev);
pci_dev = pci_create_multifunction(phb->bus, PCI_DEVFN(1, 1), true, pci_dev = pci_create_multifunction(phb->bus, PCI_DEVFN(1, 1), true,
TYPE_PBM_PCI_BRIDGE); TYPE_PBM_PCI_BRIDGE);
s->bridgeA = PCI_BRIDGE(pci_dev); s->bridgeA = PCI_BRIDGE(pci_dev);
pci_bridge_map_irq(s->bridgeA, "pciA", pci_pbm_map_irq); pci_bridge_map_irq(s->bridgeA, "pciA", pci_pbmA_map_irq);
qdev_prop_set_bit(DEVICE(pci_dev), "busA", true); qdev_prop_set_bit(DEVICE(pci_dev), "busA", true);
qdev_init_nofail(&pci_dev->qdev); qdev_init_nofail(&pci_dev->qdev);
} }