
Add entry points for saving the state of the machine at entry from the Boot ROM and for restoring the state before a return.
Note that this needs some fixup before it's useful, so I'm forwarding it as an RFC to solicit advice.
This placeholder is little more than a setjmp/longjmp that saves the SP, LR and registers 0-9. Disassembling the ROM for i.MX6DL and i.MX6SL shows that these are the only registers used by the ROM on those SOCs.
Signed-off-by: Eric Nelson eric@nelint.com --- arch/arm/cpu/armv7/mx6/Makefile | 2 +- arch/arm/cpu/armv7/mx6/ddr.c | 4 ++++ arch/arm/cpu/armv7/mx6/plugin-utils.S | 24 ++++++++++++++++++++++++ arch/arm/include/asm/arch-mx6/mx6-ddr.h | 19 +++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 arch/arm/cpu/armv7/mx6/plugin-utils.S
diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile index 8af191d..d0d0103 100644 --- a/arch/arm/cpu/armv7/mx6/Makefile +++ b/arch/arm/cpu/armv7/mx6/Makefile @@ -8,5 +8,5 @@ #
obj-y := soc.o clock.o -obj-$(CONFIG_SPL_BUILD) += ddr.o +obj-$(CONFIG_SPL_BUILD) += ddr.o plugin-utils.o obj-$(CONFIG_MP) += mp.o diff --git a/arch/arm/cpu/armv7/mx6/ddr.c b/arch/arm/cpu/armv7/mx6/ddr.c index 0cf391e..7f8e30d 100644 --- a/arch/arm/cpu/armv7/mx6/ddr.c +++ b/arch/arm/cpu/armv7/mx6/ddr.c @@ -1536,3 +1536,7 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *sysinfo, hang(); } } + +#ifdef CONFIG_SPL_BUILD +struct plugin_state plugin_state __attribute__((section(".data"))); +#endif diff --git a/arch/arm/cpu/armv7/mx6/plugin-utils.S b/arch/arm/cpu/armv7/mx6/plugin-utils.S new file mode 100644 index 0000000..c284a76 --- /dev/null +++ b/arch/arm/cpu/armv7/mx6/plugin-utils.S @@ -0,0 +1,24 @@ +/* + * Utility functions for executing as an i.MX plugin + * + * Copyright (c) 2016 Nelson Integration, LLC + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <asm-offsets.h> +#include <config.h> +#include <asm/system.h> +#include <linux/linkage.h> + +ENTRY(save_boot_params) + ldr r10, =plugin_state + stmia r10, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, fp, sp, lr} + b save_boot_params_ret +ENDPROC(save_boot_params) + +ENTRY(return_to_rom) + ldr r10, =plugin_state + ldmia r10, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, fp, sp, lr} + bx lr +ENDPROC(return_to_rom) diff --git a/arch/arm/include/asm/arch-mx6/mx6-ddr.h b/arch/arm/include/asm/arch-mx6/mx6-ddr.h index 2a8d443..52420da 100644 --- a/arch/arm/include/asm/arch-mx6/mx6-ddr.h +++ b/arch/arm/include/asm/arch-mx6/mx6-ddr.h @@ -528,4 +528,23 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *, #define MX6_MMDC_P1_MPZQLP2CTL 0x021b485C #define MX6_MMDC_P1_MPMUR0 0x021b48b8
+#ifdef CONFIG_SPL_BUILD +struct plugin_state { + uint32_t r0; + uint32_t r1; + uint32_t r2; + uint32_t r3; + uint32_t r4; + uint32_t r5; + uint32_t r6; + uint32_t r7; + uint32_t r8; + uint32_t r9; + uint32_t fp; + uint32_t sp; + uint32_t lr; +}; +void return_to_rom(void); +#endif + #endif /*__ASM_ARCH_MX6_DDR_H__ */