Unverified Commit f7b1b6be authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!510 LoongArch: fix dual-bridge machine can not work

Merge Pull Request from: @Hongchen_Zhang 
 
After apply this PR, we can boot & reboot 3C5000+7A2000 dual-bridge machine normally. 
 
Link:https://gitee.com/openeuler/kernel/pulls/510

 

Reviewed-by: default avatarGuo Dongtai <guodongtai@kylinos.cn>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parents 9b43505a cde56261
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);

+15 −8
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)
@@ -426,13 +429,17 @@ 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(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;
+5 −1
Original line number Diff line number Diff line
@@ -305,6 +305,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;
@@ -394,6 +395,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);