Commit 4530e4b6 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King

ARM: 8032/1: bL_switcher: fix validation check before its activation

The switcher should not depend on MAX_CLUSTER to determine ifit should
be activated or not. In a multiplatform kernel binary it is possible to
have dual-cluster and quad-cluster platforms configured in. In that case
MAX_CLUSTER which is a build time limit should be 4 and that shouldn't
prevent the switcher from working if the kernel is booted on a b.L
dual-cluster system.

In bL_switcher_halve_cpus() we already have a runtime validation check
to make sure we're dealing with only two clusters, so booting on a quad
cluster system will be caught and switcher activation aborted.

However, the b.L switcher must ensure the MCPM layer is initialized on
the booted hardware before doing anything.  The mcpm_is_available()
function is added to that effect.
Signed-off-by: default avatarNicolas Pitre <nico@linaro.org>
Tested-by: default avatarAbhilash Kesavan <kesavan.abhilash@gmail.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 56b700fd
...@@ -797,10 +797,8 @@ static int __init bL_switcher_init(void) ...@@ -797,10 +797,8 @@ static int __init bL_switcher_init(void)
{ {
int ret; int ret;
if (MAX_NR_CLUSTERS != 2) { if (!mcpm_is_available())
pr_err("%s: only dual cluster systems are supported\n", __func__); return -ENODEV;
return -EINVAL;
}
cpu_notifier(bL_switcher_hotplug_callback, 0); cpu_notifier(bL_switcher_hotplug_callback, 0);
......
...@@ -48,6 +48,11 @@ int __init mcpm_platform_register(const struct mcpm_platform_ops *ops) ...@@ -48,6 +48,11 @@ int __init mcpm_platform_register(const struct mcpm_platform_ops *ops)
return 0; return 0;
} }
bool mcpm_is_available(void)
{
return (platform_ops) ? true : false;
}
int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster) int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster)
{ {
if (!platform_ops) if (!platform_ops)
......
...@@ -53,6 +53,13 @@ void mcpm_set_early_poke(unsigned cpu, unsigned cluster, ...@@ -53,6 +53,13 @@ void mcpm_set_early_poke(unsigned cpu, unsigned cluster,
* CPU/cluster power operations API for higher subsystems to use. * CPU/cluster power operations API for higher subsystems to use.
*/ */
/**
* mcpm_is_available - returns whether MCPM is initialized and available
*
* This returns true or false accordingly.
*/
bool mcpm_is_available(void);
/** /**
* mcpm_cpu_power_up - make given CPU in given cluster runable * mcpm_cpu_power_up - make given CPU in given cluster runable
* *
......
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