diff options
Diffstat (limited to 'drivers/acpi/pptt.c')
| -rw-r--r-- | drivers/acpi/pptt.c | 67 | 
1 files changed, 67 insertions, 0 deletions
| diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c index fe69dc518f31..701f61c01359 100644 --- a/drivers/acpi/pptt.c +++ b/drivers/acpi/pptt.c @@ -747,6 +747,73 @@ int find_acpi_cpu_topology_package(unsigned int cpu)  }  /** + * find_acpi_cpu_topology_cluster() - Determine a unique CPU cluster value + * @cpu: Kernel logical CPU number + * + * Determine a topology unique cluster ID for the given CPU/thread. + * This ID can then be used to group peers, which will have matching ids. + * + * The cluster, if present is the level of topology above CPUs. In a + * multi-thread CPU, it will be the level above the CPU, not the thread. + * It may not exist in single CPU systems. In simple multi-CPU systems, + * it may be equal to the package topology level. + * + * Return: -ENOENT if the PPTT doesn't exist, the CPU cannot be found + * or there is no toplogy level above the CPU.. + * Otherwise returns a value which represents the package for this CPU. + */ + +int find_acpi_cpu_topology_cluster(unsigned int cpu) +{ +	struct acpi_table_header *table; +	acpi_status status; +	struct acpi_pptt_processor *cpu_node, *cluster_node; +	u32 acpi_cpu_id; +	int retval; +	int is_thread; + +	status = acpi_get_table(ACPI_SIG_PPTT, 0, &table); +	if (ACPI_FAILURE(status)) { +		acpi_pptt_warn_missing(); +		return -ENOENT; +	} + +	acpi_cpu_id = get_acpi_id_for_cpu(cpu); +	cpu_node = acpi_find_processor_node(table, acpi_cpu_id); +	if (cpu_node == NULL || !cpu_node->parent) { +		retval = -ENOENT; +		goto put_table; +	} + +	is_thread = cpu_node->flags & ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD; +	cluster_node = fetch_pptt_node(table, cpu_node->parent); +	if (cluster_node == NULL) { +		retval = -ENOENT; +		goto put_table; +	} +	if (is_thread) { +		if (!cluster_node->parent) { +			retval = -ENOENT; +			goto put_table; +		} +		cluster_node = fetch_pptt_node(table, cluster_node->parent); +		if (cluster_node == NULL) { +			retval = -ENOENT; +			goto put_table; +		} +	} +	if (cluster_node->flags & ACPI_PPTT_ACPI_PROCESSOR_ID_VALID) +		retval = cluster_node->acpi_processor_id; +	else +		retval = ACPI_PTR_DIFF(cluster_node, table); + +put_table: +	acpi_put_table(table); + +	return retval; +} + +/**   * find_acpi_cpu_topology_hetero_id() - Get a core architecture tag   * @cpu: Kernel logical CPU number   * | 
