genirq/msi: Split msi_domain_alloc_irq_at()
authorThomas Gleixner <tglx@linutronix.de>
Sat, 27 Jan 2024 16:17:36 +0000 (21:47 +0530)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 15 Feb 2024 16:55:40 +0000 (17:55 +0100)
In preparation for providing a special allocation function for wired
interrupts which are connected to a wire to MSI bridge, split the inner
workings of msi_domain_alloc_irq_at() out into a helper function so the
code can be shared.

No functional change.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20240127161753.114685-9-apatel@ventanamicro.com
kernel/irq/msi.c

index c0e73788e878b3dbdcea04fddf6ba9e6019c962f..8d463901c8643bb51bb47a1aa1b48d1455d94ed3 100644 (file)
@@ -1446,34 +1446,10 @@ int msi_domain_alloc_irqs_all_locked(struct device *dev, unsigned int domid, int
        return msi_domain_alloc_locked(dev, &ctrl);
 }
 
-/**
- * msi_domain_alloc_irq_at - Allocate an interrupt from a MSI interrupt domain at
- *                          a given index - or at the next free index
- *
- * @dev:       Pointer to device struct of the device for which the interrupts
- *             are allocated
- * @domid:     Id of the interrupt domain to operate on
- * @index:     Index for allocation. If @index == %MSI_ANY_INDEX the allocation
- *             uses the next free index.
- * @affdesc:   Optional pointer to an interrupt affinity descriptor structure
- * @icookie:   Optional pointer to a domain specific per instance cookie. If
- *             non-NULL the content of the cookie is stored in msi_desc::data.
- *             Must be NULL for MSI-X allocations
- *
- * This requires a MSI interrupt domain which lets the core code manage the
- * MSI descriptors.
- *
- * Return: struct msi_map
- *
- *     On success msi_map::index contains the allocated index number and
- *     msi_map::virq the corresponding Linux interrupt number
- *
- *     On failure msi_map::index contains the error code and msi_map::virq
- *     is %0.
- */
-struct msi_map msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, unsigned int index,
-                                      const struct irq_affinity_desc *affdesc,
-                                      union msi_instance_cookie *icookie)
+static struct msi_map __msi_domain_alloc_irq_at(struct device *dev, unsigned int domid,
+                                               unsigned int index,
+                                               const struct irq_affinity_desc *affdesc,
+                                               union msi_instance_cookie *icookie)
 {
        struct msi_ctrl ctrl = { .domid = domid, .nirqs = 1, };
        struct irq_domain *domain;
@@ -1481,17 +1457,16 @@ struct msi_map msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, u
        struct msi_desc *desc;
        int ret;
 
-       msi_lock_descs(dev);
        domain = msi_get_device_domain(dev, domid);
        if (!domain) {
                map.index = -ENODEV;
-               goto unlock;
+               return map;
        }
 
        desc = msi_alloc_desc(dev, 1, affdesc);
        if (!desc) {
                map.index = -ENOMEM;
-               goto unlock;
+               return map;
        }
 
        if (icookie)
@@ -1500,7 +1475,7 @@ struct msi_map msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, u
        ret = msi_insert_desc(dev, desc, domid, index);
        if (ret) {
                map.index = ret;
-               goto unlock;
+               return map;
        }
 
        ctrl.first = ctrl.last = desc->msi_index;
@@ -1513,7 +1488,42 @@ struct msi_map msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, u
                map.index = desc->msi_index;
                map.virq = desc->irq;
        }
-unlock:
+       return map;
+}
+
+/**
+ * msi_domain_alloc_irq_at - Allocate an interrupt from a MSI interrupt domain at
+ *                          a given index - or at the next free index
+ *
+ * @dev:       Pointer to device struct of the device for which the interrupts
+ *             are allocated
+ * @domid:     Id of the interrupt domain to operate on
+ * @index:     Index for allocation. If @index == %MSI_ANY_INDEX the allocation
+ *             uses the next free index.
+ * @affdesc:   Optional pointer to an interrupt affinity descriptor structure
+ * @icookie:   Optional pointer to a domain specific per instance cookie. If
+ *             non-NULL the content of the cookie is stored in msi_desc::data.
+ *             Must be NULL for MSI-X allocations
+ *
+ * This requires a MSI interrupt domain which lets the core code manage the
+ * MSI descriptors.
+ *
+ * Return: struct msi_map
+ *
+ *     On success msi_map::index contains the allocated index number and
+ *     msi_map::virq the corresponding Linux interrupt number
+ *
+ *     On failure msi_map::index contains the error code and msi_map::virq
+ *     is %0.
+ */
+struct msi_map msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, unsigned int index,
+                                      const struct irq_affinity_desc *affdesc,
+                                      union msi_instance_cookie *icookie)
+{
+       struct msi_map map;
+
+       msi_lock_descs(dev);
+       map = __msi_domain_alloc_irq_at(dev, domid, index, affdesc, icookie);
        msi_unlock_descs(dev);
        return map;
 }