Commit 6aead233 authored by Peng Fan's avatar Peng Fan Committed by Stefano Babic
Browse files

imx: imx8qm/qxp: Recover SPL data section for partition reboot



When doing partition reboot, the boot image won't be reloaded by ROM,
it is just CPU reset to boot entry. The SW has to keep the boot image
inside the RAM unchanged. It includes both the TEXT section and DATA
section.

For SPL, the problem is DATA section will be updated at runtime, so in
next partition reboot the data is not same as the initial value from
cold boot. If any code depends on the initial value, then it will have
problem.

This patch introduces a mechanism to recover the data section
for partition reboot. It adds a new section in image for saving
data section. When from cold boot, the data section will be saved
to that new section at SPL early phase. When from partition reboot,
the data section will be restored from the new section.
Signed-off-by: default avatarYe Li <ye.li@nxp.com>
Signed-off-by: default avatarPeng Fan <peng.fan@nxp.com>
parent 231401de
...@@ -76,6 +76,12 @@ config SPL_ARMV8_SEC_FIRMWARE_SUPPORT ...@@ -76,6 +76,12 @@ config SPL_ARMV8_SEC_FIRMWARE_SUPPORT
help help
Say Y here to support this framework in SPL phase. Say Y here to support this framework in SPL phase.
config SPL_RECOVER_DATA_SECTION
bool "save/restore SPL data section"
help
Say Y here to save SPL data section for cold boot, and restore
at warm boot in SPL phase.
config SEC_FIRMWARE_ARMV8_PSCI config SEC_FIRMWARE_ARMV8_PSCI
bool "PSCI implementation in secure monitor firmware" bool "PSCI implementation in secure monitor firmware"
depends on ARMV8_SEC_FIRMWARE_SUPPORT || SPL_ARMV8_SEC_FIRMWARE_SUPPORT depends on ARMV8_SEC_FIRMWARE_SUPPORT || SPL_ARMV8_SEC_FIRMWARE_SUPPORT
......
...@@ -30,6 +30,10 @@ obj-$(CONFIG_ARMV8_SPIN_TABLE) += spin_table.o spin_table_v8.o ...@@ -30,6 +30,10 @@ obj-$(CONFIG_ARMV8_SPIN_TABLE) += spin_table.o spin_table_v8.o
endif endif
obj-$(CONFIG_$(SPL_)ARMV8_SEC_FIRMWARE_SUPPORT) += sec_firmware.o sec_firmware_asm.o obj-$(CONFIG_$(SPL_)ARMV8_SEC_FIRMWARE_SUPPORT) += sec_firmware.o sec_firmware_asm.o
ifdef CONFIG_SPL_BUILD
obj-$(CONFIG_SPL_RECOVER_DATA_SECTION) += spl_data.o
endif
obj-$(CONFIG_FSL_LAYERSCAPE) += fsl-layerscape/ obj-$(CONFIG_FSL_LAYERSCAPE) += fsl-layerscape/
obj-$(CONFIG_S32V234) += s32v234/ obj-$(CONFIG_S32V234) += s32v234/
obj-$(CONFIG_TARGET_HIKEY) += hisilicon/ obj-$(CONFIG_TARGET_HIKEY) += hisilicon/
......
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright 2020 NXP
*/
#include <common.h>
#include <spl.h>
char __data_save_start[0] __section(.__data_save_start);
char __data_save_end[0] __section(.__data_save_end);
u32 cold_reboot_flag = 1;
void spl_save_restore_data(void)
{
u32 data_size = __data_save_end - __data_save_start;
if (cold_reboot_flag == 1) {
/* Save data section to data_save section */
memcpy(__data_save_start, __data_save_start - data_size,
data_size);
} else {
/* Restore the data_save section to data section */
memcpy(__data_save_start - data_size, __data_save_start,
data_size);
}
cold_reboot_flag++;
}
...@@ -38,6 +38,14 @@ SECTIONS ...@@ -38,6 +38,14 @@ SECTIONS
*(.data*) *(.data*)
} >.sram } >.sram
#ifdef CONFIG_SPL_RECOVER_DATA_SECTION
.data_save : {
*(.__data_save_start)
. = SIZEOF(.data);
*(.__data_save_end)
} >.sram
#endif
.u_boot_list : { .u_boot_list : {
. = ALIGN(8); . = ALIGN(8);
KEEP(*(SORT(.u_boot_list*))); KEEP(*(SORT(.u_boot_list*)));
......
...@@ -18,11 +18,13 @@ config MU_BASE_SPL ...@@ -18,11 +18,13 @@ config MU_BASE_SPL
config IMX8QM config IMX8QM
select IMX8 select IMX8
select SUPPORT_SPL select SUPPORT_SPL
select SPL_RECOVER_DATA_SECTION
bool bool
config IMX8QXP config IMX8QXP
select IMX8 select IMX8
select SUPPORT_SPL select SUPPORT_SPL
select SPL_RECOVER_DATA_SECTION
bool bool
config SYS_SOC config SYS_SOC
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <dm/lists.h> #include <dm/lists.h>
#include <dm/uclass.h> #include <dm/uclass.h>
#include <errno.h> #include <errno.h>
#include <spl.h>
#include <thermal.h> #include <thermal.h>
#include <asm/arch/sci/sci.h> #include <asm/arch/sci/sci.h>
#include <asm/arch/sys_proto.h> #include <asm/arch/sys_proto.h>
...@@ -39,6 +40,10 @@ struct pass_over_info_t *get_pass_over_info(void) ...@@ -39,6 +40,10 @@ struct pass_over_info_t *get_pass_over_info(void)
int arch_cpu_init(void) int arch_cpu_init(void)
{ {
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_RECOVER_DATA_SECTION)
spl_save_restore_data();
#endif
#ifdef CONFIG_SPL_BUILD #ifdef CONFIG_SPL_BUILD
struct pass_over_info_t *pass_over; struct pass_over_info_t *pass_over;
......
...@@ -582,4 +582,5 @@ void spl_perform_fixups(struct spl_image_info *spl_image); ...@@ -582,4 +582,5 @@ void spl_perform_fixups(struct spl_image_info *spl_image);
*/ */
struct image_header *spl_get_load_buffer(ssize_t offset, size_t size); struct image_header *spl_get_load_buffer(ssize_t offset, size_t size);
void spl_save_restore_data(void);
#endif #endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment