[PATCH v6 01/17] ACPI / processor: Convert apic_id to phys_id to make it arch agnostic
Rafael J. Wysocki
rjw at rjwysocki.net
Tue Jan 6 17:50:17 PST 2015
On Sunday, January 04, 2015 06:55:02 PM Hanjun Guo wrote:
> From: Hanjun Guo <hanjun.guo at linaro.com>
>
> apic_id in MADT table is the CPU hardware id which identify
> it self in the system for x86 and ia64, OSPM will use it for
> SMP init to map APIC ID to logical cpu number in the early
> boot, when the DSDT/SSDT (ACPI namespace) is scanned later, the
> ACPI processor driver is probed and the driver will use acpi_id
> in DSDT to get the apic_id, then map to the logical cpu number
> which is needed by the processor driver.
>
> Before ACPI 5.0, only x86 and ia64 were supported in ACPI spec,
> so apic_id is used both in arch code and ACPI core which is
> pretty fine. Since ACPI 5.0, ARM is supported by ACPI and
> APIC is not available on ARM, this will confuse people when
> apic_id is both used by x86 and ARM in one function.
>
> So convert apic_id to phys_id (which is the original meaning)
> in ACPI processor dirver to make it arch agnostic, but leave the
> arch dependent code unchanged, no functional change.
>
> Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
I've queued up this one and [2/17] for 3.19-rc4 as I promised I'd push these
two for 3.19.
> ---
> drivers/acpi/acpi_processor.c | 21 +++++++++-------
> drivers/acpi/processor_core.c | 56 +++++++++++++++++++++----------------------
> include/acpi/processor.h | 8 +++----
> 3 files changed, 44 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c
> index 1fdf5e0..f02b29e 100644
> --- a/drivers/acpi/acpi_processor.c
> +++ b/drivers/acpi/acpi_processor.c
> @@ -170,7 +170,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr)
> acpi_status status;
> int ret;
>
> - if (pr->apic_id == -1)
> + if (pr->phys_id == -1)
> return -ENODEV;
>
> status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta);
> @@ -180,7 +180,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr)
> cpu_maps_update_begin();
> cpu_hotplug_begin();
>
> - ret = acpi_map_lsapic(pr->handle, pr->apic_id, &pr->id);
> + ret = acpi_map_lsapic(pr->handle, pr->phys_id, &pr->id);
> if (ret)
> goto out;
>
> @@ -215,7 +215,7 @@ static int acpi_processor_get_info(struct acpi_device *device)
> union acpi_object object = { 0 };
> struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
> struct acpi_processor *pr = acpi_driver_data(device);
> - int apic_id, cpu_index, device_declaration = 0;
> + int phys_id, cpu_index, device_declaration = 0;
> acpi_status status = AE_OK;
> static int cpu0_initialized;
> unsigned long long value;
> @@ -262,15 +262,18 @@ static int acpi_processor_get_info(struct acpi_device *device)
> pr->acpi_id = value;
> }
>
> - apic_id = acpi_get_apicid(pr->handle, device_declaration, pr->acpi_id);
> - if (apic_id < 0)
> - acpi_handle_debug(pr->handle, "failed to get CPU APIC ID.\n");
> - pr->apic_id = apic_id;
> + phys_id = acpi_get_phys_id(pr->handle, device_declaration, pr->acpi_id);
> + if (phys_id < 0)
> + acpi_handle_debug(pr->handle, "failed to get CPU physical ID.\n");
> + pr->phys_id = phys_id;
>
> - cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id);
> + cpu_index = acpi_map_cpuid(pr->phys_id, pr->acpi_id);
> if (!cpu0_initialized && !acpi_has_cpu_in_madt()) {
> cpu0_initialized = 1;
> - /* Handle UP system running SMP kernel, with no LAPIC in MADT */
> + /*
> + * Handle UP system running SMP kernel, with no CPU
> + * entry in MADT
> + */
> if ((cpu_index == -1) && (num_online_cpus() == 1))
> cpu_index = 0;
> }
> diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
> index 342942f..02e4839 100644
> --- a/drivers/acpi/processor_core.c
> +++ b/drivers/acpi/processor_core.c
> @@ -69,7 +69,7 @@ static int map_madt_entry(int type, u32 acpi_id)
> unsigned long madt_end, entry;
> static struct acpi_table_madt *madt;
> static int read_madt;
> - int apic_id = -1;
> + int phys_id = -1; /* CPU hardware ID */
>
> if (!read_madt) {
> if (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0,
> @@ -79,7 +79,7 @@ static int map_madt_entry(int type, u32 acpi_id)
> }
>
> if (!madt)
> - return apic_id;
> + return phys_id;
>
> entry = (unsigned long)madt;
> madt_end = entry + madt->header.length;
> @@ -91,18 +91,18 @@ static int map_madt_entry(int type, u32 acpi_id)
> struct acpi_subtable_header *header =
> (struct acpi_subtable_header *)entry;
> if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) {
> - if (!map_lapic_id(header, acpi_id, &apic_id))
> + if (!map_lapic_id(header, acpi_id, &phys_id))
> break;
> } else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) {
> - if (!map_x2apic_id(header, type, acpi_id, &apic_id))
> + if (!map_x2apic_id(header, type, acpi_id, &phys_id))
> break;
> } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
> - if (!map_lsapic_id(header, type, acpi_id, &apic_id))
> + if (!map_lsapic_id(header, type, acpi_id, &phys_id))
> break;
> }
> entry += header->length;
> }
> - return apic_id;
> + return phys_id;
> }
>
> static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id)
> @@ -110,7 +110,7 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id)
> struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
> union acpi_object *obj;
> struct acpi_subtable_header *header;
> - int apic_id = -1;
> + int phys_id = -1;
>
> if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
> goto exit;
> @@ -126,38 +126,38 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id)
>
> header = (struct acpi_subtable_header *)obj->buffer.pointer;
> if (header->type == ACPI_MADT_TYPE_LOCAL_APIC)
> - map_lapic_id(header, acpi_id, &apic_id);
> + map_lapic_id(header, acpi_id, &phys_id);
> else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC)
> - map_lsapic_id(header, type, acpi_id, &apic_id);
> + map_lsapic_id(header, type, acpi_id, &phys_id);
> else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC)
> - map_x2apic_id(header, type, acpi_id, &apic_id);
> + map_x2apic_id(header, type, acpi_id, &phys_id);
>
> exit:
> kfree(buffer.pointer);
> - return apic_id;
> + return phys_id;
> }
>
> -int acpi_get_apicid(acpi_handle handle, int type, u32 acpi_id)
> +int acpi_get_phys_id(acpi_handle handle, int type, u32 acpi_id)
> {
> - int apic_id;
> + int phys_id;
>
> - apic_id = map_mat_entry(handle, type, acpi_id);
> - if (apic_id == -1)
> - apic_id = map_madt_entry(type, acpi_id);
> + phys_id = map_mat_entry(handle, type, acpi_id);
> + if (phys_id == -1)
> + phys_id = map_madt_entry(type, acpi_id);
>
> - return apic_id;
> + return phys_id;
> }
>
> -int acpi_map_cpuid(int apic_id, u32 acpi_id)
> +int acpi_map_cpuid(int phys_id, u32 acpi_id)
> {
> #ifdef CONFIG_SMP
> int i;
> #endif
>
> - if (apic_id == -1) {
> + if (phys_id == -1) {
> /*
> * On UP processor, there is no _MAT or MADT table.
> - * So above apic_id is always set to -1.
> + * So above phys_id is always set to -1.
> *
> * BIOS may define multiple CPU handles even for UP processor.
> * For example,
> @@ -170,7 +170,7 @@ int acpi_map_cpuid(int apic_id, u32 acpi_id)
> * Processor (CPU3, 0x03, 0x00000410, 0x06) {}
> * }
> *
> - * Ignores apic_id and always returns 0 for the processor
> + * Ignores phys_id and always returns 0 for the processor
> * handle with acpi id 0 if nr_cpu_ids is 1.
> * This should be the case if SMP tables are not found.
> * Return -1 for other CPU's handle.
> @@ -178,28 +178,28 @@ int acpi_map_cpuid(int apic_id, u32 acpi_id)
> if (nr_cpu_ids <= 1 && acpi_id == 0)
> return acpi_id;
> else
> - return apic_id;
> + return phys_id;
> }
>
> #ifdef CONFIG_SMP
> for_each_possible_cpu(i) {
> - if (cpu_physical_id(i) == apic_id)
> + if (cpu_physical_id(i) == phys_id)
> return i;
> }
> #else
> /* In UP kernel, only processor 0 is valid */
> - if (apic_id == 0)
> - return apic_id;
> + if (phys_id == 0)
> + return phys_id;
> #endif
> return -1;
> }
>
> int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id)
> {
> - int apic_id;
> + int phys_id;
>
> - apic_id = acpi_get_apicid(handle, type, acpi_id);
> + phys_id = acpi_get_phys_id(handle, type, acpi_id);
>
> - return acpi_map_cpuid(apic_id, acpi_id);
> + return acpi_map_cpuid(phys_id, acpi_id);
> }
> EXPORT_SYMBOL_GPL(acpi_get_cpuid);
> diff --git a/include/acpi/processor.h b/include/acpi/processor.h
> index 3ca9b75..b95dc32 100644
> --- a/include/acpi/processor.h
> +++ b/include/acpi/processor.h
> @@ -196,8 +196,8 @@ struct acpi_processor_flags {
> struct acpi_processor {
> acpi_handle handle;
> u32 acpi_id;
> - u32 apic_id;
> - u32 id;
> + u32 phys_id; /* CPU hardware ID such as APIC ID for x86 */
> + u32 id; /* CPU logical ID allocated by OS */
> u32 pblk;
> int performance_platform_limit;
> int throttling_platform_limit;
> @@ -310,8 +310,8 @@ static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit)
> #endif /* CONFIG_CPU_FREQ */
>
> /* in processor_core.c */
> -int acpi_get_apicid(acpi_handle, int type, u32 acpi_id);
> -int acpi_map_cpuid(int apic_id, u32 acpi_id);
> +int acpi_get_phys_id(acpi_handle, int type, u32 acpi_id);
> +int acpi_map_cpuid(int phys_id, u32 acpi_id);
> int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id);
>
> /* in processor_pdc.c */
>
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
More information about the linux-arm-kernel
mailing list