rockchip: back-to-bootrom: add 'back-to-bootrom' support for AArch64
authorPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Thu, 22 Jun 2017 22:05:38 +0000 (00:05 +0200)
committerPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Sun, 13 Aug 2017 15:12:19 +0000 (17:12 +0200)
The back-to-bootrom support for Rockchip is equivalent to an
(assembly) implementation of setjmp/longjmp (i.e. it saves the
stack-pointer, link-register and callee-saved registers). Up until
now, this had only been implemented for AArch32 (i.e. ARMv7 or older),
which puts the new ARMv8 devices (which boot in AArch64 mode) at a
slight disadvantage.

To allow use of the 'back-to-bootrom' feature on new devices (e.g. the
RK3368), this commit adds an implementation for AArch64.

Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Tom Rini <trini@konsulko.com>
arch/arm/mach-rockchip/save_boot_param.S

index 5e6c8db..50fce20 100644 (file)
@@ -1,11 +1,47 @@
 /*
  * (C) Copyright 2016 Rockchip Electronics Co., Ltd
+ * (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH
  *
  * SPDX-License-Identifier:     GPL-2.0+
  */
 
 #include <linux/linkage.h>
 
+#if defined(CONFIG_ARM64)
+.globl SAVE_SP_ADDR
+SAVE_SP_ADDR:
+       .quad 0
+
+ENTRY(save_boot_params)
+       sub     sp, sp, #0x60
+       stp     x29, x30, [sp, #0x50]
+       stp     x27, x28, [sp, #0x40]
+       stp     x25, x26, [sp, #0x30]
+       stp     x23, x24, [sp, #0x20]
+       stp     x21, x22, [sp, #0x10]
+       stp     x19, x20, [sp, #0]
+       ldr     x8, =SAVE_SP_ADDR
+       mov     x9, sp
+       str     x9, [x8]
+       b       save_boot_params_ret  /* back to my caller */
+ENDPROC(save_boot_params)
+
+.globl _back_to_bootrom_s
+ENTRY(_back_to_bootrom_s)
+       ldr     x0, =SAVE_SP_ADDR
+       ldr     x0, [x0]
+       mov     sp, x0
+       ldp     x29, x30, [sp, #0x50]
+       ldp     x27, x28, [sp, #0x40]
+       ldp     x25, x26, [sp, #0x30]
+       ldp     x23, x24, [sp, #0x20]
+       ldp     x21, x22, [sp, #0x10]
+       ldp     x19, x20, [sp]
+       add     sp, sp, #0x60
+       mov     x0, xzr
+       ret
+ENDPROC(_back_to_bootrom_s)
+#else
 .globl SAVE_SP_ADDR
 SAVE_SP_ADDR:
        .word 0
@@ -30,3 +66,4 @@ ENTRY(_back_to_bootrom_s)
        mov     r0, #0
        pop     {r1-r12, pc}
 ENDPROC(_back_to_bootrom_s)
+#endif