+ 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 */
>      }


Reply via email to