genirq/msi: Add size info to struct msi_domain_info
authorThomas Gleixner <tglx@linutronix.de>
Thu, 24 Nov 2022 23:25:51 +0000 (00:25 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 5 Dec 2022 18:21:01 +0000 (19:21 +0100)
To allow proper range checking especially for dynamic allocations add a
size field to struct msi_domain_info. If the field is 0 then the size is
unknown or unlimited (up to MSI_MAX_INDEX) to provide backwards
compability.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20221124232325.501144862@linutronix.de
include/linux/msi.h
kernel/irq/msi.c

index 7fb87371541a5d61c5c2c711f87585932b1b1705..08a0e2abf04889ada15a4c307da36edd83105d7e 100644 (file)
@@ -422,6 +422,10 @@ struct msi_domain_ops {
  * struct msi_domain_info - MSI interrupt domain data
  * @flags:             Flags to decribe features and capabilities
  * @bus_token:         The domain bus token
+ * @hwsize:            The hardware table size or the software index limit.
+ *                     If 0 then the size is considered unlimited and
+ *                     gets initialized to the maximum software index limit
+ *                     by the domain creation code.
  * @ops:               The callback data structure
  * @chip:              Optional: associated interrupt chip
  * @chip_data:         Optional: associated interrupt chip data
@@ -433,6 +437,7 @@ struct msi_domain_ops {
 struct msi_domain_info {
        u32                             flags;
        enum irq_domain_bus_token       bus_token;
+       unsigned int                    hwsize;
        struct msi_domain_ops           *ops;
        struct irq_chip                 *chip;
        void                            *chip_data;
index c368116e8b08524ddb5bc73863f92b03a80a3e04..0a3890598b7570c8f5f06dec8e4dfc32d4a1e51d 100644 (file)
@@ -772,6 +772,17 @@ struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode,
 {
        struct irq_domain *domain;
 
+       if (info->hwsize > MSI_XA_DOMAIN_SIZE)
+               return NULL;
+
+       /*
+        * Hardware size 0 is valid for backwards compatibility and for
+        * domains which are not backed by a hardware table. Grant the
+        * maximum index space.
+        */
+       if (!info->hwsize)
+               info->hwsize = MSI_XA_DOMAIN_SIZE;
+
        msi_domain_update_dom_ops(info);
        if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
                msi_domain_update_chip_ops(info);