[U-Boot] [PATCH 01/15] ARM: PSCI: Split out common stack setup code from psci_arch_init

Hongbo Zhang macro.wave.z at gmail.com
Fri Jul 1 12:25:34 CEST 2016


Tested-by: Hongbo Zhang <hongbo.zhang at nxp.com>

On Sun, Jun 19, 2016 at 12:38 PM, Chen-Yu Tsai <wens at csie.org> wrote:
> Every platform has the same stack setup code in assembly as part of
> psci_arch_init.
>
> Move this out into a common separate function, psci_stack_setup, for
> all platforms. This will allow us to move the remaining parts of
> psci_arch_init into C code, or drop it entirely.
>
> Also provide a stub no-op psci_arch_init for platforms that don't need
> their own specific setup code.
>
> Signed-off-by: Chen-Yu Tsai <wens at csie.org>
> ---
>  arch/arm/cpu/armv7/ls102xa/psci.S    | 10 ----------
>  arch/arm/cpu/armv7/mx7/psci.S        | 16 ----------------
>  arch/arm/cpu/armv7/nonsec_virt.S     |  7 ++++++-
>  arch/arm/cpu/armv7/psci.S            | 18 ++++++++++++++++++
>  arch/arm/cpu/armv7/sunxi/psci_head.S | 16 +---------------
>  arch/arm/mach-tegra/psci.S           |  3 ---
>  6 files changed, 25 insertions(+), 45 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/ls102xa/psci.S b/arch/arm/cpu/armv7/ls102xa/psci.S
> index cf5cd48bcbec..86116e1fcc65 100644
> --- a/arch/arm/cpu/armv7/ls102xa/psci.S
> +++ b/arch/arm/cpu/armv7/ls102xa/psci.S
> @@ -111,16 +111,6 @@ psci_cpu_off:
>  1:     wfi
>         b       1b
>
> -.globl psci_arch_init
> -psci_arch_init:
> -       mov     r6, lr
> -
> -       bl      psci_get_cpu_id
> -       bl      psci_get_cpu_stack_top
> -       mov     sp, r0
> -
> -       bx      r6
> -
>         .globl psci_text_end
>  psci_text_end:
>         .popsection
> diff --git a/arch/arm/cpu/armv7/mx7/psci.S b/arch/arm/cpu/armv7/mx7/psci.S
> index 34c6ab33f058..12cca7cc6deb 100644
> --- a/arch/arm/cpu/armv7/mx7/psci.S
> +++ b/arch/arm/cpu/armv7/mx7/psci.S
> @@ -9,22 +9,6 @@
>
>         .arch_extension sec
>
> -       @ r1 = target CPU
> -       @ r2 = target PC
> -
> -.globl psci_arch_init
> -psci_arch_init:
> -       mov     r6, lr
> -
> -       bl      psci_get_cpu_id
> -       bl      psci_get_cpu_stack_top
> -       mov     sp, r0
> -
> -       bx      r6
> -
> -       @ r1 = target CPU
> -       @ r2 = target PC
> -
>  .globl psci_cpu_on
>  psci_cpu_on:
>         push    {lr}
> diff --git a/arch/arm/cpu/armv7/nonsec_virt.S b/arch/arm/cpu/armv7/nonsec_virt.S
> index b7563edbe6bc..95ce9387b83e 100644
> --- a/arch/arm/cpu/armv7/nonsec_virt.S
> +++ b/arch/arm/cpu/armv7/nonsec_virt.S
> @@ -49,8 +49,13 @@ _secure_monitor:
>         mcr     p15, 0, r5, c12, c0, 1
>         isb
>
> -       @ Obtain a secure stack, and configure the PSCI backend
> +       @ Obtain a secure stack
> +       bl      psci_stack_setup
> +
> +       @ Configure the PSCI backend
> +       push    {r0, r1, r2, ip}
>         bl      psci_arch_init
> +       pop     {r0, r1, r2, ip}
>  #endif
>
>  #ifdef CONFIG_ARM_ERRATA_773022
> diff --git a/arch/arm/cpu/armv7/psci.S b/arch/arm/cpu/armv7/psci.S
> index ab408378fcae..46fcf770c214 100644
> --- a/arch/arm/cpu/armv7/psci.S
> +++ b/arch/arm/cpu/armv7/psci.S
> @@ -211,6 +211,24 @@ ENTRY(psci_get_cpu_stack_top)
>         bx      lr
>  ENDPROC(psci_get_cpu_stack_top)
>
> +@ {r0, r1, r2, ip} from _do_nonsec_entry(kernel_entry, 0, machid, r2) in
> +@ arch/arm/lib/bootm.c:boot_jump_linux() must remain unchanged across
> +@ this function.
> +ENTRY(psci_stack_setup)
> +       mov     r6, lr
> +       mov     r7, r0
> +       bl      psci_get_cpu_id         @ CPU ID => r0
> +       bl      psci_get_cpu_stack_top  @ stack top => r0
> +       mov     sp, r0
> +       mov     r0, r7
> +       bx      r6
> +ENDPROC(psci_stack_setup)
> +
> +ENTRY(psci_arch_init)
> +       mov     pc, lr
> +ENDPROC(psci_arch_init)
> +.weak psci_arch_init
> +
>  ENTRY(psci_cpu_entry)
>         bl      psci_enable_smp
>
> diff --git a/arch/arm/cpu/armv7/sunxi/psci_head.S b/arch/arm/cpu/armv7/sunxi/psci_head.S
> index 8fa823d1df3a..e51db04cf1e2 100644
> --- a/arch/arm/cpu/armv7/sunxi/psci_head.S
> +++ b/arch/arm/cpu/armv7/sunxi/psci_head.S
> @@ -44,22 +44,8 @@
>  #define        GICD_BASE               (SUNXI_GIC400_BASE +  0x1000)
>  #define        GICC_BASE               (SUNXI_GIC400_BASE +  0x2000)
>
> -@ {r0, r1, r2, ip} from _do_nonsec_entry(kernel_entry, 0, machid, r2) in
> -@ arch/arm/lib/bootm.c:boot_jump_linux() must remain unchanged across
> -@ this function.
>  ENTRY(psci_arch_init)
> -       mov     r6, lr
> -       mov     r7, r0
> -       bl      psci_get_cpu_id         @ CPU ID => r0
> -       bl      psci_get_cpu_stack_top  @ stack top => r0
> -       sub     r0, r0, #4              @ Save space for target PC
> -       mov     sp, r0
> -       mov     r0, r7
> -       mov     lr, r6
> -
> -       push    {r0, r1, r2, ip, lr}
> -       bl      sunxi_gic_init
> -       pop     {r0, r1, r2, ip, pc}
> +       b       sunxi_gic_init
>  ENDPROC(psci_arch_init)
>
>  ENTRY(psci_text_end)
> diff --git a/arch/arm/mach-tegra/psci.S b/arch/arm/mach-tegra/psci.S
> index b836da1c0ed7..75068f34c052 100644
> --- a/arch/arm/mach-tegra/psci.S
> +++ b/arch/arm/mach-tegra/psci.S
> @@ -61,9 +61,6 @@ ENTRY(psci_arch_init)
>         ldrne   r7, [r5]
>         mcrne   p15, 0, r7, c14, c0, 0  @ write CNTFRQ to CPU1..3
>
> -       bl      psci_get_cpu_stack_top  @ stack top => r0
> -       mov     sp, r0
> -
>         bx      r6
>  ENDPROC(psci_arch_init)
>
> --
> 2.8.1
>


More information about the U-Boot mailing list