diff mbox series

hw/loongarch: Fix ACPI processor id off-by-one error

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

Commit Message

Jiajie Chen Aug. 20, 2023, 10:56 a.m. UTC
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(-)

Comments

bibo mao Aug. 21, 2023, 1:24 a.m. UTC | #1
+ 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 */
>      }
Jiajie Chen Aug. 21, 2023, 1:29 a.m. UTC | #2
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 */
>>       }
bibo mao Aug. 21, 2023, 2 a.m. UTC | #3
在 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 */
>>>      }
bibo mao Aug. 22, 2023, 12:55 a.m. UTC | #4
在 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 mbox series

Patch

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