diff mbox

[PATCHv5,6/6] ARM: imx: Add Freescale LS1021A SMP support

Message ID 1413192963-11153-7-git-send-email-jingchang.lu@freescale.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jingchang Lu Oct. 13, 2014, 9:36 a.m. UTC
From: Jingchang Lu <b35083@freescale.com>

Freescale LS1021A SoCs deploy two cortex-A7 processors,
this adds bring-up support for the secondary core.

Signed-off-by: Jingchang Lu <b35083@freescale.com>
---
 arch/arm/mach-imx/Makefile       |  2 +-
 arch/arm/mach-imx/common.h       |  1 +
 arch/arm/mach-imx/mach-ls1021a.c |  1 +
 arch/arm/mach-imx/platsmp.c      | 32 ++++++++++++++++++++++++++++++++
 4 files changed, 35 insertions(+), 1 deletion(-)

Comments

Kumar Gala Oct. 16, 2014, 2:30 p.m. UTC | #1
On Oct 13, 2014, at 11:36 AM, Jingchang Lu <jingchang.lu@freescale.com> wrote:

> From: Jingchang Lu <b35083@freescale.com>
> 
> Freescale LS1021A SoCs deploy two cortex-A7 processors,
> this adds bring-up support for the secondary core.
> 
> Signed-off-by: Jingchang Lu <b35083@freescale.com>
> ---
> arch/arm/mach-imx/Makefile       |  2 +-
> arch/arm/mach-imx/common.h       |  1 +
> arch/arm/mach-imx/mach-ls1021a.c |  1 +
> arch/arm/mach-imx/platsmp.c      | 32 ++++++++++++++++++++++++++++++++
> 4 files changed, 35 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
> index ce137bc..38d75e2 100644
> --- a/arch/arm/mach-imx/Makefile
> +++ b/arch/arm/mach-imx/Makefile
> @@ -89,7 +89,7 @@ obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o
> obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
> obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
> obj-$(CONFIG_HAVE_IMX_SRC) += src.o
> -ifdef CONFIG_SOC_IMX6
> +ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),)
> AFLAGS_headsmp.o :=-Wa,-march=armv7-a
> obj-$(CONFIG_SMP) += headsmp.o platsmp.o
> obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
> diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h
> index 1dabf43..c473ca5 100644
> --- a/arch/arm/mach-imx/common.h
> +++ b/arch/arm/mach-imx/common.h
> @@ -157,5 +157,6 @@ static inline void imx_init_l2cache(void) {}
> #endif
> 
> extern struct smp_operations imx_smp_ops;
> +extern struct smp_operations ls1021a_smp_ops;
> 
> #endif
> diff --git a/arch/arm/mach-imx/mach-ls1021a.c b/arch/arm/mach-imx/mach-ls1021a.c
> index 9d2034b..b89c858 100644
> --- a/arch/arm/mach-imx/mach-ls1021a.c
> +++ b/arch/arm/mach-imx/mach-ls1021a.c
> @@ -17,5 +17,6 @@ static const char * const ls1021a_dt_compat[] __initconst = {
> };
> 
> DT_MACHINE_START(LS1021A, "Freescale LS1021A")
> +	.smp		= smp_ops(ls1021a_smp_ops),
> 	.dt_compat	= ls1021a_dt_compat,
> MACHINE_END
> diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c
> index 771bd25..69b87ca 100644
> --- a/arch/arm/mach-imx/platsmp.c
> +++ b/arch/arm/mach-imx/platsmp.c
> @@ -16,6 +16,8 @@
> #include <asm/page.h>
> #include <asm/smp_scu.h>
> #include <asm/mach/map.h>
> +#include <linux/of_address.h>
> +#include <linux/of.h>
> 
> #include "common.h"
> #include "hardware.h"
> @@ -94,3 +96,33 @@ struct smp_operations  imx_smp_ops __initdata = {
> 	.cpu_kill		= imx_cpu_kill,
> #endif
> };
> +
> +#define DCFG_CCSR_SCRATCHRW1	0x200
> +
> +static int ls1021a_boot_secondary(unsigned int cpu, struct task_struct *idle)
> +{
> +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));
> +
> +	return 0;
> +}
> +
> +static void __init ls1021a_smp_prepare_cpus(unsigned int max_cpus)
> +{
> +	struct device_node *np;
> +	void __iomem *dcfg_base;
> +	unsigned long paddr;
> +
> +	np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-dcfg");
> +	dcfg_base = of_iomap(np, 0);
> +	BUG_ON(!dcfg_base);
> +
> +	paddr = virt_to_phys(secondary_startup);
> +	writel_relaxed(cpu_to_be32(paddr), dcfg_base + DCFG_CCSR_SCRATCHRW1);
> +

This seems odd, why are we writing the startup address to DCFG_CCSR_SCRATCHRW1?

> +	iounmap(dcfg_base);
> +}
> +
> +struct smp_operations  ls1021a_smp_ops __initdata = {
> +	.smp_prepare_cpus	= ls1021a_smp_prepare_cpus,
> +	.smp_boot_secondary	= ls1021a_boot_secondary,
> +};
> -- 
> 1.8.0
> 

