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:
parent
cacd05805e
commit
d9e4d6829c
@ -517,32 +517,27 @@ static int pci_apb_map_irq(PCIDevice *pci_dev, int 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 */
|
||||
switch (PCI_SLOT(pci_dev->devfn)) {
|
||||
case 1:
|
||||
/* Onboard NIC */
|
||||
return 0x21;
|
||||
case 3:
|
||||
/* Onboard IDE */
|
||||
return 0x20;
|
||||
|
||||
default:
|
||||
/* Normal intno, fall through */
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
bus_offset = 0x10;
|
||||
/* The on-board devices have fixed (legacy) OBIO intnos */
|
||||
switch (PCI_SLOT(pci_dev->devfn)) {
|
||||
case 1:
|
||||
/* Onboard NIC */
|
||||
return 0x21;
|
||||
case 3:
|
||||
/* Onboard IDE */
|
||||
return 0x20;
|
||||
default:
|
||||
/* Normal intno, fall through */
|
||||
break;
|
||||
}
|
||||
return (bus_offset + (PCI_SLOT(pci_dev->devfn) << 2) + irq_num) & 0x1f;
|
||||
|
||||
return ((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)
|
||||
@ -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,
|
||||
TYPE_PBM_PCI_BRIDGE);
|
||||
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);
|
||||
|
||||
pci_dev = pci_create_multifunction(phb->bus, PCI_DEVFN(1, 1), true,
|
||||
TYPE_PBM_PCI_BRIDGE);
|
||||
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_init_nofail(&pci_dev->qdev);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user