Commit d6b1585a authored by Jianmin Lv's avatar Jianmin Lv Committed by Hongchen Zhang
Browse files

irqchip/loongarch: Fix some issues of irq controllers

LoongArch inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I6ONTH



--------------------------------

In dual-bridges scenario, some bugs were found for irq
controllers drivers, so the patch is used to fix them.

Signed-off-by: default avatarJianmin Lv <lvjianmin@loongson.cn>
Change-Id: Ib498432738a269543626f4e8cc5dc24aa12c4c47
parent 543f2481
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -106,6 +106,13 @@ void __init init_IRQ(void)
	unsigned int order = get_order(IRQ_STACK_SIZE);
	struct page *page;

	u64 node;
	if (!acpi_gbl_reduced_hardware)
		for_each_node(node)
			writel(0x40000000 | (node << 12),
				(volatile void __iomem *)(((node << 44)
				| 0x80000EFDFB000000ULL) + 0x274));

	clear_csr_ecfg(ECFG0_IM);
	clear_csr_estat(ESTATF_IP);

+11 −6
Original line number Diff line number Diff line
@@ -294,9 +294,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;
@@ -365,8 +362,13 @@ 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 = eiointc_priv[nr_pics - 1]->node;

	if (cpu_has_flatmode)
		node = cpu_to_node(node * CORES_PER_EIO_NODE);
	parent = acpi_get_vec_parent(node, msi_group);

	if (parent)
		return pch_msi_acpi_init(parent, pchmsi_entry);
@@ -389,6 +391,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
	int i, parent_irq;
	unsigned long node_map;
	struct eiointc_priv *priv;
	int node = acpi_eiointc->node;

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (!priv)
@@ -431,8 +434,10 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
				  "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(node * CORES_PER_EIO_NODE);
	acpi_set_vec_parent(node, priv->eiointc_domain, pch_group);
	acpi_set_vec_parent(node, priv->eiointc_domain, msi_group);
	acpi_cascade_irqdomain_init();

	return 0;
+3 −0
Original line number Diff line number Diff line
@@ -394,6 +394,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);