diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c index 9967291178bb..72c194e2991e 100644 --- a/drivers/acpi/pptt.c +++ b/drivers/acpi/pptt.c @@ -281,6 +281,37 @@ static struct acpi_pptt_processor *acpi_find_processor_node(struct acpi_table_he return NULL; } +/* parent_node points into the table, but the table isn't provided. */ +void acpi_pptt_get_child_cpus(struct acpi_pptt_processor *parent_node, cpumask_t *cpus) +{ + struct acpi_pptt_processor *cpu_node; + struct acpi_table_header *table_hdr; + acpi_status status; + u32 acpi_id; + int cpu; + + status = acpi_get_table(ACPI_SIG_PPTT, 0, &table_hdr); + if (ACPI_FAILURE(status)) + return; + + for_each_possible_cpu(cpu) { + acpi_id = get_acpi_id_for_cpu(cpu); + cpu_node = acpi_find_processor_node(table_hdr, acpi_id); + + while (cpu_node) { + if (cpu_node == parent_node) { + cpumask_set_cpu(cpu, cpus); + break; + } + cpu_node = fetch_pptt_node(table_hdr, cpu_node->parent); + } + } + + acpi_put_table(table_hdr); + + return; +} + /** * acpi_pptt_for_each_container() - Iterate over all processor containers * diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 36be818f8433..387de2ab57f6 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -1364,6 +1364,7 @@ int find_acpi_cpu_topology_hetero_id(unsigned int cpu); int find_acpi_cpu_cache_topology(unsigned int cpu, int level); u32 acpi_pptt_count_containers(void); int acpi_pptt_for_each_container(acpi_pptt_cpu_callback_t callback, void *arg); +void acpi_pptt_get_child_cpus(struct acpi_pptt_processor *parent_node, cpumask_t *cpus); #else static inline int acpi_pptt_cpu_is_thread(unsigned int cpu) { @@ -1394,6 +1395,11 @@ acpi_pptt_for_each_container(acpi_pptt_cpu_callback_t *callback, void *arg) { return -EINVAL; } +static inline void +acpi_pptt_get_child_cpus(struct acpi_pptt_processor *parent_node, + cpumask_t *cpus) +{ +} #endif #ifdef CONFIG_ACPI