Commit 3b5a5672 authored by Huacai Chen's avatar Huacai Chen
Browse files

Merge 'irq/loongarch-fixes-6.4' into loongarch-next

LoongArch architecture changes for 6.4 depend on the irq changes
to work on "dual-bridge" systems, so merge them to create a base.
parents 457391b0 48ce2d72
Loading
Loading
Loading
Loading
+22 −10
Original line number Diff line number Diff line
@@ -280,9 +280,6 @@ static void acpi_set_vec_parent(int node, struct irq_domain *parent, struct acpi
{
	int i;

	if (cpu_has_flatmode)
		node = cpu_to_node(node * CORES_PER_EIO_NODE);

	for (i = 0; i < MAX_IO_PICS; i++) {
		if (node == vec_group[i].node) {
			vec_group[i].parent = parent;
@@ -343,19 +340,27 @@ static int __init pch_pic_parse_madt(union acpi_subtable_headers *header,
	if (parent)
		return pch_pic_acpi_init(parent, pchpic_entry);

	return -EINVAL;
	return 0;
}

static int __init pch_msi_parse_madt(union acpi_subtable_headers *header,
					const unsigned long end)
{
	struct irq_domain *parent;
	struct acpi_madt_msi_pic *pchmsi_entry = (struct acpi_madt_msi_pic *)header;
	struct irq_domain *parent = acpi_get_vec_parent(eiointc_priv[nr_pics - 1]->node, msi_group);
	int node;

	if (cpu_has_flatmode)
		node = cpu_to_node(eiointc_priv[nr_pics - 1]->node * CORES_PER_EIO_NODE);
	else
		node = eiointc_priv[nr_pics - 1]->node;

	parent = acpi_get_vec_parent(node, msi_group);

	if (parent)
		return pch_msi_acpi_init(parent, pchmsi_entry);

	return -EINVAL;
	return 0;
}

static int __init acpi_cascade_irqdomain_init(void)
@@ -379,6 +384,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
	int i, ret, parent_irq;
	unsigned long node_map;
	struct eiointc_priv *priv;
	int node;

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (!priv)
@@ -416,13 +422,19 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
	parent_irq = irq_create_mapping(parent, acpi_eiointc->cascade);
	irq_set_chained_handler_and_data(parent_irq, eiointc_irq_dispatch, priv);

	if (nr_pics == 1) {
		register_syscore_ops(&eiointc_syscore_ops);
		cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_LOONGARCH_STARTING,
				  "irqchip/loongarch/intc:starting",
				  eiointc_router_init, NULL);
	}

	acpi_set_vec_parent(acpi_eiointc->node, priv->eiointc_domain, pch_group);
	acpi_set_vec_parent(acpi_eiointc->node, priv->eiointc_domain, msi_group);
	if (cpu_has_flatmode)
		node = cpu_to_node(acpi_eiointc->node * CORES_PER_EIO_NODE);
	else
		node = acpi_eiointc->node;
	acpi_set_vec_parent(node, priv->eiointc_domain, pch_group);
	acpi_set_vec_parent(node, priv->eiointc_domain, msi_group);
	ret = acpi_cascade_irqdomain_init();

	return ret;
+5 −1
Original line number Diff line number Diff line
@@ -311,6 +311,7 @@ static int pch_pic_init(phys_addr_t addr, unsigned long size, int vec_base,
	pch_pic_handle[nr_pics] = domain_handle;
	pch_pic_priv[nr_pics++] = priv;

	if (nr_pics == 1)
		register_syscore_ops(&pch_pic_syscore_ops);

	return 0;
@@ -403,6 +404,9 @@ int __init pch_pic_acpi_init(struct irq_domain *parent,
	int ret, vec_base;
	struct fwnode_handle *domain_handle;

	if (find_pch_pic(acpi_pchpic->gsi_base) >= 0)
		return 0;

	vec_base = acpi_pchpic->gsi_base - GSI_MIN_PCH_IRQ;

	domain_handle = irq_domain_alloc_fwnode(&acpi_pchpic->address);