]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
irqchip/irq-msi-lib: Prepare for PCI MSI/MSIX
authorThomas Gleixner <tglx@linutronix.de>
Sun, 23 Jun 2024 15:18:38 +0000 (17:18 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 18 Jul 2024 18:31:19 +0000 (20:31 +0200)
Add the bus tokens for DOMAIN_BUS_PCI_DEVICE_MSI and
DOMAIN_BUS_PCI_DEVICE_MSIX to the common child init
function.

Provide the match mask which can be used by parent domain
implementation so the bitmask based child bus token match
works.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Behnsen <anna-maria@linutronix.de>
Signed-off-by: Shivamurthy Shastri <shivamurthy.shastri@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20240623142234.964056815@linutronix.de
drivers/irqchip/irq-msi-lib.c
drivers/irqchip/irq-msi-lib.h

index ec1a10f396b33f0569de4355e7c4a91abedc8184..ef26962a31ee699547a306551f8f2a0beea67b16 100644 (file)
@@ -28,6 +28,7 @@ bool msi_lib_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
                               struct msi_domain_info *info)
 {
        const struct msi_parent_ops *pops = real_parent->msi_parent_ops;
+       u32 required_flags;
 
        /* Parent ops available? */
        if (WARN_ON_ONCE(!pops))
@@ -46,8 +47,16 @@ bool msi_lib_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
                return false;
        }
 
+       required_flags = pops->required_flags;
+
        /* Is the target domain bus token supported? */
        switch(info->bus_token) {
+       case DOMAIN_BUS_PCI_DEVICE_MSI:
+       case DOMAIN_BUS_PCI_DEVICE_MSIX:
+               if (WARN_ON_ONCE(!IS_ENABLED(CONFIG_PCI_MSI)))
+                       return false;
+
+               break;
        default:
                /*
                 * This should never be reached. See
@@ -63,7 +72,7 @@ bool msi_lib_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
         */
        info->flags                     &= pops->supported_flags;
        /* Enforce the required flags */
-       info->flags                     |= pops->required_flags;
+       info->flags                     |= required_flags;
 
        /* Chip updates for all child bus types */
        if (!info->chip->irq_eoi)
index f0706cc28264bcc71883794d1fc92fd5a758ba94..525aa5284a9910329690f5af3f3cb5e2f326055a 100644 (file)
@@ -9,6 +9,12 @@
 #include <linux/irqdomain.h>
 #include <linux/msi.h>
 
+#ifdef CONFIG_PCI_MSI
+#define MATCH_PCI_MSI          BIT(DOMAIN_BUS_PCI_MSI)
+#else
+#define MATCH_PCI_MSI          (0)
+#endif
+
 int msi_lib_irq_domain_select(struct irq_domain *d, struct irq_fwspec *fwspec,
                              enum irq_domain_bus_token bus_token);