]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
irqchip/gic: Convert to msi_create_parent_irq_domain() helper
authorMarc Zyngier <maz@kernel.org>
Tue, 13 May 2025 17:28:13 +0000 (18:28 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 16 May 2025 19:32:20 +0000 (21:32 +0200)
Switch the GIC family of interrupt chip drivers over to the common helper
function to create the interrupt domains.

[ tglx: Moved the struct out of the function call argument ]

Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250513172819.2216709-4-maz@kernel.org
drivers/irqchip/irq-gic-v2m.c
drivers/irqchip/irq-gic-v3-its.c
drivers/irqchip/irq-gic-v3-mbi.c

index 62676994d0695efcb4f87b95d34f8756255ed24d..102f1711673e6c13df98eeceea3c1577cf39dc35 100644 (file)
@@ -261,23 +261,23 @@ static struct msi_parent_ops gicv2m_msi_parent_ops = {
 
 static __init int gicv2m_allocate_domains(struct irq_domain *parent)
 {
-       struct irq_domain *inner_domain;
+       struct irq_domain_info info = {
+               .ops            = &gicv2m_domain_ops,
+               .parent         = parent,
+       };
        struct v2m_data *v2m;
 
        v2m = list_first_entry_or_null(&v2m_nodes, struct v2m_data, entry);
        if (!v2m)
                return 0;
 
-       inner_domain = irq_domain_create_hierarchy(parent, 0, 0, v2m->fwnode,
-                                                  &gicv2m_domain_ops, v2m);
-       if (!inner_domain) {
+       info.host_data = v2m;
+       info.fwnode = v2m->fwnode;
+
+       if (!msi_create_parent_irq_domain(&info, &gicv2m_msi_parent_ops)) {
                pr_err("Failed to create GICv2m domain\n");
                return -ENOMEM;
        }
-
-       irq_domain_update_bus_token(inner_domain, DOMAIN_BUS_NEXUS);
-       inner_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT;
-       inner_domain->msi_parent_ops = &gicv2m_msi_parent_ops;
        return 0;
 }
 
index d651cd41e7abef85f221e1da787e2c36f6eb234f..57ecf5b5155f6451af12e8155266a540aa212878 100644 (file)
@@ -5122,7 +5122,12 @@ out_unmap:
 
 static int its_init_domain(struct its_node *its)
 {
-       struct irq_domain *inner_domain;
+       struct irq_domain_info dom_info = {
+               .fwnode         = its->fwnode_handle,
+               .ops            = &its_domain_ops,
+               .domain_flags   = its->msi_domain_flags,
+               .parent         = its_parent,
+       };
        struct msi_domain_info *info;
 
        info = kzalloc(sizeof(*info), GFP_KERNEL);
@@ -5131,21 +5136,12 @@ static int its_init_domain(struct its_node *its)
 
        info->ops = &its_msi_domain_ops;
        info->data = its;
+       dom_info.host_data = info;
 
-       inner_domain = irq_domain_create_hierarchy(its_parent,
-                                                  its->msi_domain_flags, 0,
-                                                  its->fwnode_handle, &its_domain_ops,
-                                                  info);
-       if (!inner_domain) {
+       if (!msi_create_parent_irq_domain(&dom_info, &gic_v3_its_msi_parent_ops)) {
                kfree(info);
                return -ENOMEM;
        }
-
-       irq_domain_update_bus_token(inner_domain, DOMAIN_BUS_NEXUS);
-
-       inner_domain->msi_parent_ops = &gic_v3_its_msi_parent_ops;
-       inner_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT | IRQ_DOMAIN_FLAG_MSI_IMMUTABLE;
-
        return 0;
 }
 
@@ -5522,7 +5518,7 @@ static struct its_node __init *its_node_init(struct resource *res,
        its->base = its_base;
        its->phys_base = res->start;
        its->get_msi_base = its_irq_get_msi_base;
-       its->msi_domain_flags = IRQ_DOMAIN_FLAG_ISOLATED_MSI;
+       its->msi_domain_flags = IRQ_DOMAIN_FLAG_ISOLATED_MSI | IRQ_DOMAIN_FLAG_MSI_IMMUTABLE;
 
        its->numa_node = numa_node;
        its->fwnode_handle = handle;
index e562b57923229e98542c1b1f5525f7b7bd518607..6a4afd1066dd1f68f7e094bbf175ee4cf7473297 100644 (file)
@@ -206,17 +206,13 @@ static const struct msi_parent_ops gic_v3_mbi_msi_parent_ops = {
 
 static int mbi_allocate_domain(struct irq_domain *parent)
 {
-       struct irq_domain *nexus_domain;
+       struct irq_domain_info info = {
+               .fwnode         = parent->fwnode,
+               .ops            = &mbi_domain_ops,
+               .parent         = parent,
+       };
 
-       nexus_domain = irq_domain_create_hierarchy(parent, 0, 0, parent->fwnode,
-                                                  &mbi_domain_ops, NULL);
-       if (!nexus_domain)
-               return -ENOMEM;
-
-       irq_domain_update_bus_token(nexus_domain, DOMAIN_BUS_NEXUS);
-       nexus_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT;
-       nexus_domain->msi_parent_ops = &gic_v3_mbi_msi_parent_ops;
-       return 0;
+       return msi_create_parent_irq_domain(&info, &gic_v3_mbi_msi_parent_ops) ? 0 : -ENOMEM;
 }
 
 int __init mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent)