[PATCH v2 04/18] ARM: i.MX8M: romapi: refactor saving the bootrom log
Marco Felsch
m.felsch at pengutronix.de
Tue Jan 16 09:07:24 PST 2024
Saving the bootrom log to the scratch area was the last open coded part.
Move the code to the scratch module to make the scratch handling
completely opaque.
Signed-off-by: Marco Felsch <m.felsch at pengutronix.de>
---
arch/arm/mach-imx/atf.c | 12 ++++++++----
arch/arm/mach-imx/romapi.c | 6 ++----
arch/arm/mach-imx/scratch.c | 33 ++++++++++++++++++++++++++++++---
include/mach/imx/romapi.h | 7 +------
include/mach/imx/scratch.h | 11 ++++++-----
5 files changed, 47 insertions(+), 22 deletions(-)
diff --git a/arch/arm/mach-imx/atf.c b/arch/arm/mach-imx/atf.c
index 5dfa7eeb50b9..3f796249061d 100644
--- a/arch/arm/mach-imx/atf.c
+++ b/arch/arm/mach-imx/atf.c
@@ -123,7 +123,8 @@ __noreturn void imx8mm_load_and_start_image_via_tfa(void)
void *bl33 = (void *)MX8M_ATF_BL33_BASE_ADDR;
unsigned long endmem = MX8M_DDR_CSD1_BASE_ADDR + imx8m_barebox_earlymem_size(32);
- imx8mm_save_bootrom_log();
+ imx8mm_init_scratch_space();
+ imx8m_save_bootrom_log();
imx8mm_load_bl33(bl33);
if (IS_ENABLED(CONFIG_FIRMWARE_IMX8MM_OPTEE)) {
@@ -186,7 +187,8 @@ __noreturn void imx8mp_load_and_start_image_via_tfa(void)
void *bl33 = (void *)MX8M_ATF_BL33_BASE_ADDR;
unsigned long endmem = MX8M_DDR_CSD1_BASE_ADDR + imx8m_barebox_earlymem_size(32);
- imx8mp_save_bootrom_log();
+ imx8mp_init_scratch_space();
+ imx8m_save_bootrom_log();
imx8mp_load_bl33(bl33);
if (IS_ENABLED(CONFIG_FIRMWARE_IMX8MP_OPTEE)) {
@@ -250,7 +252,8 @@ __noreturn void imx8mn_load_and_start_image_via_tfa(void)
void *bl33 = (void *)MX8M_ATF_BL33_BASE_ADDR;
unsigned long endmem = MX8M_DDR_CSD1_BASE_ADDR + imx8m_barebox_earlymem_size(16);
- imx8mn_save_bootrom_log();
+ imx8mn_init_scratch_space();
+ imx8m_save_bootrom_log();
imx8mn_load_bl33(bl33);
if (IS_ENABLED(CONFIG_FIRMWARE_IMX8MN_OPTEE)) {
@@ -307,7 +310,8 @@ __noreturn void imx8mq_load_and_start_image_via_tfa(void)
void *bl33 = (void *)MX8M_ATF_BL33_BASE_ADDR;
unsigned long endmem = MX8M_DDR_CSD1_BASE_ADDR + imx8m_barebox_earlymem_size(32);
- imx8mq_save_bootrom_log();
+ imx8mq_init_scratch_space();
+ imx8m_save_bootrom_log();
imx8mq_load_bl33(bl33);
if (IS_ENABLED(CONFIG_FIRMWARE_IMX8MQ_OPTEE)) {
diff --git a/arch/arm/mach-imx/romapi.c b/arch/arm/mach-imx/romapi.c
index 51e35c9d2aa2..a245357fdf5d 100644
--- a/arch/arm/mach-imx/romapi.c
+++ b/arch/arm/mach-imx/romapi.c
@@ -226,7 +226,7 @@ const u32 *imx8m_get_bootrom_log(void)
return NULL;
}
-void imx8m_save_bootrom_log(void *dest)
+void imx8m_save_bootrom_log(void)
{
const u32 *rom_log;
@@ -241,7 +241,5 @@ void imx8m_save_bootrom_log(void *dest)
return;
}
- pr_debug("Saving bootrom log to 0x%p\n", dest);
-
- memcpy(dest, rom_log, 128 * sizeof(u32));
+ imx8m_scratch_save_bootrom_log(rom_log);
}
diff --git a/arch/arm/mach-imx/scratch.c b/arch/arm/mach-imx/scratch.c
index fba00955c095..f4faff835c8c 100644
--- a/arch/arm/mach-imx/scratch.c
+++ b/arch/arm/mach-imx/scratch.c
@@ -3,26 +3,53 @@
#include <asm/barebox-arm.h>
#include <init.h>
#include <linux/err.h>
+#include <linux/printk.h>
#include <mach/imx/imx8m-regs.h>
#include <mach/imx/esdctl.h>
#include <mach/imx/scratch.h>
#include <memory.h>
+#include <pbl.h>
struct imx_scratch_space {
u32 bootrom_log[128];
};
-void *__imx8m_scratch_space(int ddr_buswidth)
+static struct imx_scratch_space *scratch;
+
+void imx8m_init_scratch_space(int ddr_buswidth, bool zero_init)
{
ulong endmem = MX8M_DDR_CSD1_BASE_ADDR +
imx8m_barebox_earlymem_size(ddr_buswidth);
- return (void *)arm_mem_scratch(endmem);
+ scratch = (void *)arm_mem_scratch(endmem);
+
+ if (zero_init)
+ memset(scratch, 0, sizeof(*scratch));
+}
+
+void imx8m_scratch_save_bootrom_log(const u32 *rom_log)
+{
+ size_t sz = sizeof(scratch->bootrom_log);
+
+ if (!scratch) {
+ pr_err("No scratch area initialized, skip saving bootrom log");
+ return;
+ }
+
+ pr_debug("Saving bootrom log to scratch area 0x%p\n", &scratch->bootrom_log);
+
+ memcpy(scratch->bootrom_log, rom_log, sz);
}
const u32 *imx8m_scratch_get_bootrom_log(void)
{
- const struct imx_scratch_space *scratch = arm_mem_scratch_get();
+ if (!scratch) {
+ if (IN_PBL)
+ return ERR_PTR(-EINVAL);
+ else
+ scratch = (void *)arm_mem_scratch_get();
+ }
+
return scratch->bootrom_log;
}
diff --git a/include/mach/imx/romapi.h b/include/mach/imx/romapi.h
index 710068a8d41d..ae4e49cd7d25 100644
--- a/include/mach/imx/romapi.h
+++ b/include/mach/imx/romapi.h
@@ -41,12 +41,7 @@ int imx8mn_romapi_load_image(void);
int imx93_romapi_load_image(void);
/* only call after DRAM has been configured */
-void imx8m_save_bootrom_log(void *dst);
+void imx8m_save_bootrom_log(void);
const u32 *imx8m_get_bootrom_log(void);
-#define imx8mq_save_bootrom_log() imx8m_save_bootrom_log(imx8mq_scratch_space())
-#define imx8mm_save_bootrom_log() imx8m_save_bootrom_log(imx8mm_scratch_space())
-#define imx8mn_save_bootrom_log() imx8m_save_bootrom_log(imx8mn_scratch_space())
-#define imx8mp_save_bootrom_log() imx8m_save_bootrom_log(imx8mp_scratch_space())
-
#endif /* __MACH_IMX_ROMAPI_H */
diff --git a/include/mach/imx/scratch.h b/include/mach/imx/scratch.h
index 9b01cf315622..487171fbee97 100644
--- a/include/mach/imx/scratch.h
+++ b/include/mach/imx/scratch.h
@@ -3,13 +3,14 @@
#ifndef __MACH_IMX_SCRATCH_H
#define __MACH_IMX_SCRATCH_H
-void *__imx8m_scratch_space(int ddr_buswidth);
+void imx8m_init_scratch_space(int ddr_buswidth, bool zero_init);
const u32 *imx8m_scratch_get_bootrom_log(void);
+void imx8m_scratch_save_bootrom_log(const u32 *rom_log);
-#define imx8mq_scratch_space() __imx8m_scratch_space(32)
-#define imx8mm_scratch_space() __imx8m_scratch_space(32)
-#define imx8mn_scratch_space() __imx8m_scratch_space(16)
-#define imx8mp_scratch_space() __imx8m_scratch_space(32)
+#define imx8mq_init_scratch_space() imx8m_init_scratch_space(32, true)
+#define imx8mm_init_scratch_space() imx8m_init_scratch_space(32, true)
+#define imx8mn_init_scratch_space() imx8m_init_scratch_space(16, true)
+#define imx8mp_init_scratch_space() imx8m_init_scratch_space(32, true)
#endif /* __MACH_IMX_SCRATCH_H */
--
2.39.2
More information about the barebox
mailing list