Message ID | 20171221082045.14022-12-mark.cave-ayland@ilande.co.uk |
---|---|
State | New |
Headers | show |
Series | sun4u: tidy-up CPU, APB and ebus | expand |
On Thu, Dec 21, 2017 at 9:20 AM, Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> wrote: > 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> > --- > hw/pci-host/apb.c | 45 ++++++++++++++++++++------------------------- > 1 file changed, 20 insertions(+), 25 deletions(-) > > diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c > index 6c20285b04..3ebb9dc304 100644 > --- a/hw/pci-host/apb.c > +++ b/hw/pci-host/apb.c > @@ -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; > + } > > - /* 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; > + return ((PCI_SLOT(pci_dev->devfn) << 2) + irq_num) & 0x1f; > +} > > - default: > - /* Normal intno, fall through */ > - break; > - } > - } else { > - bus_offset = 0x10; > - } > - 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) > @@ -673,13 +668,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); > } > -- > 2.11.0 >
diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c index 6c20285b04..3ebb9dc304 100644 --- a/hw/pci-host/apb.c +++ b/hw/pci-host/apb.c @@ -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; + } - /* 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; + return ((PCI_SLOT(pci_dev->devfn) << 2) + irq_num) & 0x1f; +} - default: - /* Normal intno, fall through */ - break; - } - } else { - bus_offset = 0x10; - } - 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) @@ -673,13 +668,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); }
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> --- hw/pci-host/apb.c | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-)