Commit d08e2e09 authored by Dave Martin's avatar Dave Martin Committed by Nicolas Pitre

ARM: bL_switcher: Add query interface to discover CPU affinities

When the switcher is active, there is no straightforward way to
figure out which logical CPU a given physical CPU maps to.

This patch provides a function
bL_switcher_get_logical_index(mpidr), which is analogous to
get_logical_index().

This function returns the logical CPU on which the specified
physical CPU is grouped (or -EINVAL if unknown).
If the switcher is inactive or not present, -EUNATCH is returned instead.
Signed-off-by: default avatarDave Martin <dave.martin@linaro.org>
Signed-off-by: default avatarNicolas Pitre <nico@linaro.org>
parent 29064b88
...@@ -532,6 +532,26 @@ static int bL_switcher_halve_cpus(void) ...@@ -532,6 +532,26 @@ static int bL_switcher_halve_cpus(void)
return 0; return 0;
} }
/* Determine the logical CPU a given physical CPU is grouped on. */
int bL_switcher_get_logical_index(u32 mpidr)
{
int cpu;
if (!bL_switcher_active)
return -EUNATCH;
mpidr &= MPIDR_HWID_BITMASK;
for_each_online_cpu(cpu) {
int pairing = bL_switcher_cpu_pairing[cpu];
if (pairing == -1)
continue;
if ((mpidr == cpu_logical_map(cpu)) ||
(mpidr == cpu_logical_map(pairing)))
return cpu;
}
return -EINVAL;
}
static void bL_switcher_trace_trigger_cpu(void *__always_unused info) static void bL_switcher_trace_trigger_cpu(void *__always_unused info)
{ {
trace_cpu_migrate_current(get_ns(), read_mpidr()); trace_cpu_migrate_current(get_ns(), read_mpidr());
......
...@@ -55,6 +55,7 @@ bool bL_switcher_get_enabled(void); ...@@ -55,6 +55,7 @@ bool bL_switcher_get_enabled(void);
void bL_switcher_put_enabled(void); void bL_switcher_put_enabled(void);
int bL_switcher_trace_trigger(void); int bL_switcher_trace_trigger(void);
int bL_switcher_get_logical_index(u32 mpidr);
#else #else
static inline int bL_switcher_register_notifier(struct notifier_block *nb) static inline int bL_switcher_register_notifier(struct notifier_block *nb)
...@@ -70,6 +71,7 @@ static inline int bL_switcher_unregister_notifier(struct notifier_block *nb) ...@@ -70,6 +71,7 @@ static inline int bL_switcher_unregister_notifier(struct notifier_block *nb)
static inline bool bL_switcher_get_enabled(void) { return false; } static inline bool bL_switcher_get_enabled(void) { return false; }
static inline void bL_switcher_put_enabled(void) { } static inline void bL_switcher_put_enabled(void) { }
static inline int bL_switcher_trace_trigger(void) { return 0; } static inline int bL_switcher_trace_trigger(void) { return 0; }
static inline int bL_switcher_get_logical_index(u32 mpidr) { return -EUNATCH; }
#endif /* CONFIG_BL_SWITCHER */ #endif /* CONFIG_BL_SWITCHER */
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment