s390/pci: Refactor arch_setup_msi_irqs()
authorGerd Bayer <gbayer@linux.ibm.com>
Thu, 11 Jul 2024 13:45:26 +0000 (15:45 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Tue, 23 Jul 2024 13:54:58 +0000 (15:54 +0200)
Factor out adapter interrupt allocation from arch_setup_msi_irqs() in
preparation for enabling registration of multiple MSIs. Code movement
only, no change of functionality intended.

Signed-off-by: Gerd Bayer <gbayer@linux.ibm.com>
Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/pci/pci_irq.c

index 0ef83b6ac0db7466d4db64ec8a1555b3e66ca499..979f776b09b8d9f25e0b457f93843e2c5f43d6ba 100644 (file)
@@ -268,33 +268,20 @@ static void zpci_floating_irq_handler(struct airq_struct *airq,
        }
 }
 
-int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
+static int __alloc_airq(struct zpci_dev *zdev, int msi_vecs,
+                       unsigned long *bit)
 {
-       struct zpci_dev *zdev = to_zpci(pdev);
-       unsigned int hwirq, msi_vecs, cpu;
-       unsigned long bit;
-       struct msi_desc *msi;
-       struct msi_msg msg;
-       int cpu_addr;
-       int rc, irq;
-
-       zdev->aisb = -1UL;
-       zdev->msi_first_bit = -1U;
-       if (type == PCI_CAP_ID_MSI && nvec > 1)
-               return 1;
-       msi_vecs = min_t(unsigned int, nvec, zdev->max_msi);
-
        if (irq_delivery == DIRECTED) {
                /* Allocate cpu vector bits */
-               bit = airq_iv_alloc(zpci_ibv[0], msi_vecs);
-               if (bit == -1UL)
+               *bit = airq_iv_alloc(zpci_ibv[0], msi_vecs);
+               if (*bit == -1UL)
                        return -EIO;
        } else {
                /* Allocate adapter summary indicator bit */
-               bit = airq_iv_alloc_bit(zpci_sbv);
-               if (bit == -1UL)
+               *bit = airq_iv_alloc_bit(zpci_sbv);
+               if (*bit == -1UL)
                        return -EIO;
-               zdev->aisb = bit;
+               zdev->aisb = *bit;
 
                /* Create adapter interrupt vector */
                zdev->aibv = airq_iv_create(msi_vecs, AIRQ_IV_DATA | AIRQ_IV_BITLOCK, NULL);
@@ -302,10 +289,33 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
                        return -ENOMEM;
 
                /* Wire up shortcut pointer */
-               zpci_ibv[bit] = zdev->aibv;
+               zpci_ibv[*bit] = zdev->aibv;
                /* Each function has its own interrupt vector */
-               bit = 0;
+               *bit = 0;
        }
+       return 0;
+}
+
+int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
+{
+       struct zpci_dev *zdev = to_zpci(pdev);
+       unsigned int hwirq, msi_vecs, cpu;
+       struct msi_desc *msi;
+       struct msi_msg msg;
+       unsigned long bit;
+       int cpu_addr;
+       int rc, irq;
+
+       zdev->aisb = -1UL;
+       zdev->msi_first_bit = -1U;
+
+       if (type == PCI_CAP_ID_MSI && nvec > 1)
+               return 1;
+       msi_vecs = min_t(unsigned int, nvec, zdev->max_msi);
+
+       rc = __alloc_airq(zdev, msi_vecs, &bit);
+       if (rc < 0)
+               return rc;
 
        /* Request MSI interrupts */
        hwirq = bit;