Message ID | 20190626213718.39423-3-jeremy.linton@arm.com |
---|---|
State | Accepted |
Commit | 56855a99f3d0d1e9f1f4e24f5851f9bf14c83296 |
Headers | show |
Series | arm64: SPE ACPI enablement | expand |
On Wed, Jun 26, 2019 at 11:37 PM Jeremy Linton <jeremy.linton@arm.com> wrote: > > ACPI 6.3 adds a flag to indicate that child nodes are all > identical cores. This is useful to authoritatively determine > if a set of (possibly offline) cores are identical or not. > > Since the flag doesn't give us a unique id we can generate > one and use it to create bitmaps of sibling nodes, or simply > in a loop to determine if a subset of cores are identical. > > Tested-by: Hanjun Gou <gouhanjun@huawei.com> > Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> > Signed-off-by: Jeremy Linton <jeremy.linton@arm.com> Assuming that the Tested-by tag will be fixed: Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > drivers/acpi/pptt.c | 26 ++++++++++++++++++++++++++ > include/linux/acpi.h | 5 +++++ > 2 files changed, 31 insertions(+) > > diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c > index 05344413f199..1e7ac0bd0d3a 100644 > --- a/drivers/acpi/pptt.c > +++ b/drivers/acpi/pptt.c > @@ -683,3 +683,29 @@ int find_acpi_cpu_topology_package(unsigned int cpu) > return find_acpi_cpu_topology_tag(cpu, PPTT_ABORT_PACKAGE, > ACPI_PPTT_PHYSICAL_PACKAGE); > } > + > +/** > + * find_acpi_cpu_topology_hetero_id() - Get a core architecture tag > + * @cpu: Kernel logical CPU number > + * > + * Determine a unique heterogeneous tag for the given CPU. CPUs with the same > + * implementation should have matching tags. > + * > + * The returned tag can be used to group peers with identical implementation. > + * > + * The search terminates when a level is found with the identical implementation > + * flag set or we reach a root node. > + * > + * Due to limitations in the PPTT data structure, there may be rare situations > + * where two cores in a heterogeneous machine may be identical, but won't have > + * the same tag. > + * > + * Return: -ENOENT if the PPTT doesn't exist, or the CPU cannot be found. > + * Otherwise returns a value which represents a group of identical cores > + * similar to this CPU. > + */ > +int find_acpi_cpu_topology_hetero_id(unsigned int cpu) > +{ > + return find_acpi_cpu_topology_tag(cpu, PPTT_ABORT_PACKAGE, > + ACPI_PPTT_ACPI_IDENTICAL); > +} > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > index d315d86844e4..5bcd23e5ccd6 100644 > --- a/include/linux/acpi.h > +++ b/include/linux/acpi.h > @@ -1303,6 +1303,7 @@ static inline int lpit_read_residency_count_address(u64 *address) > #ifdef CONFIG_ACPI_PPTT > int find_acpi_cpu_topology(unsigned int cpu, int level); > int find_acpi_cpu_topology_package(unsigned int cpu); > +int find_acpi_cpu_topology_hetero_id(unsigned int cpu); > int find_acpi_cpu_cache_topology(unsigned int cpu, int level); > #else > static inline int find_acpi_cpu_topology(unsigned int cpu, int level) > @@ -1313,6 +1314,10 @@ static inline int find_acpi_cpu_topology_package(unsigned int cpu) > { > return -EINVAL; > } > +static inline int find_acpi_cpu_topology_hetero_id(unsigned int cpu) > +{ > + return -EINVAL; > +} > static inline int find_acpi_cpu_cache_topology(unsigned int cpu, int level) > { > return -EINVAL; > -- > 2.21.0 >
diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c index 05344413f199..1e7ac0bd0d3a 100644 --- a/drivers/acpi/pptt.c +++ b/drivers/acpi/pptt.c @@ -683,3 +683,29 @@ int find_acpi_cpu_topology_package(unsigned int cpu) return find_acpi_cpu_topology_tag(cpu, PPTT_ABORT_PACKAGE, ACPI_PPTT_PHYSICAL_PACKAGE); } + +/** + * find_acpi_cpu_topology_hetero_id() - Get a core architecture tag + * @cpu: Kernel logical CPU number + * + * Determine a unique heterogeneous tag for the given CPU. CPUs with the same + * implementation should have matching tags. + * + * The returned tag can be used to group peers with identical implementation. + * + * The search terminates when a level is found with the identical implementation + * flag set or we reach a root node. + * + * Due to limitations in the PPTT data structure, there may be rare situations + * where two cores in a heterogeneous machine may be identical, but won't have + * the same tag. + * + * Return: -ENOENT if the PPTT doesn't exist, or the CPU cannot be found. + * Otherwise returns a value which represents a group of identical cores + * similar to this CPU. + */ +int find_acpi_cpu_topology_hetero_id(unsigned int cpu) +{ + return find_acpi_cpu_topology_tag(cpu, PPTT_ABORT_PACKAGE, + ACPI_PPTT_ACPI_IDENTICAL); +} diff --git a/include/linux/acpi.h b/include/linux/acpi.h index d315d86844e4..5bcd23e5ccd6 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -1303,6 +1303,7 @@ static inline int lpit_read_residency_count_address(u64 *address) #ifdef CONFIG_ACPI_PPTT int find_acpi_cpu_topology(unsigned int cpu, int level); int find_acpi_cpu_topology_package(unsigned int cpu); +int find_acpi_cpu_topology_hetero_id(unsigned int cpu); int find_acpi_cpu_cache_topology(unsigned int cpu, int level); #else static inline int find_acpi_cpu_topology(unsigned int cpu, int level) @@ -1313,6 +1314,10 @@ static inline int find_acpi_cpu_topology_package(unsigned int cpu) { return -EINVAL; } +static inline int find_acpi_cpu_topology_hetero_id(unsigned int cpu) +{ + return -EINVAL; +} static inline int find_acpi_cpu_cache_topology(unsigned int cpu, int level) { return -EINVAL;