Message ID | 1420368918-5086-2-git-send-email-hanjun.guo@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sunday, January 04, 2015 06:55:02 PM Hanjun Guo wrote: > From: Hanjun Guo <hanjun.guo@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@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 */ >
On 2015?01?07? 09:50, Rafael J. Wysocki wrote: > On Sunday, January 04, 2015 06:55:02 PM Hanjun Guo wrote: >> From: Hanjun Guo <hanjun.guo@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@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. Great, thanks a lot. I thought you will queued them for 3.20 :) Regards Hanjun
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 */