ARM: kernel: provide cluster to logical cpu mask mapping API

Some device drivers like PMU require to retrieve the logical cpu mask
that corresponds to a given cluster id. This patch provides a hook in
the topology code that, given an existing cluster id as input,
initializes the corresponding cpumask passed as a pointer, reusing all
existing topology information required by sched domains in the kernel.

Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
This commit is contained in:
Lorenzo Pieralisi
2012-09-10 16:06:30 +01:00
committed by Jon Medhurst
parent 8bb495e3f0
commit 366001345f
2 changed files with 30 additions and 0 deletions

View File

@@ -26,11 +26,14 @@ extern struct cputopo_arm cpu_topology[NR_CPUS];
void init_cpu_topology(void);
void store_cpu_topology(unsigned int cpuid);
const struct cpumask *cpu_coregroup_mask(int cpu);
int cluster_to_logical_mask(unsigned int socket_id, cpumask_t *cluster_mask);
#else
static inline void init_cpu_topology(void) { }
static inline void store_cpu_topology(unsigned int cpuid) { }
static inline int cluster_to_logical_mask(unsigned int socket_id,
cpumask_t *cluster_mask) { return -EINVAL; }
#endif

View File

@@ -289,6 +289,33 @@ void store_cpu_topology(unsigned int cpuid)
cpu_topology[cpuid].socket_id, mpidr);
}
/*
* cluster_to_logical_mask - return cpu logical mask of CPUs in a cluster
* @socket_id: cluster HW identifier
* @cluster_mask: the cpumask location to be initialized, modified by the
* function only if return value == 0
*
* Return:
*
* 0 on success
* -EINVAL if cluster_mask is NULL or there is no record matching socket_id
*/
int cluster_to_logical_mask(unsigned int socket_id, cpumask_t *cluster_mask)
{
int cpu;
if (!cluster_mask)
return -EINVAL;
for_each_online_cpu(cpu)
if (socket_id == topology_physical_package_id(cpu)) {
cpumask_copy(cluster_mask, topology_core_cpumask(cpu));
return 0;
}
return -EINVAL;
}
/*
* init_cpu_topology is called at boot when only one cpu is running
* which prevent simultaneous write access to cpu_topology array