Re: [PATCH v2] ACPI: processor_core: LoongArch: Get physical id from MADT table

From: bibo mao
Date: Fri Aug 18 2023 - 02:04:38 EST




在 2023/8/18 00:40, Rafael J. Wysocki 写道:
> On Tue, Jul 25, 2023 at 2:32 AM bibo mao <maobibo@xxxxxxxxxxx> wrote:
>>
>> slightly ping :)
>>
>> 在 2023/7/17 10:22, Bibo Mao 写道:
>>> With ACPI Spec 6.5 chapter 5.2.12.20, each processor in LoongArch
>>> system has a Core Programmable Interrupt Controller in MADT table,
>>> value of its type is 0x11 in the spec and defined as enum variable
>>> ACPI_MADT_TYPE_CORE_PIC in Linux kernel. Physical id can be parsed
>>> from MADT table for LoongArch system, also it can be parsed from
>>> MAT table for hotplug cpu. This patch adds physical id parsing for
>>> LoongArch system.
>>>
>>> Signed-off-by: Bibo Mao <maobibo@xxxxxxxxxxx>
>>> ---
>>> Changes in v2:
>>> Refresh the changelog and add detailed description of acpi spec
>>> about MADT table for LoongArch system.
>>>
>>> Add comments in function map_core_pic_id.
>>>
>>> ---
>>> drivers/acpi/processor_core.c | 29 +++++++++++++++++++++++++++++
>>> 1 file changed, 29 insertions(+)
>>>
>>> diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
>>> index d6606a9f2da6..7dd6dbaa98c3 100644
>>> --- a/drivers/acpi/processor_core.c
>>> +++ b/drivers/acpi/processor_core.c
>>> @@ -132,6 +132,30 @@ static int map_rintc_hartid(struct acpi_subtable_header *entry,
>>> return -EINVAL;
>>> }
>>>
>>> +/*
>>> + * Retrieve LoongArch CPU physical id
>>> + */
>>> +static int map_core_pic_id(struct acpi_subtable_header *entry,
>>> + int device_declaration, u32 acpi_id, phys_cpuid_t *phys_id)
>>> +{
>>> + struct acpi_madt_core_pic *core_pic =
>>> + container_of(entry, struct acpi_madt_core_pic, header);
>>> +
>>> + if (!(core_pic->flags & ACPI_MADT_ENABLED))
>>> + return -ENODEV;
>>> +
>>> + /* device_declaration means Device object in DSDT, in LoongArch
>>> + * system, logical processor acpi_id is required in _UID property
>>> + * of DSDT table, so we should check device_declaration here
>>> + */
>>> + if (device_declaration && (core_pic->processor_id == acpi_id)) {
>>> + *phys_id = core_pic->core_id;
>>> + return 0;
>>> + }
>>> +
>>> + return -EINVAL;
>>> +}
>>> +
>>> static phys_cpuid_t map_madt_entry(struct acpi_table_madt *madt,
>>> int type, u32 acpi_id)
>>> {
>>> @@ -165,6 +189,9 @@ static phys_cpuid_t map_madt_entry(struct acpi_table_madt *madt,
>>> } else if (header->type == ACPI_MADT_TYPE_RINTC) {
>>> if (!map_rintc_hartid(header, type, acpi_id, &phys_id))
>>> break;
>>> + } else if (header->type == ACPI_MADT_TYPE_CORE_PIC) {
>>> + if (!map_core_pic_id(header, type, acpi_id, &phys_id))
>>> + break;
>>> }
>>> entry += header->length;
>>> }
>>> @@ -216,6 +243,8 @@ static phys_cpuid_t map_mat_entry(acpi_handle handle, int type, u32 acpi_id)
>>> map_x2apic_id(header, type, acpi_id, &phys_id);
>>> else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT)
>>> map_gicc_mpidr(header, type, acpi_id, &phys_id);
>>> + else if (header->type == ACPI_MADT_TYPE_CORE_PIC)
>>> + map_core_pic_id(header, type, acpi_id, &phys_id);
>>>
>>> exit:
>>> kfree(buffer.pointer);
>>
>
> Sorry for the delay.
>
> Applied (under a slightly edited subject) as 6.6 material, thanks!

Thanks for applying the patch.