| From 0cf3c1d7b892b13f048c2a10f53e2eabb230c0f5 Mon Sep 17 00:00:00 2001 |
| From: Jeremy Linton <jeremy.linton@arm.com> |
| Date: Thu, 8 Aug 2019 15:40:06 -0500 |
| Subject: [PATCH] ACPI/PPTT: Add support for ACPI 6.3 thread flag |
| |
| commit bbd1b70639f785a970d998f35155c713f975e3ac upstream. |
| |
| ACPI 6.3 adds a flag to the CPU node to indicate whether |
| the given PE is a thread. Add a function to return that |
| information for a given linux logical CPU. |
| |
| Signed-off-by: Jeremy Linton <jeremy.linton@arm.com> |
| Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> |
| Reviewed-by: Robert Richter <rrichter@marvell.com> |
| Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Will Deacon <will@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c |
| index b72e6afaa8fb..12c8ea831924 100644 |
| --- a/drivers/acpi/pptt.c |
| +++ b/drivers/acpi/pptt.c |
| @@ -518,6 +518,44 @@ static int find_acpi_cpu_topology_tag(unsigned int cpu, int level, int flag) |
| } |
| |
| /** |
| + * check_acpi_cpu_flag() - Determine if CPU node has a flag set |
| + * @cpu: Kernel logical CPU number |
| + * @rev: The minimum PPTT revision defining the flag |
| + * @flag: The flag itself |
| + * |
| + * Check the node representing a CPU for a given flag. |
| + * |
| + * Return: -ENOENT if the PPTT doesn't exist, the CPU cannot be found or |
| + * the table revision isn't new enough. |
| + * 1, any passed flag set |
| + * 0, flag unset |
| + */ |
| +static int check_acpi_cpu_flag(unsigned int cpu, int rev, u32 flag) |
| +{ |
| + struct acpi_table_header *table; |
| + acpi_status status; |
| + u32 acpi_cpu_id = get_acpi_id_for_cpu(cpu); |
| + struct acpi_pptt_processor *cpu_node = NULL; |
| + int ret = -ENOENT; |
| + |
| + status = acpi_get_table(ACPI_SIG_PPTT, 0, &table); |
| + if (ACPI_FAILURE(status)) { |
| + acpi_pptt_warn_missing(); |
| + return ret; |
| + } |
| + |
| + if (table->revision >= rev) |
| + cpu_node = acpi_find_processor_node(table, acpi_cpu_id); |
| + |
| + if (cpu_node) |
| + ret = (cpu_node->flags & flag) != 0; |
| + |
| + acpi_put_table(table); |
| + |
| + return ret; |
| +} |
| + |
| +/** |
| * acpi_find_last_cache_level() - Determines the number of cache levels for a PE |
| * @cpu: Kernel logical CPU number |
| * |
| @@ -582,6 +620,20 @@ int cache_setup_acpi(unsigned int cpu) |
| } |
| |
| /** |
| + * acpi_pptt_cpu_is_thread() - Determine if CPU is a thread |
| + * @cpu: Kernel logical CPU number |
| + * |
| + * Return: 1, a thread |
| + * 0, not a thread |
| + * -ENOENT ,if the PPTT doesn't exist, the CPU cannot be found or |
| + * the table revision isn't new enough. |
| + */ |
| +int acpi_pptt_cpu_is_thread(unsigned int cpu) |
| +{ |
| + return check_acpi_cpu_flag(cpu, 2, ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD); |
| +} |
| + |
| +/** |
| * find_acpi_cpu_topology() - Determine a unique topology value for a given CPU |
| * @cpu: Kernel logical CPU number |
| * @level: The topological level for which we would like a unique ID |
| @@ -641,7 +693,6 @@ int find_acpi_cpu_cache_topology(unsigned int cpu, int level) |
| return ret; |
| } |
| |
| - |
| /** |
| * find_acpi_cpu_topology_package() - Determine a unique CPU package value |
| * @cpu: Kernel logical CPU number |
| diff --git a/include/linux/acpi.h b/include/linux/acpi.h |
| index 872ab208c8ad..7a2c6d9e5f9c 100644 |
| --- a/include/linux/acpi.h |
| +++ b/include/linux/acpi.h |
| @@ -1304,10 +1304,15 @@ static inline int lpit_read_residency_count_address(u64 *address) |
| #endif |
| |
| #ifdef CONFIG_ACPI_PPTT |
| +int acpi_pptt_cpu_is_thread(unsigned int cpu); |
| int find_acpi_cpu_topology(unsigned int cpu, int level); |
| int find_acpi_cpu_topology_package(unsigned int cpu); |
| int find_acpi_cpu_cache_topology(unsigned int cpu, int level); |
| #else |
| +static inline int acpi_pptt_cpu_is_thread(unsigned int cpu) |
| +{ |
| + return -EINVAL; |
| +} |
| static inline int find_acpi_cpu_topology(unsigned int cpu, int level) |
| { |
| return -EINVAL; |
| -- |
| 2.7.4 |
| |