Commit a64241ba authored by Jeremy Linton's avatar Jeremy Linton Committed by Greg Kroah-Hartman

arm64: topology: Use PPTT to determine if PE is a thread

Commit 98dc1990 upstream.

ACPI 6.3 adds a thread flag to represent if a CPU/PE is
actually a thread. Given that the MPIDR_MT bit may not
represent this information consistently on homogeneous machines
we should prefer the PPTT flag if its available.
Signed-off-by: default avatarJeremy Linton <jeremy.linton@arm.com>
Reviewed-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Reviewed-by: default avatarRobert Richter <rrichter@marvell.com>
[will: made acpi_cpu_is_threaded() return 'bool']
Signed-off-by: default avatarWill Deacon <will@kernel.org>
Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent b098a4cd
...@@ -340,17 +340,28 @@ void remove_cpu_topology(unsigned int cpu) ...@@ -340,17 +340,28 @@ void remove_cpu_topology(unsigned int cpu)
} }
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
static bool __init acpi_cpu_is_threaded(int cpu)
{
int is_threaded = acpi_pptt_cpu_is_thread(cpu);
/*
* if the PPTT doesn't have thread information, assume a homogeneous
* machine and return the current CPU's thread state.
*/
if (is_threaded < 0)
is_threaded = read_cpuid_mpidr() & MPIDR_MT_BITMASK;
return !!is_threaded;
}
/* /*
* Propagate the topology information of the processor_topology_node tree to the * Propagate the topology information of the processor_topology_node tree to the
* cpu_topology array. * cpu_topology array.
*/ */
static int __init parse_acpi_topology(void) static int __init parse_acpi_topology(void)
{ {
bool is_threaded;
int cpu, topology_id; int cpu, topology_id;
is_threaded = read_cpuid_mpidr() & MPIDR_MT_BITMASK;
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
int i, cache_id; int i, cache_id;
...@@ -358,7 +369,7 @@ static int __init parse_acpi_topology(void) ...@@ -358,7 +369,7 @@ static int __init parse_acpi_topology(void)
if (topology_id < 0) if (topology_id < 0)
return topology_id; return topology_id;
if (is_threaded) { if (acpi_cpu_is_threaded(cpu)) {
cpu_topology[cpu].thread_id = topology_id; cpu_topology[cpu].thread_id = topology_id;
topology_id = find_acpi_cpu_topology(cpu, 1); topology_id = find_acpi_cpu_topology(cpu, 1);
cpu_topology[cpu].core_id = topology_id; cpu_topology[cpu].core_id = topology_id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment