diff mbox

[v8,2/2] ARM: Enable selection of SMP operations at boot time

Message ID 1366828819-10745-2-git-send-email-stefano.stabellini@eu.citrix.com (mailing list archive)
State New, archived
Headers show

Commit Message

Stefano Stabellini April 24, 2013, 6:40 p.m. UTC
From: Jon Medhurst <tixy@linaro.org>

Add a new 'smp_init' hook to machine_desc so platforms can specify a
function to be used to setup smp ops instead of having a statically
defined value.  The hook must return true when smp_ops are initialized.
If false the static mdesc->smp_ops will be used by default.

Signed-off-by: Jon Medhurst <tixy@linaro.org>
Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
---
 arch/arm/include/asm/mach/arch.h |    4 ++++
 arch/arm/kernel/setup.c          |   10 ++++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

Comments

Will Deacon April 25, 2013, 8:49 a.m. UTC | #1
On Wed, Apr 24, 2013 at 07:40:19PM +0100, Stefano Stabellini wrote:
> From: Jon Medhurst <tixy@linaro.org>
> 
> Add a new 'smp_init' hook to machine_desc so platforms can specify a
> function to be used to setup smp ops instead of having a statically
> defined value.  The hook must return true when smp_ops are initialized.
> If false the static mdesc->smp_ops will be used by default.
> 
> Signed-off-by: Jon Medhurst <tixy@linaro.org>
> Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> ---
>  arch/arm/include/asm/mach/arch.h |    4 ++++
>  arch/arm/kernel/setup.c          |   10 ++++++----
>  2 files changed, 10 insertions(+), 4 deletions(-)

[...]

