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


Reply via email to