ACPI: processor_core: LoongArch: Get physical id from MADT table

Message ID 20230710063340.1716007-1-maobibo@loongson.cn
State New
Headers
Series ACPI: processor_core: LoongArch: Get physical id from MADT table |

Commit Message

maobibo July 10, 2023, 6:33 a.m. UTC
  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(+)
  

Comments

Rafael J. Wysocki July 13, 2023, 3:28 p.m. UTC | #1
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
>
  
maobibo July 14, 2023, 1:04 a.m. UTC | #2
在 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
>>
  

Patch

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);