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

Bibo Mao posted 1 patch 2 years, 7 months ago
There is a newer version of this series
drivers/acpi/processor_core.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
[PATCH] ACPI: processor_core: LoongArch: Get physical id from MADT table
Posted by Bibo Mao 2 years, 7 months ago
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))
+				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
Re: [PATCH] ACPI: processor_core: LoongArch: Get physical id from MADT table
Posted by Rafael J. Wysocki 2 years, 6 months ago
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
>
Re: [PATCH] ACPI: processor_core: LoongArch: Get physical id from MADT table
Posted by bibo mao 2 years, 6 months ago

在 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
>>