[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