- k
Jingchang Lu Oct. 17, 2014, 10:10 a.m. UTC | #2
>-----Original Message-----
>From: Kumar Gala [mailto:galak@codeaurora.org]
>Sent: Thursday, October 16, 2014 10:31 PM
>To: Lu Jingchang-B35083
>Cc: shawn.guo@linaro.org; mark.rutland@arm.com; devicetree@vger.kernel.org;
>Lu Jingchang-B35083; linux-arm-kernel@lists.infradead.org; arnd@arndb.de
>Subject: Re: [PATCHv5 6/6] ARM: imx: Add Freescale LS1021A SMP support
>
>
>On Oct 13, 2014, at 11:36 AM, Jingchang Lu <jingchang.lu@freescale.com>
>wrote:
>
>> From: Jingchang Lu <b35083@freescale.com>
>>
>> Freescale LS1021A SoCs deploy two cortex-A7 processors, this adds
>> bring-up support for the secondary core.
>>
>> Signed-off-by: Jingchang Lu <b35083@freescale.com>
>> ---
>> arch/arm/mach-imx/Makefile       |  2 +-
>> arch/arm/mach-imx/common.h       |  1 +
>> arch/arm/mach-imx/mach-ls1021a.c |  1 +
>> arch/arm/mach-imx/platsmp.c      | 32 ++++++++++++++++++++++++++++++++
>> 4 files changed, 35 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
>> index ce137bc..38d75e2 100644
>> --- a/arch/arm/mach-imx/Makefile
>> +++ b/arch/arm/mach-imx/Makefile
>> @@ -89,7 +89,7 @@ obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o
>> obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
>> obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
>> obj-$(CONFIG_HAVE_IMX_SRC) += src.o
>> -ifdef CONFIG_SOC_IMX6
>> +ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),)
>> AFLAGS_headsmp.o :=-Wa,-march=armv7-a
>> obj-$(CONFIG_SMP) += headsmp.o platsmp.o
>> obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o diff --git
>> a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index
>> 1dabf43..c473ca5 100644
>> --- a/arch/arm/mach-imx/common.h
>> +++ b/arch/arm/mach-imx/common.h
>> @@ -157,5 +157,6 @@ static inline void imx_init_l2cache(void) {}
>> #endif
>>
>> extern struct smp_operations imx_smp_ops;
>> +extern struct smp_operations ls1021a_smp_ops;
>>
>> #endif
>> diff --git a/arch/arm/mach-imx/mach-ls1021a.c
>> b/arch/arm/mach-imx/mach-ls1021a.c
>> index 9d2034b..b89c858 100644
>> --- a/arch/arm/mach-imx/mach-ls1021a.c
>> +++ b/arch/arm/mach-imx/mach-ls1021a.c
>> @@ -17,5 +17,6 @@ static const char * const ls1021a_dt_compat[]
>> __initconst = { };
>>
>> DT_MACHINE_START(LS1021A, "Freescale LS1021A")
>> +	.smp		= smp_ops(ls1021a_smp_ops),
>> 	.dt_compat	= ls1021a_dt_compat,
>> MACHINE_END
>> diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c
>> index 771bd25..69b87ca 100644
>> --- a/arch/arm/mach-imx/platsmp.c
>> +++ b/arch/arm/mach-imx/platsmp.c
>> @@ -16,6 +16,8 @@
>> #include <asm/page.h>
>> #include <asm/smp_scu.h>
>> #include <asm/mach/map.h>
>> +#include <linux/of_address.h>
>> +#include <linux/of.h>
>>
>> #include "common.h"
>> #include "hardware.h"
>> @@ -94,3 +96,33 @@ struct smp_operations  imx_smp_ops __initdata = {
>> 	.cpu_kill		= imx_cpu_kill,
>> #endif
>> };
>> +
>> +#define DCFG_CCSR_SCRATCHRW1	0x200
>> +
>> +static int ls1021a_boot_secondary(unsigned int cpu, struct
>> +task_struct *idle) {
>> +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));
>> +
>> +	return 0;
>> +}
>> +
>> +static void __init ls1021a_smp_prepare_cpus(unsigned int max_cpus) {
>> +	struct device_node *np;
>> +	void __iomem *dcfg_base;
>> +	unsigned long paddr;
>> +
>> +	np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-dcfg");
>> +	dcfg_base = of_iomap(np, 0);
>> +	BUG_ON(!dcfg_base);
>> +
>> +	paddr = virt_to_phys(secondary_startup);
>> +	writel_relaxed(cpu_to_be32(paddr), dcfg_base +
>> +DCFG_CCSR_SCRATCHRW1);
>> +
>
>This seems odd, why are we writing the startup address to
>DCFG_CCSR_SCRATCHRW1?
It is the secondary cpu's executing address for smp kernel image, 
the secondary cpu will jump to this address after wakeup during
the smp initialization. Thanks.

Best Regards,
Jingchang
Kumar Gala Oct. 17, 2014, 12:27 p.m. UTC | #3
On Oct 17, 2014, at 12:10 PM, Jingchang Lu <jingchang.lu@freescale.com> wrote:

> 
> 
>> -----Original Message-----
>> From: Kumar Gala [mailto:galak@codeaurora.org]
>> Sent: Thursday, October 16, 2014 10:31 PM
>> To: Lu Jingchang-B35083
>> Cc: shawn.guo@linaro.org; mark.rutland@arm.com; devicetree@vger.kernel.org;
>> Lu Jingchang-B35083; linux-arm-kernel@lists.infradead.org; arnd@arndb.de
>> Subject: Re: [PATCHv5 6/6] ARM: imx: Add Freescale LS1021A SMP support
>> 
>> 
>> On Oct 13, 2014, at 11:36 AM, Jingchang Lu <jingchang.lu@freescale.com>
>> wrote:
>> 
>>> From: Jingchang Lu <b35083@freescale.com>
>>> 
>>> Freescale LS1021A SoCs deploy two cortex-A7 processors, this adds
>>> bring-up support for the secondary core.
>>> 
>>> Signed-off-by: Jingchang Lu <b35083@freescale.com>
>>> ---
>>> arch/arm/mach-imx/Makefile       |  2 +-
>>> arch/arm/mach-imx/common.h       |  1 +
>>> arch/arm/mach-imx/mach-ls1021a.c |  1 +
>>> arch/arm/mach-imx/platsmp.c      | 32 ++++++++++++++++++++++++++++++++
>>> 4 files changed, 35 insertions(+), 1 deletion(-)
>>> 
>>> diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
>>> index ce137bc..38d75e2 100644
>>> --- a/arch/arm/mach-imx/Makefile
>>> +++ b/arch/arm/mach-imx/Makefile
>>> @@ -89,7 +89,7 @@ obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o
>>> obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
>>> obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
>>> obj-$(CONFIG_HAVE_IMX_SRC) += src.o
>>> -ifdef CONFIG_SOC_IMX6
>>> +ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),)
>>> AFLAGS_headsmp.o :=-Wa,-march=armv7-a
>>> obj-$(CONFIG_SMP) += headsmp.o platsmp.o
>>> obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o diff --git
>>> a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index
>>> 1dabf43..c473ca5 100644
>>> --- a/arch/arm/mach-imx/common.h
>>> +++ b/arch/arm/mach-imx/common.h
>>> @@ -157,5 +157,6 @@ static inline void imx_init_l2cache(void) {}
>>> #endif
>>> 
>>> extern struct smp_operations imx_smp_ops;
>>> +extern struct smp_operations ls1021a_smp_ops;
>>> 
>>> #endif
>>> diff --git a/arch/arm/mach-imx/mach-ls1021a.c
>>> b/arch/arm/mach-imx/mach-ls1021a.c
>>> index 9d2034b..b89c858 100644
>>> --- a/arch/arm/mach-imx/mach-ls1021a.c
>>> +++ b/arch/arm/mach-imx/mach-ls1021a.c
>>> @@ -17,5 +17,6 @@ static const char * const ls1021a_dt_compat[]
>>> __initconst = { };
>>> 
>>> DT_MACHINE_START(LS1021A, "Freescale LS1021A")
>>> +	.smp		= smp_ops(ls1021a_smp_ops),
>>> 	.dt_compat	= ls1021a_dt_compat,
>>> MACHINE_END
>>> diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c
>>> index 771bd25..69b87ca 100644
>>> --- a/arch/arm/mach-imx/platsmp.c
>>> +++ b/arch/arm/mach-imx/platsmp.c
>>> @@ -16,6 +16,8 @@
>>> #include <asm/page.h>
>>> #include <asm/smp_scu.h>
>>> #include <asm/mach/map.h>
>>> +#include <linux/of_address.h>
>>> +#include <linux/of.h>
>>> 
>>> #include "common.h"
>>> #include "hardware.h"
>>> @@ -94,3 +96,33 @@ struct smp_operations  imx_smp_ops __initdata = {
>>> 	.cpu_kill		= imx_cpu_kill,
>>> #endif
>>> };
>>> +
>>> +#define DCFG_CCSR_SCRATCHRW1	0x200
>>> +
>>> +static int ls1021a_boot_secondary(unsigned int cpu, struct
>>> +task_struct *idle) {
>>> +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +static void __init ls1021a_smp_prepare_cpus(unsigned int max_cpus) {
>>> +	struct device_node *np;
>>> +	void __iomem *dcfg_base;
>>> +	unsigned long paddr;
>>> +
>>> +	np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-dcfg");
>>> +	dcfg_base = of_iomap(np, 0);
>>> +	BUG_ON(!dcfg_base);
>>> +
>>> +	paddr = virt_to_phys(secondary_startup);
>>> +	writel_relaxed(cpu_to_be32(paddr), dcfg_base +
>>> +DCFG_CCSR_SCRATCHRW1);
>>> +
>> 
>> This seems odd, why are we writing the startup address to
>> DCFG_CCSR_SCRATCHRW1?
> It is the secondary cpu's executing address for smp kernel image, 
> the secondary cpu will jump to this address after wakeup during
> the smp initialization. Thanks.

Is that a convention spec’d by HW or SW?

- k
Shawn Guo Oct. 19, 2014, 2:19 a.m. UTC | #4
On Mon, Oct 13, 2014 at 05:36:03PM +0800, Jingchang Lu wrote:
> diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c
> index 771bd25..69b87ca 100644
> --- a/arch/arm/mach-imx/platsmp.c
> +++ b/arch/arm/mach-imx/platsmp.c
> @@ -16,6 +16,8 @@
>  #include <asm/page.h>
>  #include <asm/smp_scu.h>
>  #include <asm/mach/map.h>
> +#include <linux/of_address.h>
> +#include <linux/of.h>

Please group the headers into <linux/*> and sort them alphabetically.

Shawn

>  
>  #include "common.h"
>  #include "hardware.h"
Jingchang Lu Oct. 20, 2014, 11:34 a.m. UTC | #5
>-----Original Message-----

>From: Kumar Gala [mailto:galak@codeaurora.org]

>Sent: Friday, October 17, 2014 8:27 PM

>To: Lu Jingchang-B35083

>Cc: shawn.guo@linaro.org; mark.rutland@arm.com; devicetree@vger.kernel.org;

>linux-arm-kernel@lists.infradead.org; arnd@arndb.de

>Subject: Re: [PATCHv5 6/6] ARM: imx: Add Freescale LS1021A SMP support

>

>

>On Oct 17, 2014, at 12:10 PM, Jingchang Lu <jingchang.lu@freescale.com>

>wrote:

>

>>

>>

>>> -----Original Message-----

>>> From: Kumar Gala [mailto:galak@codeaurora.org]

>>> Sent: Thursday, October 16, 2014 10:31 PM

>>> To: Lu Jingchang-B35083

>>> Cc: shawn.guo@linaro.org; mark.rutland@arm.com;

>>> devicetree@vger.kernel.org; Lu Jingchang-B35083;

>>> linux-arm-kernel@lists.infradead.org; arnd@arndb.de

>>> Subject: Re: [PATCHv5 6/6] ARM: imx: Add Freescale LS1021A SMP

>>> support

>>>

>>>

>>> On Oct 13, 2014, at 11:36 AM, Jingchang Lu

>>> <jingchang.lu@freescale.com>

>>> wrote:

>>>

>>>> From: Jingchang Lu <b35083@freescale.com>

>>>>

>>>> Freescale LS1021A SoCs deploy two cortex-A7 processors, this adds

>>>> bring-up support for the secondary core.

>>>>

>>>> Signed-off-by: Jingchang Lu <b35083@freescale.com>

>>>> ---

>>>> arch/arm/mach-imx/Makefile       |  2 +-

>>>> arch/arm/mach-imx/common.h       |  1 +

>>>> arch/arm/mach-imx/mach-ls1021a.c |  1 +

>>>> arch/arm/mach-imx/platsmp.c      | 32 ++++++++++++++++++++++++++++++++

>>>> 4 files changed, 35 insertions(+), 1 deletion(-)

>>>>

>>>> diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile

>>>> index ce137bc..38d75e2 100644

>>>> --- a/arch/arm/mach-imx/Makefile

>>>> +++ b/arch/arm/mach-imx/Makefile

>>>> @@ -89,7 +89,7 @@ obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o

>>>> obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o

>>>> obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o

>>>> obj-$(CONFIG_HAVE_IMX_SRC) += src.o

>>>> -ifdef CONFIG_SOC_IMX6

>>>> +ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),)

>>>> AFLAGS_headsmp.o :=-Wa,-march=armv7-a

>>>> obj-$(CONFIG_SMP) += headsmp.o platsmp.o

>>>> obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o diff --git

>>>> a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index

>>>> 1dabf43..c473ca5 100644

>>>> --- a/arch/arm/mach-imx/common.h

>>>> +++ b/arch/arm/mach-imx/common.h

>>>> @@ -157,5 +157,6 @@ static inline void imx_init_l2cache(void) {}

>>>> #endif

>>>>

>>>> extern struct smp_operations imx_smp_ops;

>>>> +extern struct smp_operations ls1021a_smp_ops;

>>>>

>>>> #endif

>>>> diff --git a/arch/arm/mach-imx/mach-ls1021a.c

>>>> b/arch/arm/mach-imx/mach-ls1021a.c

>>>> index 9d2034b..b89c858 100644

>>>> --- a/arch/arm/mach-imx/mach-ls1021a.c

>>>> +++ b/arch/arm/mach-imx/mach-ls1021a.c

>>>> @@ -17,5 +17,6 @@ static const char * const ls1021a_dt_compat[]

>>>> __initconst = { };

>>>>

>>>> DT_MACHINE_START(LS1021A, "Freescale LS1021A")

>>>> +	.smp		= smp_ops(ls1021a_smp_ops),

>>>> 	.dt_compat	= ls1021a_dt_compat,

>>>> MACHINE_END

>>>> diff --git a/arch/arm/mach-imx/platsmp.c

>>>> b/arch/arm/mach-imx/platsmp.c index 771bd25..69b87ca 100644

>>>> --- a/arch/arm/mach-imx/platsmp.c

>>>> +++ b/arch/arm/mach-imx/platsmp.c

>>>> @@ -16,6 +16,8 @@

>>>> #include <asm/page.h>

>>>> #include <asm/smp_scu.h>

>>>> #include <asm/mach/map.h>

>>>> +#include <linux/of_address.h>

>>>> +#include <linux/of.h>

>>>>

>>>> #include "common.h"

>>>> #include "hardware.h"

>>>> @@ -94,3 +96,33 @@ struct smp_operations  imx_smp_ops __initdata = {

>>>> 	.cpu_kill		= imx_cpu_kill,

>>>> #endif

>>>> };

>>>> +

>>>> +#define DCFG_CCSR_SCRATCHRW1	0x200

>>>> +

>>>> +static int ls1021a_boot_secondary(unsigned int cpu, struct

>>>> +task_struct *idle) {

>>>> +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));

>>>> +

>>>> +	return 0;

>>>> +}

>>>> +

>>>> +static void __init ls1021a_smp_prepare_cpus(unsigned int max_cpus) {

>>>> +	struct device_node *np;

>>>> +	void __iomem *dcfg_base;

>>>> +	unsigned long paddr;

>>>> +

>>>> +	np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-dcfg");

>>>> +	dcfg_base = of_iomap(np, 0);

>>>> +	BUG_ON(!dcfg_base);

>>>> +

>>>> +	paddr = virt_to_phys(secondary_startup);

>>>> +	writel_relaxed(cpu_to_be32(paddr), dcfg_base +

>>>> +DCFG_CCSR_SCRATCHRW1);

>>>> +

>>>

>>> This seems odd, why are we writing the startup address to

>>> DCFG_CCSR_SCRATCHRW1?

>> It is the secondary cpu's executing address for smp kernel image, the

>> secondary cpu will jump to this address after wakeup during the smp

>> initialization. Thanks.

>

>Is that a convention spec’d by HW or SW?

One is bootrom's convention, thanks.

Best Regards
Jinghcang
>

>- k

>--

>Qualcomm Innovation Center, Inc.

>The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,

>a Linux Foundation Collaborative Project
diff mbox

Patch

diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index ce137bc..38d75e2 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -89,7 +89,7 @@  obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o
 obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
 obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
 obj-$(CONFIG_HAVE_IMX_SRC) += src.o
-ifdef CONFIG_SOC_IMX6
+ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),)
 AFLAGS_headsmp.o :=-Wa,-march=armv7-a
 obj-$(CONFIG_SMP) += headsmp.o platsmp.o
 obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h
index 1dabf43..c473ca5 100644
--- a/arch/arm/mach-imx/common.h
+++ b/arch/arm/mach-imx/common.h
@@ -157,5 +157,6 @@  static inline void imx_init_l2cache(void) {}
 #endif
 
 extern struct smp_operations imx_smp_ops;
+extern struct smp_operations ls1021a_smp_ops;
 
 #endif
diff --git a/arch/arm/mach-imx/mach-ls1021a.c b/arch/arm/mach-imx/mach-ls1021a.c
index 9d2034b..b89c858 100644
--- a/arch/arm/mach-imx/mach-ls1021a.c
+++ b/arch/arm/mach-imx/mach-ls1021a.c
@@ -17,5 +17,6 @@  static const char * const ls1021a_dt_compat[] __initconst = {
 };
 
 DT_MACHINE_START(LS1021A, "Freescale LS1021A")
+	.smp		= smp_ops(ls1021a_smp_ops),
 	.dt_compat	= ls1021a_dt_compat,
 MACHINE_END
diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c
index 771bd25..69b87ca 100644
--- a/arch/arm/mach-imx/platsmp.c
+++ b/arch/arm/mach-imx/platsmp.c
@@ -16,6 +16,8 @@ 
 #include <asm/page.h>
 #include <asm/smp_scu.h>
 #include <asm/mach/map.h>
+#include <linux/of_address.h>
+#include <linux/of.h>
 
 #include "common.h"
 #include "hardware.h"
@@ -94,3 +96,33 @@  struct smp_operations  imx_smp_ops __initdata = {
 	.cpu_kill		= imx_cpu_kill,
 #endif
 };
+
+#define DCFG_CCSR_SCRATCHRW1	0x200
+
+static int ls1021a_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+	arch_send_wakeup_ipi_mask(cpumask_of(cpu));
+
+	return 0;
+}
+
+static void __init ls1021a_smp_prepare_cpus(unsigned int max_cpus)
+{
+	struct device_node *np;
+	void __iomem *dcfg_base;
+	unsigned long paddr;
+
+	np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-dcfg");
+	dcfg_base = of_iomap(np, 0);
+	BUG_ON(!dcfg_base);
+
+	paddr = virt_to_phys(secondary_startup);
+	writel_relaxed(cpu_to_be32(paddr), dcfg_base + DCFG_CCSR_SCRATCHRW1);
+
+	iounmap(dcfg_base);
+}
+
+struct smp_operations  ls1021a_smp_ops __initdata = {
+	.smp_prepare_cpus	= ls1021a_smp_prepare_cpus,
+	.smp_boot_secondary	= ls1021a_boot_secondary,
+};