mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
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:
committed by
Jon Medhurst
parent
8bb495e3f0
commit
366001345f
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user