On Thu, 17 Apr 2014, Abhilash Kesavan wrote: > Hi Nicolas, > > On Fri, Apr 11, 2014 at 11:44 PM, Nicolas Pitre > <nicolas.pitre@xxxxxxxxxx> wrote: > > On Fri, 11 Apr 2014, Abhilash Kesavan wrote: > > > >> From: Andrew Bresticker <abrestic@xxxxxxxxxxxx> > >> > >> Do not enable the big.LITTLE switcher on systems that do not have an > >> ARM CCI (cache-coherent interconnect) present. Since the CCI is used > >> to maintain cache coherency between multiple clusters and peripherals, > >> it is unlikely that a system without CCI would support big.LITTLE. > >> > >> Signed-off-by: Andrew Bresticker <abrestic@xxxxxxxxxxxx> > >> Signed-off-by: Abhilash Kesavan <a.kesavan@xxxxxxxxxxx> > > > > The b.L switcher depends on MCPM, and it also expects only 2 clusters > > which is evaluated at run time or it bails out. > > > > There might be in theory other ways than the CCI to enforce coherency > > between clusters. And that should all be encapsulated by the MCPM > > layer. The switcher module should not be concerned at all by the > > underlying hardware mechanism. > > > > So if the goal is to determine at run time whether or not the switcher > > should be activated in a multi-config kernel, then the criteria should > > be whether or not MCPM is initialized, and not if there is a CCI. > > Yes, we have a multi-SoC enabled kernel (with MCPM and BL_SWITCHER > configs enabled); one SoC has a single cluster while the other is a > dual cluster. We wanted a run-time check to prevent bL_switcher from > running on the single cluster one and zeroed in on CCI. But, I get > your point as to why CCI should not be used as a distinguishing factor > for switcher initialization. > > For now, I can use the no_bL_switcher parameter to disable it on > certain platforms. However, can you elaborate on the MCPM > initialization check you suggested ? Here's what I mean: ----- >8 From: Nicolas Pitre <nicolas.pitre@xxxxxxxxxx> Date: Wed, 16 Apr 2014 15:43:59 -0400 Subject: [PATCH] ARM: bL_switcher: fix validation check before its activation The switcher should not depend on MAX_CLUSTER which is a build time limit 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 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: Nicolas Pitre <nico@xxxxxxxxxx> diff --git a/arch/arm/common/bL_switcher.c b/arch/arm/common/bL_switcher.c index 5774b6ea7a..f01c0ee0c8 100644 --- a/arch/arm/common/bL_switcher.c +++ b/arch/arm/common/bL_switcher.c @@ -797,10 +797,8 @@ static int __init bL_switcher_init(void) { int ret; - if (MAX_NR_CLUSTERS != 2) { - pr_err("%s: only dual cluster systems are supported\n", __func__); - return -EINVAL; - } + if (!mcpm_is_available()) + return -ENODEV; cpu_notifier(bL_switcher_hotplug_callback, 0); diff --git a/arch/arm/common/mcpm_entry.c b/arch/arm/common/mcpm_entry.c index 1e361abc29..86fd60fefb 100644 --- a/arch/arm/common/mcpm_entry.c +++ b/arch/arm/common/mcpm_entry.c @@ -48,6 +48,11 @@ int __init mcpm_platform_register(const struct mcpm_platform_ops *ops) return 0; } +bool mcpm_is_available(void) +{ + return (platform_ops) ? true : false; +} + int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster) { if (!platform_ops) diff --git a/arch/arm/include/asm/mcpm.h b/arch/arm/include/asm/mcpm.h index 608516ebab..a5ff410dcd 100644 --- a/arch/arm/include/asm/mcpm.h +++ b/arch/arm/include/asm/mcpm.h @@ -54,6 +54,13 @@ void mcpm_set_early_poke(unsigned cpu, unsigned cluster, */ /** + * 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 * * @cpu: CPU number within given cluster -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html