Message ID | 20230820105658.99123-2-c@jia.je (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/loongarch: Fix ACPI processor id off-by-one error | expand |
+ Add xianglai Good catch. In theory, it is logical id, and it can be not equal to physical id. However it must be equal to _UID in cpu dsdt table which is missing now. Can pptt table parse error be fixed if cpu dsdt table is added? Regards Bibo Mao 在 2023/8/20 18:56, Jiajie Chen 写道: > In hw/acpi/aml-build.c:build_pptt() function, the code assumes that the > ACPI processor id equals to the cpu index, for example if we have 8 > cpus, then the ACPI processor id should be in range 0-7. > > However, in hw/loongarch/acpi-build.c:build_madt() function we broke the > assumption. If we have 8 cpus again, the ACPI processor id in MADT table > would be in range 1-8. It violates the following description taken from > ACPI spec 6.4 table 5.138: > > If the processor structure represents an actual processor, this field > must match the value of ACPI processor ID field in the processor’s entry > in the MADT. > > It will break the latest Linux 6.5-rc6 with the > following error message: > > ACPI PPTT: PPTT table found, but unable to locate core 7 (8) > Invalid BIOS PPTT > > Here 7 is the last cpu index, 8 is the ACPI processor id learned from > MADT. > > With this patch, Linux can properly detect SMT threads when "-smp > 8,sockets=1,cores=4,threads=2" is passed: > > Thread(s) per core: 2 > Core(s) per socket: 2 > Socket(s): 2 > > The detection of number of sockets is still wrong, but that is out of > scope of the commit. > > Signed-off-by: Jiajie Chen <c@jia.je> > --- > hw/loongarch/acpi-build.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c > index 0b62c3a2f7..ae292fc543 100644 > --- a/hw/loongarch/acpi-build.c > +++ b/hw/loongarch/acpi-build.c > @@ -127,7 +127,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, LoongArchMachineState *lams) > build_append_int_noprefix(table_data, 17, 1); /* Type */ > build_append_int_noprefix(table_data, 15, 1); /* Length */ > build_append_int_noprefix(table_data, 1, 1); /* Version */ > - build_append_int_noprefix(table_data, i + 1, 4); /* ACPI Processor ID */ > + build_append_int_noprefix(table_data, i, 4); /* ACPI Processor ID */ > build_append_int_noprefix(table_data, arch_id, 4); /* Core ID */ > build_append_int_noprefix(table_data, 1, 4); /* Flags */ > }
On 2023/8/21 09:24, bibo mao wrote: > + Add xianglai > > Good catch. > > In theory, it is logical id, and it can be not equal to physical id. > However it must be equal to _UID in cpu dsdt table which is missing > now. Yes, the logical id can be different from index. The spec says: If the processor structure represents an actual processor, this field must match the value of ACPI processor ID field in the processor’s entry in the MADT. If the processor structure represents a group of associated processors, the structure might match a processor container in the name space. In that case this entry will match the value of the _UID method of the associated processor container. Where there is a match it must be represented. The flags field, described in/Processor Structure Flags/, includes a bit to describe whether the ACPI processor ID is valid. I believe PPTT, MADT and DSDT should all adhere to the same logical id mapping. > > Can pptt table parse error be fixed if cpu dsdt table is added? > > Regards > Bibo Mao > > > 在 2023/8/20 18:56, Jiajie Chen 写道: >> In hw/acpi/aml-build.c:build_pptt() function, the code assumes that the >> ACPI processor id equals to the cpu index, for example if we have 8 >> cpus, then the ACPI processor id should be in range 0-7. >> >> However, in hw/loongarch/acpi-build.c:build_madt() function we broke the >> assumption. If we have 8 cpus again, the ACPI processor id in MADT table >> would be in range 1-8. It violates the following description taken from >> ACPI spec 6.4 table 5.138: >> >> If the processor structure represents an actual processor, this field >> must match the value of ACPI processor ID field in the processor’s entry >> in the MADT. >> >> It will break the latest Linux 6.5-rc6 with the >> following error message: >> >> ACPI PPTT: PPTT table found, but unable to locate core 7 (8) >> Invalid BIOS PPTT >> >> Here 7 is the last cpu index, 8 is the ACPI processor id learned from >> MADT. >> >> With this patch, Linux can properly detect SMT threads when "-smp >> 8,sockets=1,cores=4,threads=2" is passed: >> >> Thread(s) per core: 2 >> Core(s) per socket: 2 >> Socket(s): 2 >> >> The detection of number of sockets is still wrong, but that is out of >> scope of the commit. >> >> Signed-off-by: Jiajie Chen<c@jia.je> >> --- >> hw/loongarch/acpi-build.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c >> index 0b62c3a2f7..ae292fc543 100644 >> --- a/hw/loongarch/acpi-build.c >> +++ b/hw/loongarch/acpi-build.c >> @@ -127,7 +127,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, LoongArchMachineState *lams) >> build_append_int_noprefix(table_data, 17, 1); /* Type */ >> build_append_int_noprefix(table_data, 15, 1); /* Length */ >> build_append_int_noprefix(table_data, 1, 1); /* Version */ >> - build_append_int_noprefix(table_data, i + 1, 4); /* ACPI Processor ID */ >> + build_append_int_noprefix(table_data, i, 4); /* ACPI Processor ID */ >> build_append_int_noprefix(table_data, arch_id, 4); /* Core ID */ >> build_append_int_noprefix(table_data, 1, 4); /* Flags */ >> }
在 2023/8/21 09:29, Jiajie Chen 写道: > > On 2023/8/21 09:24, bibo mao wrote: >> + Add xianglai >> >> Good catch. >> >> In theory, it is logical id, and it can be not equal to physical id. >> However it must be equal to _UID in cpu dsdt table which is missing >> now. > > Yes, the logical id can be different from index. The spec says: > > If the processor structure represents an actual processor, this field must match the value of ACPI processor ID field in the processor’s entry in the MADT. If the processor structure represents a group of associated processors, the structure might match a processor container in the name space. In that case this entry will match the value of the _UID method of the associated processor container. Where there is a match it must be represented. The flags field, described in /Processor Structure Flags/, includes a bit to describe whether the ACPI processor ID is valid. > > I believe PPTT, MADT and DSDT should all adhere to the same logical id mapping. yes, if logical id is set the same with physical id, it can solve the problem and also it may hide the potential problem about qemu/kernel etc. So I prefer to different methods only if it comply the spec, so that we can find the issue and solve it in early stage. Regards Bibo Mao > >> Can pptt table parse error be fixed if cpu dsdt table is added? >> >> Regards >> Bibo Mao >> >> >> 在 2023/8/20 18:56, Jiajie Chen 写道: >>> In hw/acpi/aml-build.c:build_pptt() function, the code assumes that the >>> ACPI processor id equals to the cpu index, for example if we have 8 >>> cpus, then the ACPI processor id should be in range 0-7. >>> >>> However, in hw/loongarch/acpi-build.c:build_madt() function we broke the >>> assumption. If we have 8 cpus again, the ACPI processor id in MADT table >>> would be in range 1-8. It violates the following description taken from >>> ACPI spec 6.4 table 5.138: >>> >>> If the processor structure represents an actual processor, this field >>> must match the value of ACPI processor ID field in the processor’s entry >>> in the MADT. >>> >>> It will break the latest Linux 6.5-rc6 with the >>> following error message: >>> >>> ACPI PPTT: PPTT table found, but unable to locate core 7 (8) >>> Invalid BIOS PPTT >>> >>> Here 7 is the last cpu index, 8 is the ACPI processor id learned from >>> MADT. >>> >>> With this patch, Linux can properly detect SMT threads when "-smp >>> 8,sockets=1,cores=4,threads=2" is passed: >>> >>> Thread(s) per core: 2 >>> Core(s) per socket: 2 >>> Socket(s): 2 >>> >>> The detection of number of sockets is still wrong, but that is out of >>> scope of the commit. >>> >>> Signed-off-by: Jiajie Chen <c@jia.je> >>> --- >>> hw/loongarch/acpi-build.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c >>> index 0b62c3a2f7..ae292fc543 100644 >>> --- a/hw/loongarch/acpi-build.c >>> +++ b/hw/loongarch/acpi-build.c >>> @@ -127,7 +127,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, LoongArchMachineState *lams) >>> build_append_int_noprefix(table_data, 17, 1); /* Type */ >>> build_append_int_noprefix(table_data, 15, 1); /* Length */ >>> build_append_int_noprefix(table_data, 1, 1); /* Version */ >>> - build_append_int_noprefix(table_data, i + 1, 4); /* ACPI Processor ID */ >>> + build_append_int_noprefix(table_data, i, 4); /* ACPI Processor ID */ >>> build_append_int_noprefix(table_data, arch_id, 4); /* Core ID */ >>> build_append_int_noprefix(table_data, 1, 4); /* Flags */ >>> }
在 2023/8/21 09:29, Jiajie Chen 写道: > > On 2023/8/21 09:24, bibo mao wrote: >> + Add xianglai >> >> Good catch. >> >> In theory, it is logical id, and it can be not equal to physical id. >> However it must be equal to _UID in cpu dsdt table which is missing >> now. > > Yes, the logical id can be different from index. The spec says: > > If the processor structure represents an actual processor, this field must match the value of ACPI processor ID field in the processor’s entry in the MADT. If the processor structure represents a group of associated processors, the structure might match a processor container in the name space. In that case this entry will match the value of the _UID method of the associated processor container. Where there is a match it must be represented. The flags field, described in /Processor Structure Flags/, includes a bit to describe whether the ACPI processor ID is valid. > > I believe PPTT, MADT and DSDT should all adhere to the same logical id mapping. yes, you are right and I had a mistake. Logical id in MADT/DSDT/PPTT should be the same, there is physical id associated with arch_ids->cpus[i].arch_id already. And get_arch_id for cpuclass to get physical id and DSDT table are missing about LoongArch platform, however it is another issue. Reviewed-by: Bibo Mao <maobibo@loongson.cn> Regards Bibo Mao > >> Can pptt table parse error be fixed if cpu dsdt table is added? >> >> Regards >> Bibo Mao >> >> >> 在 2023/8/20 18:56, Jiajie Chen 写道: >>> In hw/acpi/aml-build.c:build_pptt() function, the code assumes that the >>> ACPI processor id equals to the cpu index, for example if we have 8 >>> cpus, then the ACPI processor id should be in range 0-7. >>> >>> However, in hw/loongarch/acpi-build.c:build_madt() function we broke the >>> assumption. If we have 8 cpus again, the ACPI processor id in MADT table >>> would be in range 1-8. It violates the following description taken from >>> ACPI spec 6.4 table 5.138: >>> >>> If the processor structure represents an actual processor, this field >>> must match the value of ACPI processor ID field in the processor’s entry >>> in the MADT. >>> >>> It will break the latest Linux 6.5-rc6 with the >>> following error message: >>> >>> ACPI PPTT: PPTT table found, but unable to locate core 7 (8) >>> Invalid BIOS PPTT >>> >>> Here 7 is the last cpu index, 8 is the ACPI processor id learned from >>> MADT. >>> >>> With this patch, Linux can properly detect SMT threads when "-smp >>> 8,sockets=1,cores=4,threads=2" is passed: >>> >>> Thread(s) per core: 2 >>> Core(s) per socket: 2 >>> Socket(s): 2 >>> >>> The detection of number of sockets is still wrong, but that is out of >>> scope of the commit. >>> >>> Signed-off-by: Jiajie Chen <c@jia.je> >>> --- >>> hw/loongarch/acpi-build.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c >>> index 0b62c3a2f7..ae292fc543 100644 >>> --- a/hw/loongarch/acpi-build.c >>> +++ b/hw/loongarch/acpi-build.c >>> @@ -127,7 +127,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, LoongArchMachineState *lams) >>> build_append_int_noprefix(table_data, 17, 1); /* Type */ >>> build_append_int_noprefix(table_data, 15, 1); /* Length */ >>> build_append_int_noprefix(table_data, 1, 1); /* Version */ >>> - build_append_int_noprefix(table_data, i + 1, 4); /* ACPI Processor ID */ >>> + build_append_int_noprefix(table_data, i, 4); /* ACPI Processor ID */ >>> build_append_int_noprefix(table_data, arch_id, 4); /* Core ID */ >>> build_append_int_noprefix(table_data, 1, 4); /* Flags */ >>> }
diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c index 0b62c3a2f7..ae292fc543 100644 --- a/hw/loongarch/acpi-build.c +++ b/hw/loongarch/acpi-build.c @@ -127,7 +127,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, LoongArchMachineState *lams) build_append_int_noprefix(table_data, 17, 1); /* Type */ build_append_int_noprefix(table_data, 15, 1); /* Length */ build_append_int_noprefix(table_data, 1, 1); /* Version */ - build_append_int_noprefix(table_data, i + 1, 4); /* ACPI Processor ID */ + build_append_int_noprefix(table_data, i, 4); /* ACPI Processor ID */ build_append_int_noprefix(table_data, arch_id, 4); /* Core ID */ build_append_int_noprefix(table_data, 1, 4); /* Flags */ }
In hw/acpi/aml-build.c:build_pptt() function, the code assumes that the ACPI processor id equals to the cpu index, for example if we have 8 cpus, then the ACPI processor id should be in range 0-7. However, in hw/loongarch/acpi-build.c:build_madt() function we broke the assumption. If we have 8 cpus again, the ACPI processor id in MADT table would be in range 1-8. It violates the following description taken from ACPI spec 6.4 table 5.138: If the processor structure represents an actual processor, this field must match the value of ACPI processor ID field in the processor’s entry in the MADT. It will break the latest Linux 6.5-rc6 with the following error message: ACPI PPTT: PPTT table found, but unable to locate core 7 (8) Invalid BIOS PPTT Here 7 is the last cpu index, 8 is the ACPI processor id learned from MADT. With this patch, Linux can properly detect SMT threads when "-smp 8,sockets=1,cores=4,threads=2" is passed: Thread(s) per core: 2 Core(s) per socket: 2 Socket(s): 2 The detection of number of sockets is still wrong, but that is out of scope of the commit. Signed-off-by: Jiajie Chen <c@jia.je> --- hw/loongarch/acpi-build.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)