Commit c6b77822 authored by Marc Zyngier's avatar Marc Zyngier Committed by Thomas Gleixner
Browse files

irqchip/gic: Convert to msi_create_parent_irq_domain() helper



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: default avatarMarc Zyngier <maz@kernel.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250513172819.2216709-4-maz@kernel.org
parent e4d001b5
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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;
}

+9 −13
Original line number Diff line number Diff line
@@ -5122,7 +5122,12 @@ static void __init __iomem *its_map_one(struct resource *res, int *err)

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;
+6 −10
Original line number Diff line number Diff line
@@ -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;

	nexus_domain = irq_domain_create_hierarchy(parent, 0, 0, parent->fwnode,
						   &mbi_domain_ops, NULL);
	if (!nexus_domain)
		return -ENOMEM;
	struct irq_domain_info info = {
		.fwnode		= parent->fwnode,
		.ops		= &mbi_domain_ops,
		.parent		= parent,
	};

	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)