>  	if (is_smp()) {
> -		if (psci_smp_available())
> -			smp_set_ops(&psci_smp_ops);
> -		else if (mdesc->smp)
> -			smp_set_ops(mdesc->smp);
> +		if (!mdesc->smp_init || !mdesc->smp_init()) {

Minor nit, but this feels backwards to me. We usually return 0 on success,
yet we're saying here that if mdesc->smp_init() returns 0, then we go and
override the smp ops.

Will

> +			if (psci_smp_available())
> +				smp_set_ops(&psci_smp_ops);
> +			else if (mdesc->smp)
> +				smp_set_ops(mdesc->smp);
> +		}
>  		smp_init_cpus();
>  	}
>  #endif
> -- 
> 1.7.2.5
> 
>
Stefano Stabellini April 25, 2013, 10:25 a.m. UTC | #2
On Thu, 25 Apr 2013, Will Deacon wrote:
> On Wed, Apr 24, 2013 at 07:40:19PM +0100, Stefano Stabellini wrote:
> > From: Jon Medhurst <tixy@linaro.org>
> > 
> > Add a new 'smp_init' hook to machine_desc so platforms can specify a
> > function to be used to setup smp ops instead of having a statically
> > defined value.  The hook must return true when smp_ops are initialized.
> > If false the static mdesc->smp_ops will be used by default.
> > 
> > Signed-off-by: Jon Medhurst <tixy@linaro.org>
> > Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> > ---
> >  arch/arm/include/asm/mach/arch.h |    4 ++++
> >  arch/arm/kernel/setup.c          |   10 ++++++----
> >  2 files changed, 10 insertions(+), 4 deletions(-)
> 
> [...]
> 
> >  	if (is_smp()) {
> > -		if (psci_smp_available())
> > -			smp_set_ops(&psci_smp_ops);
> > -		else if (mdesc->smp)
> > -			smp_set_ops(mdesc->smp);
> > +		if (!mdesc->smp_init || !mdesc->smp_init()) {
> 
> Minor nit, but this feels backwards to me. We usually return 0 on success,
> yet we're saying here that if mdesc->smp_init() returns 0, then we go and
> override the smp ops.

I am OK with changing the interface to return an int instead of a bool,
but given that Nicolas is the main user of smp_init at the moment, I'll
wait for his opinion.
Nicolas Pitre April 25, 2013, 2:42 p.m. UTC | #3
On Thu, 25 Apr 2013, Will Deacon wrote:

> On Wed, Apr 24, 2013 at 07:40:19PM +0100, Stefano Stabellini wrote:
> > From: Jon Medhurst <tixy@linaro.org>
> > 
> > Add a new 'smp_init' hook to machine_desc so platforms can specify a
> > function to be used to setup smp ops instead of having a statically
> > defined value.  The hook must return true when smp_ops are initialized.
> > If false the static mdesc->smp_ops will be used by default.
> > 
> > Signed-off-by: Jon Medhurst <tixy@linaro.org>
> > Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> > ---
> >  arch/arm/include/asm/mach/arch.h |    4 ++++
> >  arch/arm/kernel/setup.c          |   10 ++++++----
> >  2 files changed, 10 insertions(+), 4 deletions(-)
> 
> [...]
> 
> >  	if (is_smp()) {
> > -		if (psci_smp_available())
> > -			smp_set_ops(&psci_smp_ops);
> > -		else if (mdesc->smp)
> > -			smp_set_ops(mdesc->smp);
> > +		if (!mdesc->smp_init || !mdesc->smp_init()) {
> 
> Minor nit, but this feels backwards to me. We usually return 0 on success,
> yet we're saying here that if mdesc->smp_init() returns 0, then we go and
> override the smp ops.

It doesn't return 0, but true or false.  So, semantically, if ->smp_init 
returns false, that means it didn't initialize anything.


Nicolas
Stefano Stabellini April 26, 2013, 3:36 p.m. UTC | #4
On Thu, 25 Apr 2013, Nicolas Pitre wrote:
> On Thu, 25 Apr 2013, Will Deacon wrote:
> 
> > On Wed, Apr 24, 2013 at 07:40:19PM +0100, Stefano Stabellini wrote:
> > > From: Jon Medhurst <tixy@linaro.org>
> > > 
> > > Add a new 'smp_init' hook to machine_desc so platforms can specify a
> > > function to be used to setup smp ops instead of having a statically
> > > defined value.  The hook must return true when smp_ops are initialized.
> > > If false the static mdesc->smp_ops will be used by default.
> > > 
> > > Signed-off-by: Jon Medhurst <tixy@linaro.org>
> > > Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
> > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > > Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> > > ---
> > >  arch/arm/include/asm/mach/arch.h |    4 ++++
> > >  arch/arm/kernel/setup.c          |   10 ++++++----
> > >  2 files changed, 10 insertions(+), 4 deletions(-)
> > 
> > [...]
> > 
> > >  	if (is_smp()) {
> > > -		if (psci_smp_available())
> > > -			smp_set_ops(&psci_smp_ops);
> > > -		else if (mdesc->smp)
> > > -			smp_set_ops(mdesc->smp);
> > > +		if (!mdesc->smp_init || !mdesc->smp_init()) {
> > 
> > Minor nit, but this feels backwards to me. We usually return 0 on success,
> > yet we're saying here that if mdesc->smp_init() returns 0, then we go and
> > override the smp ops.
> 
> It doesn't return 0, but true or false.  So, semantically, if ->smp_init 
> returns false, that means it didn't initialize anything.

In absence of other comments, I am going to leave as it is now.
diff mbox

Patch

diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index 308ad7d..4669e0b 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -16,8 +16,10 @@  struct pt_regs;
 struct smp_operations;
 #ifdef CONFIG_SMP
 #define smp_ops(ops) (&(ops))
+#define smp_init_ops(ops) (&(ops))
 #else
 #define smp_ops(ops) (struct smp_operations *)NULL
+#define smp_init_ops(ops) (bool (*)(void))NULL
 #endif
 
 struct machine_desc {
@@ -41,6 +43,8 @@  struct machine_desc {
 	unsigned char		reserve_lp2 :1;	/* never has lp2	*/
 	char			restart_mode;	/* default restart mode	*/
 	struct smp_operations	*smp;		/* SMP operations	*/
+	/* Detect smp_ops dynamically, based on DT */
+	bool			(*smp_init)(void);
 	void			(*fixup)(struct tag *, char **,
 					 struct meminfo *);
 	void			(*reserve)(void);/* reserve mem blocks	*/
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index dad3048..22cc863 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -770,10 +770,12 @@  void __init setup_arch(char **cmdline_p)
 	psci_init();
 #ifdef CONFIG_SMP
 	if (is_smp()) {
-		if (psci_smp_available())
-			smp_set_ops(&psci_smp_ops);
-		else if (mdesc->smp)
-			smp_set_ops(mdesc->smp);
+		if (!mdesc->smp_init || !mdesc->smp_init()) {
+			if (psci_smp_available())
+				smp_set_ops(&psci_smp_ops);
+			else if (mdesc->smp)
+				smp_set_ops(mdesc->smp);
+		}
 		smp_init_cpus();
 	}
 #endif