Message ID | 20230710063340.1716007-1-maobibo@loongson.cn |
---|---|
State | Superseded |
Headers | show |
Series | ACPI: processor_core: LoongArch: Get physical id from MADT table | expand |
On Mon, Jul 10, 2023 at 8:33 AM Bibo Mao <maobibo@loongson.cn> 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@loongson.cn> > --- > 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 >
在 2023/7/13 23:28, Rafael J. Wysocki 写道: > On Mon, Jul 10, 2023 at 8:33 AM Bibo Mao <maobibo@loongson.cn> 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@loongson.cn> >> --- >> 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. Rafael, Thanks for reviewing my patch. Yes, ACPI_MADT_TYPE_CORE_PIC is specific to LoongArch. And I will modify the changelog in the next version. Regards Bibo Mao > >> + 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 >>
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)) + 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);
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@loongson.cn> --- drivers/acpi/processor_core.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)