On Mon, Jul 10, 2023 at 8:33 AM Bibo Mao <maobibo@xxxxxxxxxxx> wrote: > > With ACPI Spec 6.5 physical id can be parsed from MADT table for > LoongArch system, also it can be used in MAT table for cpu hotplug > stage. This patch adds physical id parsing for LoongArch system. > > Signed-off-by: Bibo Mao <maobibo@xxxxxxxxxxx> > --- > drivers/acpi/processor_core.c | 25 +++++++++++++++++++++++++ > 1 file changed, 25 insertions(+) > > diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c > index d6606a9f2da6..51239cd2a485 100644 > --- a/drivers/acpi/processor_core.c > +++ b/drivers/acpi/processor_core.c > @@ -132,6 +132,26 @@ 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 *apic_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; > + > + if (device_declaration && (core_pic->processor_id == acpi_id)) { > + *apic_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 +185,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)) Is ACPI_MADT_TYPE_CORE_PIC specific to LoongArch? The changelog should mention it if that's the case. > + break; > } > entry += header->length; > } > @@ -216,6 +239,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); > -- > 2.27.0 >