[PATCH 10/23] ARM: i.MX: scratch: add FDT support

Marco Felsch m.felsch at pengutronix.de
Mon Nov 10 12:34:50 PST 2025


Add support to store a FDT within the scratch area. The user needs to
query the location and size via imx_scratch_get_fdt() which can be used
afterwards to write the actual FDT into it.

Signed-off-by: Marco Felsch <m.felsch at pengutronix.de>
---
 arch/arm/mach-imx/scratch.c | 16 ++++++++++++++++
 common/Kconfig              | 14 ++++++++++++++
 include/mach/imx/scratch.h  |  2 ++
 3 files changed, 32 insertions(+)

diff --git a/arch/arm/mach-imx/scratch.c b/arch/arm/mach-imx/scratch.c
index e4e2d25969f061c9fcdfd7c3d87701b715eb2805..9c0f1c09c4e0b863d8c95888db7cf0518f698d53 100644
--- a/arch/arm/mach-imx/scratch.c
+++ b/arch/arm/mach-imx/scratch.c
@@ -16,7 +16,10 @@ struct imx_scratch_space {
 	u32 bootrom_log[128];
 	u32 reserved[128];		/* reserve for bootrom log */
 	struct optee_header optee_hdr;
+	/* FDT needs an 8 byte alignment */
+	u8 fdt[CONFIG_SCRATCH_FDT_SIZE] __aligned(8);
 };
+static_assert(sizeof(struct imx_scratch_space) <= CONFIG_SCRATCH_SIZE);
 
 static struct imx_scratch_space *scratch;
 
@@ -92,3 +95,16 @@ const struct optee_header *imx_scratch_get_optee_hdr(void)
 
 	return &scratch->optee_hdr;
 }
+
+void imx_scratch_get_fdt(void **fdt, unsigned int *fdt_sz)
+{
+	if (!scratch) {
+		if (IN_PBL)
+			return;
+		else
+			scratch = (void *)arm_mem_scratch_get();
+	}
+
+	*fdt = scratch->fdt;
+	*fdt_sz = sizeof(scratch->fdt);
+}
diff --git a/common/Kconfig b/common/Kconfig
index eb2fb1da1e0919b6e7d5e868c48ad2e195cd8aa8..3f394416c3c376d1cf842472803a47462bb012ed 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -302,8 +302,22 @@ config MALLOC_SIZE
 config SCRATCH_SIZE
 	hex
 	default 0x8000
+	default 0x48000 if PBL_EARLY_FDT_LOAD
 	prompt "Scratch size"
 
+config SCRATCH_FDT_SIZE
+	hex
+	default 0x0
+	default 0x40000 if PBL_EARLY_FDT_LOAD
+	prompt "Scratch FDT size"
+	help
+	  The size of the scratch area used as destination to load and optional
+	  decompress the barebox builtin DTB into it. Can be 0x0 if early FDT
+	  support is not requied e.g. during BL31 and BL32 stage else
+	  SCRATCH_FDT_SIZE <= SCRATCH_SIZE must be ensured.
+	  This option should match the OP-TEE's CFG_DTB_MAX_SIZE configuration
+	  if used by OP-TEE.
+
 config MALLOC_ALIGNMENT
 	hex
 	default 8
diff --git a/include/mach/imx/scratch.h b/include/mach/imx/scratch.h
index 6c2cecabcd80f71aa754736322151d63f2711745..43bf55de48099f1662cd4331620a93303d4dd710 100644
--- a/include/mach/imx/scratch.h
+++ b/include/mach/imx/scratch.h
@@ -14,6 +14,8 @@ struct optee_header;
 const struct optee_header *imx_scratch_get_optee_hdr(void);
 void imx_scratch_save_optee_hdr(const struct optee_header *hdr);
 
+void imx_scratch_get_fdt(void **fdt, unsigned int *fdt_sz);
+
 #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)

-- 
2.47.3




More information about the barebox mailing list