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 <[email protected]>
---
 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


Reply via email to