[U-Boot] [PATCH] mx7: psci: add cpu hotplug support

Anson Huang anson.huang at nxp.com
Mon May 28 06:23:22 UTC 2018


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: sbabic at denx.de; Fabio Estevam <fabio.estevam at nxp.com>;
> albert.u.boot at aribaud.net; christian.gmeiner at gmail.com; Peng Fan
> <peng.fan at nxp.com>; patrick.delaunay at st.com
> Cc: dl-linux-imx <linux-imx at nxp.com>; u-boot at 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.Huang at 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



More information about the U-Boot mailing list