ACPI / PPTT: Add a helper to build a cpumask from a cpu_node

ANBZ: #1644

cherry-picked from https://git.kernel.org/pub/scm/linux/kernel/git/morse/linux.git

To enable PPI partitions, the irqchip driver needs to know which CPUs
are in each partition. As a partition is identified by a Processor
Container, provide a helper to map this to a cpumask.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Xin Hao <xhao@linux.alibaba.com>
Signed-off-by: Shawn Wang <shawnwang@linux.alibaba.com>
Reviewed-by: Xin Hao <xhao@linux.alibaba.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
This commit is contained in:
James Morse 2021-04-19 12:50:24 +01:00 committed by Xunlei Pang
parent ca074c3cb0
commit b43ae7ab81
2 changed files with 37 additions and 0 deletions

View File

@ -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
*

View File

@ -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