diff mbox series

[for-4.1,2/2] spapr: Drop duplicate code in LSI mapping

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

Commit Message

Greg Kurz April 5, 2019, 4:30 p.m. UTC
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(-)

Comments

David Gibson April 8, 2019, 3:40 a.m. UTC | #1
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,
>
Greg Kurz April 8, 2019, 3:01 p.m. UTC | #2
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,
> >   
>
David Gibson April 10, 2019, 12:40 a.m. UTC | #3
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 mbox series

Patch

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,