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 | 24 ++++++++++++++++++++++++
 common/Kconfig              | 14 ++++++++++++++
 include/mach/imx/scratch.h  |  2 ++
 3 files changed, 40 insertions(+)

diff --git a/arch/arm/mach-imx/scratch.c b/arch/arm/mach-imx/scratch.c
index 
e4e2d25969f061c9fcdfd7c3d87701b715eb2805..da138445dfb352f2f3497be77004aefc7d46f188
 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,24 @@ const struct optee_header *imx_scratch_get_optee_hdr(void)
 
        return &scratch->optee_hdr;
 }
+
+u8 *imx_scratch_get_fdt(unsigned int *fdt_sz)
+{
+       unsigned int sz;
+
+       if (!scratch) {
+               if (IN_PBL)
+                       return ERR_PTR(-EINVAL);
+               else
+                       scratch = (void *)arm_mem_scratch_get();
+       }
+
+       sz = sizeof(scratch->fdt);
+       if (sz == 0)
+               return NULL;
+
+       if (fdt_sz)
+               *fdt_sz = sz;
+
+       return scratch->fdt;
+}
diff --git a/common/Kconfig b/common/Kconfig
index 
50c26695b2b56a943edfd00a7e0cb1067ad269a9..265652900a5632177d36efa84d590be6db2e7015
 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -304,6 +304,20 @@ config SCRATCH_SIZE
        default 0x8000
        prompt "Scratch size"
 
+config SCRATCH_FDT_SIZE
+       hex
+       default 0x0
+       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.
+
+         If specified, 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..b74d19a560f33da0a11621af7e11abdce6d1c295
 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);
 
+u8 *imx_scratch_get_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