LoongArch inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I9RAP5
------------------------------------------
When we boot a 3C5000-7A2000 2Node server using "nr_cpus=1 maxcpus=1", we get the following Call Trace: 4.807397] ------------[ cut here ]------------ [ 4.811996] WARNING: CPU: 0 PID: 1 at drivers/acpi/irq.c:63 acpi_register_gsi+0xe0/0x100 [ 4.820048] Modules linked in: [ 4.823082] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.9.0-rc7-next-20240509+ #26 [ 4.830604] Hardware name: LOONGSON Dabieshan/Loongson-LS2C50C2, BIOS Loongson UEFI (3C50007A2000_Ls2c5lc2) V4.0.13-Dual 12/06/23 17:33:54 [ 4.842964] pc 9000000000bdc6e0 ra 9000000000bdc66c tp 90000002051d4000 sp 90000002051d7ae0 [ 4.851269] a0 0000000000000000 a1 00000000000000a0 a2 0000000000000000 a3 0000000000000000 [ 4.859567] a4 9000000200014518 a5 000000000000003c a6 90000000018876b0 a7 00302e39303a3030 [ 4.867866] t0 0000000000000000 t1 0000000000000080 t2 0000000000000040 t3 0000000000036800 [ 4.876165] t4 0000000000036800 t5 0000000000000004 t6 0000000000000000 t7 0000000000000000 [ 4.884464] t8 900000000800d910 u0 0000000000000000 s9 90000000014bf9e8 s0 00000000000000a0 [ 4.892763] s1 0000000000000000 s2 0000000000000000 s3 9000000001985000 s4 90000002051d7b88 [ 4.901063] s5 0000000000000001 s6 90000002055470b8 s7 90000000014400ac s8 0000000000000008 [ 4.909362] ra: 9000000000bdc66c acpi_register_gsi+0x6c/0x100 [ 4.915330] ERA: 9000000000bdc6e0 acpi_register_gsi+0xe0/0x100 [ 4.921297] CRMD: 000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE) [ 4.927446] PRMD: 00000004 (PPLV0 +PIE -PWE) [ 4.931777] EUEN: 00000000 (-FPE -SXE -ASXE -BTE) [ 4.936538] ECFG: 00071c1d (LIE=0,2-4,10-12 VS=7) [ 4.941301] ESTAT: 000c0000 [BRK] (IS= ECode=12 EsubCode=0) [ 4.946838] PRID: 0014c011 (Loongson-64bit, Loongson-3C5000) [ 4.952545] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.9.0-rc7-next-20240509+ #26 [ 4.960066] Hardware name: LOONGSON Dabieshan/Loongson-LS2C50C2, BIOS Loongson UEFI (3C50007A2000_Ls2c5lc2) V4.0.13-Dual 12/06/23 17:33:54 [ 4.972425] Stack : 9000000001985000 0000000000000000 9000000000223524 90000002051d4000 [ 4.980382] 90000002051d7740 90000002051d7748 0000000000000000 90000002051d7888 [ 4.988338] 90000002051d7880 90000002051d7880 90000002051d7690 0000000000000001 [ 4.996294] 0000000000000001 90000002051d7748 420a070366b7e75d 90000002054f4500 [ 5.004251] 0000000000000001 0000000000000000 4137303030354333 c0000000ffffdfff [ 5.012206] 0000000000000003 00000000000ea642 0000000006b3c000 90000000014bf9e8 [ 5.020163] 0000000000000000 0000000000000000 90000000017f7e80 9000000001985000 [ 5.028119] 0000000000000001 0000000000000000 ffffffffffd7f549 90000000014400ac [ 5.036075] 0000000000000008 0000000000000000 900000000022353c 00007ffff1354000 [ 5.044031] 00000000000000b0 0000000000000004 0000000000000000 0000000000071c1d [ 5.051987] ... [ 5.054410] Call Trace: [ 5.054412] [<900000000022353c>] show_stack+0x5c/0x1a0 [ 5.061940] [<900000000141e86c>] dump_stack_lvl+0x9c/0xc4 [ 5.067305] [<900000000140170c>] __warn+0x94/0xcc [ 5.071977] [<90000000013cd900>] report_bug+0x160/0x220 [ 5.077170] [<900000000141facc>] do_bp+0x26c/0x2e0 [ 5.081929] [<0000000000000000>] 0x0 [ 5.085475] [<9000000000bdc6e0>] acpi_register_gsi+0xe0/0x100 [ 5.091182] [<9000000000bd5350>] acpi_pci_irq_enable+0xd0/0x220 [ 5.097061] [<9000000000b5e8d4>] pci_device_probe+0x54/0x260 [ 5.102683] [<9000000000d1fefc>] really_probe+0xbc/0x320 [ 5.107960] [<9000000000d201f0>] __driver_probe_device+0x90/0x160 [ 5.114012] [<9000000000d202f8>] driver_probe_device+0x38/0x120 [ 5.119892] [<9000000000d205d4>] __driver_attach+0x94/0x1c0 [ 5.125426] [<9000000000d1d7ac>] bus_for_each_dev+0x8c/0x100 [ 5.131046] [<9000000000d1ee30>] bus_add_driver+0xf0/0x240 [ 5.136494] [<9000000000d21688>] driver_register+0x68/0x140 [ 5.142028] [<9000000000220158>] do_one_initcall+0x78/0x200 [ 5.147561] [<9000000001440fcc>] kernel_init_freeable+0x23c/0x2b0 [ 5.153614] [<900000000142123c>] kernel_init+0x1c/0x120 [ 5.158802] [<9000000000221348>] ret_from_kernel_thread+0xc/0xa4
[ 5.166244] ---[ end trace 0000000000000000 ]--- [ 5.170998] GSI: No registered irqchip, giving up
The root cause is that when the CPU boot from flat mode, it is unreliable to use cpu_to node to calculate the node number. Therefore, we use NODES_PER_FLATMODE_NODE to calculate the physical node number.
According to the 3C5000 user manual, the value of NODES_PER_FLATMODE_NODE should be 4.
Cc: stable@vger.kernel.org Signed-off-by: Ming Wang wangming01@loongson.cn Signed-off-by: Hongchen Zhang zhanghongchen@loongson.cn --- arch/loongarch/include/asm/numa.h | 1 + drivers/irqchip/irq-loongson-eiointc.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/arch/loongarch/include/asm/numa.h b/arch/loongarch/include/asm/numa.h index 27f319b49862..564c27d2de72 100644 --- a/arch/loongarch/include/asm/numa.h +++ b/arch/loongarch/include/asm/numa.h @@ -12,6 +12,7 @@ #include <linux/nodemask.h>
#define NODE_ADDRSPACE_SHIFT 44 +#define NODES_PER_FLATMODE_NODE 4
#define pa_to_nid(addr) (((addr) & 0xf00000000000) >> NODE_ADDRSPACE_SHIFT) #define nid_to_addrbase(nid) (_ULCAST_(nid) << NODE_ADDRSPACE_SHIFT) diff --git a/drivers/irqchip/irq-loongson-eiointc.c b/drivers/irqchip/irq-loongson-eiointc.c index c5c26b8e8d0c..488951a740cd 100644 --- a/drivers/irqchip/irq-loongson-eiointc.c +++ b/drivers/irqchip/irq-loongson-eiointc.c @@ -375,7 +375,7 @@ int __init pch_msi_parse_madt(union acpi_subtable_headers *header, int node;
if (cpu_has_flatmode) - node = cpu_to_node(eiointc_priv[nr_pics - 1]->node * CORES_PER_EIO_NODE); + node = eiointc_priv[nr_pics - 1]->node / NODES_PER_FLATMODE_NODE; else node = eiointc_priv[nr_pics - 1]->node;
@@ -478,7 +478,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent, goto out_free_handle;
if (cpu_has_flatmode) - node = cpu_to_node(acpi_eiointc->node * CORES_PER_EIO_NODE); + node = acpi_eiointc->node / NODES_PER_FLATMODE_NODE; else node = acpi_eiointc->node; acpi_set_vec_parent(node, priv->eiointc_domain, pch_group);