Message ID | 155448184841.8446.13959787238854054119.stgit@bahia.lan |
---|---|
State | New |
Headers | show |
Series | [for-4.1,1/2] spapr_pci: Get rid of duplicate code for node name creation | expand |
On Fri, Apr 05, 2019 at 06:30:48PM +0200, Greg Kurz wrote: > LSI mapping in spapr currently open-codes standard PCI swizzling. It thus > duplicates the code of pci_swizzle_map_irq_fn(). > > Expose the swizzling formula so that it can be used with a slot number > when building the device tree. Simply drop pci_spapr_map_irq() and call > pci_swizzle_map_irq_fn() instead. > > Signed-off-by: Greg Kurz <groug@kaod.org> Applied to ppc-for-4.1, thanks. > --- > hw/pci/pci.c | 2 +- > hw/ppc/spapr_pci.c | 24 ++++-------------------- > include/hw/pci/pci.h | 4 ++++ > 3 files changed, 9 insertions(+), 21 deletions(-) > > diff --git a/hw/pci/pci.c b/hw/pci/pci.c > index 35451c1e9987..bb52bafd8d1c 100644 > --- a/hw/pci/pci.c > +++ b/hw/pci/pci.c > @@ -1532,7 +1532,7 @@ void pci_device_set_intx_routing_notifier(PCIDevice *dev, > */ > int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin) > { > - return (pin + PCI_SLOT(pci_dev->devfn)) % PCI_NUM_PINS; > + return pci_swizzle(PCI_SLOT(pci_dev->devfn), pin); > } > > /***********************************************************/ > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > index c70688a0dc23..26850d0b94f4 100644 > --- a/hw/ppc/spapr_pci.c > +++ b/hw/ppc/spapr_pci.c > @@ -719,26 +719,10 @@ param_error_exit: > rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); > } > > -static int pci_spapr_swizzle(int slot, int pin) > -{ > - return (slot + pin) % PCI_NUM_PINS; > -} > - > -static int pci_spapr_map_irq(PCIDevice *pci_dev, int irq_num) > -{ > - /* > - * Here we need to convert pci_dev + irq_num to some unique value > - * which is less than number of IRQs on the specific bus (4). We > - * use standard PCI swizzling, that is (slot number + pin number) > - * % 4. > - */ > - return pci_spapr_swizzle(PCI_SLOT(pci_dev->devfn), irq_num); > -} > - > static void pci_spapr_set_irq(void *opaque, int irq_num, int level) > { > /* > - * Here we use the number returned by pci_spapr_map_irq to find a > + * Here we use the number returned by pci_swizzle_map_irq_fn to find a > * corresponding qemu_irq. > */ > SpaprPhbState *phb = opaque; > @@ -1744,7 +1728,7 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp) > &sphb->iowindow); > > bus = pci_register_root_bus(dev, NULL, > - pci_spapr_set_irq, pci_spapr_map_irq, sphb, > + pci_spapr_set_irq, pci_swizzle_map_irq_fn, sphb, > &sphb->memspace, &sphb->iospace, > PCI_DEVFN(0, 0), PCI_NUM_PINS, TYPE_PCI_BUS); > phb->bus = bus; > @@ -2236,14 +2220,14 @@ int spapr_populate_pci_dt(SpaprPhbState *phb, uint32_t intc_phandle, void *fdt, > } > > /* Build the interrupt-map, this must matches what is done > - * in pci_spapr_map_irq > + * in pci_swizzle_map_irq_fn > */ > _FDT(fdt_setprop(fdt, bus_off, "interrupt-map-mask", > &interrupt_map_mask, sizeof(interrupt_map_mask))); > for (i = 0; i < PCI_SLOT_MAX; i++) { > for (j = 0; j < PCI_NUM_PINS; j++) { > uint32_t *irqmap = interrupt_map[i*PCI_NUM_PINS + j]; > - int lsi_num = pci_spapr_swizzle(i, j); > + int lsi_num = pci_swizzle(i, j); > > irqmap[0] = cpu_to_be32(b_ddddd(i)|b_fff(0)); > irqmap[1] = 0; > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index d87f5f93e9cd..033b2145d98c 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -411,6 +411,10 @@ void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, > void pci_bus_irqs_cleanup(PCIBus *bus); > int pci_bus_get_irq_level(PCIBus *bus, int irq_num); > /* 0 <= pin <= 3 0 = INTA, 1 = INTB, 2 = INTC, 3 = INTD */ > +static inline int pci_swizzle(int slot, int pin) > +{ > + return (slot + pin) % PCI_NUM_PINS; > +} > int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin); > PCIBus *pci_register_root_bus(DeviceState *parent, const char *name, > pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, >
On Mon, 8 Apr 2019 13:40:54 +1000 David Gibson <david@gibson.dropbear.id.au> wrote: > On Fri, Apr 05, 2019 at 06:30:48PM +0200, Greg Kurz wrote: > > LSI mapping in spapr currently open-codes standard PCI swizzling. It thus > > duplicates the code of pci_swizzle_map_irq_fn(). > > > > Expose the swizzling formula so that it can be used with a slot number > > when building the device tree. Simply drop pci_spapr_map_irq() and call > > pci_swizzle_map_irq_fn() instead. > > > > Signed-off-by: Greg Kurz <groug@kaod.org> > > Applied to ppc-for-4.1, thanks. > Thanks ! I just realize that I had come up with a better title, at least from my POV, but I forgot to update before posting... spapr: Drop duplicate PCI swizzle code No big deal if you keep the current title of course :) > > --- > > hw/pci/pci.c | 2 +- > > hw/ppc/spapr_pci.c | 24 ++++-------------------- > > include/hw/pci/pci.h | 4 ++++ > > 3 files changed, 9 insertions(+), 21 deletions(-) > > > > diff --git a/hw/pci/pci.c b/hw/pci/pci.c > > index 35451c1e9987..bb52bafd8d1c 100644 > > --- a/hw/pci/pci.c > > +++ b/hw/pci/pci.c > > @@ -1532,7 +1532,7 @@ void pci_device_set_intx_routing_notifier(PCIDevice *dev, > > */ > > int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin) > > { > > - return (pin + PCI_SLOT(pci_dev->devfn)) % PCI_NUM_PINS; > > + return pci_swizzle(PCI_SLOT(pci_dev->devfn), pin); > > } > > > > /***********************************************************/ > > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > > index c70688a0dc23..26850d0b94f4 100644 > > --- a/hw/ppc/spapr_pci.c > > +++ b/hw/ppc/spapr_pci.c > > @@ -719,26 +719,10 @@ param_error_exit: > > rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); > > } > > > > -static int pci_spapr_swizzle(int slot, int pin) > > -{ > > - return (slot + pin) % PCI_NUM_PINS; > > -} > > - > > -static int pci_spapr_map_irq(PCIDevice *pci_dev, int irq_num) > > -{ > > - /* > > - * Here we need to convert pci_dev + irq_num to some unique value > > - * which is less than number of IRQs on the specific bus (4). We > > - * use standard PCI swizzling, that is (slot number + pin number) > > - * % 4. > > - */ > > - return pci_spapr_swizzle(PCI_SLOT(pci_dev->devfn), irq_num); > > -} > > - > > static void pci_spapr_set_irq(void *opaque, int irq_num, int level) > > { > > /* > > - * Here we use the number returned by pci_spapr_map_irq to find a > > + * Here we use the number returned by pci_swizzle_map_irq_fn to find a > > * corresponding qemu_irq. > > */ > > SpaprPhbState *phb = opaque; > > @@ -1744,7 +1728,7 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp) > > &sphb->iowindow); > > > > bus = pci_register_root_bus(dev, NULL, > > - pci_spapr_set_irq, pci_spapr_map_irq, sphb, > > + pci_spapr_set_irq, pci_swizzle_map_irq_fn, sphb, > > &sphb->memspace, &sphb->iospace, > > PCI_DEVFN(0, 0), PCI_NUM_PINS, TYPE_PCI_BUS); > > phb->bus = bus; > > @@ -2236,14 +2220,14 @@ int spapr_populate_pci_dt(SpaprPhbState *phb, uint32_t intc_phandle, void *fdt, > > } > > > > /* Build the interrupt-map, this must matches what is done > > - * in pci_spapr_map_irq > > + * in pci_swizzle_map_irq_fn > > */ > > _FDT(fdt_setprop(fdt, bus_off, "interrupt-map-mask", > > &interrupt_map_mask, sizeof(interrupt_map_mask))); > > for (i = 0; i < PCI_SLOT_MAX; i++) { > > for (j = 0; j < PCI_NUM_PINS; j++) { > > uint32_t *irqmap = interrupt_map[i*PCI_NUM_PINS + j]; > > - int lsi_num = pci_spapr_swizzle(i, j); > > + int lsi_num = pci_swizzle(i, j); > > > > irqmap[0] = cpu_to_be32(b_ddddd(i)|b_fff(0)); > > irqmap[1] = 0; > > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > > index d87f5f93e9cd..033b2145d98c 100644 > > --- a/include/hw/pci/pci.h > > +++ b/include/hw/pci/pci.h > > @@ -411,6 +411,10 @@ void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, > > void pci_bus_irqs_cleanup(PCIBus *bus); > > int pci_bus_get_irq_level(PCIBus *bus, int irq_num); > > /* 0 <= pin <= 3 0 = INTA, 1 = INTB, 2 = INTC, 3 = INTD */ > > +static inline int pci_swizzle(int slot, int pin) > > +{ > > + return (slot + pin) % PCI_NUM_PINS; > > +} > > int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin); > > PCIBus *pci_register_root_bus(DeviceState *parent, const char *name, > > pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, > > >
On Mon, Apr 08, 2019 at 05:01:37PM +0200, Greg Kurz wrote: > On Mon, 8 Apr 2019 13:40:54 +1000 > David Gibson <david@gibson.dropbear.id.au> wrote: > > > On Fri, Apr 05, 2019 at 06:30:48PM +0200, Greg Kurz wrote: > > > LSI mapping in spapr currently open-codes standard PCI swizzling. It thus > > > duplicates the code of pci_swizzle_map_irq_fn(). > > > > > > Expose the swizzling formula so that it can be used with a slot number > > > when building the device tree. Simply drop pci_spapr_map_irq() and call > > > pci_swizzle_map_irq_fn() instead. > > > > > > Signed-off-by: Greg Kurz <groug@kaod.org> > > > > Applied to ppc-for-4.1, thanks. > > > > Thanks ! I just realize that I had come up with a better title, at least > from my POV, but I forgot to update before posting... > > spapr: Drop duplicate PCI swizzle code Sure, that is a better title and the 4.1 queue won't be sent off for a bit, so I've updated that. > No big deal if you keep the current title of course :) > > > > > --- > > > hw/pci/pci.c | 2 +- > > > hw/ppc/spapr_pci.c | 24 ++++-------------------- > > > include/hw/pci/pci.h | 4 ++++ > > > 3 files changed, 9 insertions(+), 21 deletions(-) > > > > > > diff --git a/hw/pci/pci.c b/hw/pci/pci.c > > > index 35451c1e9987..bb52bafd8d1c 100644 > > > --- a/hw/pci/pci.c > > > +++ b/hw/pci/pci.c > > > @@ -1532,7 +1532,7 @@ void pci_device_set_intx_routing_notifier(PCIDevice *dev, > > > */ > > > int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin) > > > { > > > - return (pin + PCI_SLOT(pci_dev->devfn)) % PCI_NUM_PINS; > > > + return pci_swizzle(PCI_SLOT(pci_dev->devfn), pin); > > > } > > > > > > /***********************************************************/ > > > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > > > index c70688a0dc23..26850d0b94f4 100644 > > > --- a/hw/ppc/spapr_pci.c > > > +++ b/hw/ppc/spapr_pci.c > > > @@ -719,26 +719,10 @@ param_error_exit: > > > rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); > > > } > > > > > > -static int pci_spapr_swizzle(int slot, int pin) > > > -{ > > > - return (slot + pin) % PCI_NUM_PINS; > > > -} > > > - > > > -static int pci_spapr_map_irq(PCIDevice *pci_dev, int irq_num) > > > -{ > > > - /* > > > - * Here we need to convert pci_dev + irq_num to some unique value > > > - * which is less than number of IRQs on the specific bus (4). We > > > - * use standard PCI swizzling, that is (slot number + pin number) > > > - * % 4. > > > - */ > > > - return pci_spapr_swizzle(PCI_SLOT(pci_dev->devfn), irq_num); > > > -} > > > - > > > static void pci_spapr_set_irq(void *opaque, int irq_num, int level) > > > { > > > /* > > > - * Here we use the number returned by pci_spapr_map_irq to find a > > > + * Here we use the number returned by pci_swizzle_map_irq_fn to find a > > > * corresponding qemu_irq. > > > */ > > > SpaprPhbState *phb = opaque; > > > @@ -1744,7 +1728,7 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp) > > > &sphb->iowindow); > > > > > > bus = pci_register_root_bus(dev, NULL, > > > - pci_spapr_set_irq, pci_spapr_map_irq, sphb, > > > + pci_spapr_set_irq, pci_swizzle_map_irq_fn, sphb, > > > &sphb->memspace, &sphb->iospace, > > > PCI_DEVFN(0, 0), PCI_NUM_PINS, TYPE_PCI_BUS); > > > phb->bus = bus; > > > @@ -2236,14 +2220,14 @@ int spapr_populate_pci_dt(SpaprPhbState *phb, uint32_t intc_phandle, void *fdt, > > > } > > > > > > /* Build the interrupt-map, this must matches what is done > > > - * in pci_spapr_map_irq > > > + * in pci_swizzle_map_irq_fn > > > */ > > > _FDT(fdt_setprop(fdt, bus_off, "interrupt-map-mask", > > > &interrupt_map_mask, sizeof(interrupt_map_mask))); > > > for (i = 0; i < PCI_SLOT_MAX; i++) { > > > for (j = 0; j < PCI_NUM_PINS; j++) { > > > uint32_t *irqmap = interrupt_map[i*PCI_NUM_PINS + j]; > > > - int lsi_num = pci_spapr_swizzle(i, j); > > > + int lsi_num = pci_swizzle(i, j); > > > > > > irqmap[0] = cpu_to_be32(b_ddddd(i)|b_fff(0)); > > > irqmap[1] = 0; > > > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > > > index d87f5f93e9cd..033b2145d98c 100644 > > > --- a/include/hw/pci/pci.h > > > +++ b/include/hw/pci/pci.h > > > @@ -411,6 +411,10 @@ void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, > > > void pci_bus_irqs_cleanup(PCIBus *bus); > > > int pci_bus_get_irq_level(PCIBus *bus, int irq_num); > > > /* 0 <= pin <= 3 0 = INTA, 1 = INTB, 2 = INTC, 3 = INTD */ > > > +static inline int pci_swizzle(int slot, int pin) > > > +{ > > > + return (slot + pin) % PCI_NUM_PINS; > > > +} > > > int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin); > > > PCIBus *pci_register_root_bus(DeviceState *parent, const char *name, > > > pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, > > > > > >
diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 35451c1e9987..bb52bafd8d1c 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -1532,7 +1532,7 @@ void pci_device_set_intx_routing_notifier(PCIDevice *dev, */ int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin) { - return (pin + PCI_SLOT(pci_dev->devfn)) % PCI_NUM_PINS; + return pci_swizzle(PCI_SLOT(pci_dev->devfn), pin); } /***********************************************************/ diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index c70688a0dc23..26850d0b94f4 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -719,26 +719,10 @@ param_error_exit: rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); } -static int pci_spapr_swizzle(int slot, int pin) -{ - return (slot + pin) % PCI_NUM_PINS; -} - -static int pci_spapr_map_irq(PCIDevice *pci_dev, int irq_num) -{ - /* - * Here we need to convert pci_dev + irq_num to some unique value - * which is less than number of IRQs on the specific bus (4). We - * use standard PCI swizzling, that is (slot number + pin number) - * % 4. - */ - return pci_spapr_swizzle(PCI_SLOT(pci_dev->devfn), irq_num); -} - static void pci_spapr_set_irq(void *opaque, int irq_num, int level) { /* - * Here we use the number returned by pci_spapr_map_irq to find a + * Here we use the number returned by pci_swizzle_map_irq_fn to find a * corresponding qemu_irq. */ SpaprPhbState *phb = opaque; @@ -1744,7 +1728,7 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp) &sphb->iowindow); bus = pci_register_root_bus(dev, NULL, - pci_spapr_set_irq, pci_spapr_map_irq, sphb, + pci_spapr_set_irq, pci_swizzle_map_irq_fn, sphb, &sphb->memspace, &sphb->iospace, PCI_DEVFN(0, 0), PCI_NUM_PINS, TYPE_PCI_BUS); phb->bus = bus; @@ -2236,14 +2220,14 @@ int spapr_populate_pci_dt(SpaprPhbState *phb, uint32_t intc_phandle, void *fdt, } /* Build the interrupt-map, this must matches what is done - * in pci_spapr_map_irq + * in pci_swizzle_map_irq_fn */ _FDT(fdt_setprop(fdt, bus_off, "interrupt-map-mask", &interrupt_map_mask, sizeof(interrupt_map_mask))); for (i = 0; i < PCI_SLOT_MAX; i++) { for (j = 0; j < PCI_NUM_PINS; j++) { uint32_t *irqmap = interrupt_map[i*PCI_NUM_PINS + j]; - int lsi_num = pci_spapr_swizzle(i, j); + int lsi_num = pci_swizzle(i, j); irqmap[0] = cpu_to_be32(b_ddddd(i)|b_fff(0)); irqmap[1] = 0; diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index d87f5f93e9cd..033b2145d98c 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -411,6 +411,10 @@ void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, void pci_bus_irqs_cleanup(PCIBus *bus); int pci_bus_get_irq_level(PCIBus *bus, int irq_num); /* 0 <= pin <= 3 0 = INTA, 1 = INTB, 2 = INTC, 3 = INTD */ +static inline int pci_swizzle(int slot, int pin) +{ + return (slot + pin) % PCI_NUM_PINS; +} int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin); PCIBus *pci_register_root_bus(DeviceState *parent, const char *name, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
LSI mapping in spapr currently open-codes standard PCI swizzling. It thus duplicates the code of pci_swizzle_map_irq_fn(). Expose the swizzling formula so that it can be used with a slot number when building the device tree. Simply drop pci_spapr_map_irq() and call pci_swizzle_map_irq_fn() instead. Signed-off-by: Greg Kurz <groug@kaod.org> --- hw/pci/pci.c | 2 +- hw/ppc/spapr_pci.c | 24 ++++-------------------- include/hw/pci/pci.h | 4 ++++ 3 files changed, 9 insertions(+), 21 deletions(-)