Since I added system suspend/resume based on this patch, so I send out the 
patch set of system suspend resume including this patch, so you can ignore this 
thread and just review the patch set (4 patches), thanks.

Sent [PATCH 1/4] mx7: psci: add cpu hotplug support
Sent [PATCH 2/4] imx: mx7: add gpc initialization for low power mode
Sent [PATCH 3/4] imx: mx7: add system suspend/resume support
Sent [PATCH 4/4] imx: mx7: add psci_features support

Anson Huang
Best Regards!


> -----Original Message-----
> From: Anson Huang
> Sent: Friday, May 25, 2018 2:11 PM
> To: sba...@denx.de; Fabio Estevam <fabio.este...@nxp.com>;
> albert.u.b...@aribaud.net; christian.gmei...@gmail.com; Peng Fan
> <peng....@nxp.com>; patrick.delau...@st.com
> Cc: dl-linux-imx <linux-...@nxp.com>; u-boot@lists.denx.de
> Subject: [PATCH] mx7: psci: add cpu hotplug support
> 
> This patch adds cpu hotplug support, previous imx_cpu_off implementation is
> NOT safe, a CPU can NOT power down itself in runtime, it will cause system bus
> hang due to pending transaction. So need to use other online CPU to kill it 
> when
> it is ready for killed.
> 
> Here use SRC parameter register and a magic number of ~0 as handshake for
> killing a offline CPU, when the online CPU checks the psci_affinity_info, it 
> will
> help kill the offline CPU according to the magic number stored in SRC
> parameter register.
> 
> Signed-off-by: Anson Huang <anson.hu...@nxp.com>
> ---
>  arch/arm/mach-imx/mx7/psci-mx7.c | 31
> ++++++++++++++++++++++++++++---
>  arch/arm/mach-imx/mx7/psci.S     | 14 ++++++++++++++
>  2 files changed, 42 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm/mach-imx/mx7/psci-mx7.c
> b/arch/arm/mach-imx/mx7/psci-mx7.c
> index 7dc49bd..6f69fd3 100644
> --- a/arch/arm/mach-imx/mx7/psci-mx7.c
> +++ b/arch/arm/mach-imx/mx7/psci-mx7.c
> @@ -77,12 +77,37 @@ __secure int imx_cpu_on(int fn, int cpu, int pc)
> 
>  __secure int imx_cpu_off(int cpu)
>  {
> -     imx_enable_cpu_ca7(cpu, false);
> -     imx_gpcv2_set_core1_power(false);
> -     writel(0, SRC_BASE_ADDR + cpu * 8 + SRC_GPR1_MX7D + 4);
> +     /*
> +      * We use the cpu jumping argument register to sync with
> +      * imx_cpu_affinity() which is running on cpu0 to kill the cpu.
> +      */
> +     writel(~0, SRC_BASE_ADDR + cpu * 8 + SRC_GPR1_MX7D + 4);
> +
>       return 0;
>  }
> 
> +__secure int imx_cpu_affinity(int cpu)
> +{
> +     u32 val;
> +
> +     /* always ON for CPU0 */
> +     if (cpu == 0)
> +             return PSCI_AFFINITY_LEVEL_ON;
> +
> +     /* CPU1 is waiting for killed */
> +     if (readl(SRC_BASE_ADDR + cpu * 8 + SRC_GPR1_MX7D + 4) == ~0) {
> +             imx_enable_cpu_ca7(cpu, false);
> +             imx_gpcv2_set_core1_power(false);
> +             writel(0, SRC_BASE_ADDR + cpu * 8 + SRC_GPR1_MX7D + 4);
> +             return PSCI_AFFINITY_LEVEL_OFF;
> +     }
> +
> +     val = readl(SRC_BASE_ADDR + SRC_A7RCR1) &
> +             (1 << BP_SRC_A7RCR1_A7_CORE1_ENABLE);
> +
> +     return  val ? PSCI_AFFINITY_LEVEL_ON : PSCI_AFFINITY_LEVEL_OFF; }
> +
>  __secure void imx_system_reset(void)
>  {
>       struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR; diff
> --git a/arch/arm/mach-imx/mx7/psci.S b/arch/arm/mach-imx/mx7/psci.S index
> 89dcf88..d6d19d5 100644
> --- a/arch/arm/mach-imx/mx7/psci.S
> +++ b/arch/arm/mach-imx/mx7/psci.S
> @@ -57,4 +57,18 @@ psci_system_off:
>  3:   wfi
>       b 3b
> 
> +.globl       psci_affinity_info
> +psci_affinity_info:
> +     push    {lr}
> +
> +     mov     r0, #ARM_PSCI_RET_INVAL
> +     cmp     r2, #0
> +     bne     out_affinity
> +
> +     and     r0, r1, #0xff
> +     bl      imx_cpu_affinity
> +
> +out_affinity:
> +     pop     {pc}
> +
>       .popsection
> --
> 2.7.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to