aboutsummaryrefslogtreecommitdiff
path: root/core/arch/arm/kernel
diff options
context:
space:
mode:
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>2018-11-19 14:18:30 +0000
committerJérôme Forissier <jerome.forissier@linaro.org>2018-11-29 16:57:21 +0100
commit0a3ad9b62dc216404d651a2d19c7c1e2d8569ba9 (patch)
tree209ad8196e1c65c65058061039626eccc8332a61 /core/arch/arm/kernel
parentfe24f1a10023caac1e052caf87ca05937c7ae788 (diff)
core: generic_boot: Add add_dt_overlay_fragment()
This patch adds a dt routine add_dt_overlay_fragment(). This purpose of which is to encapsulate the dynamic FDT node entries OPTEE provides inside of a fragment@0 { target-path = "/"; __overlay__ { /* OPTEE nodes go here */ }; }; A subsequent set of patches will wrapper up existing dynamic OPTEE nodes - /firmware/optee - /psci - /reserved/memory optee@0xaddress Once done it will be possible for a DTB in memory to be populated with OPTEE fragments and for a subsequent bootloader to merge the OPTEE populated overlay into a DTB loaded by a later stage. if CFG_EXTERNAL_DTB_OVERLAY is not defined then this code has no effect. Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org> Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
Diffstat (limited to 'core/arch/arm/kernel')
-rw-r--r--core/arch/arm/kernel/generic_boot.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/core/arch/arm/kernel/generic_boot.c b/core/arch/arm/kernel/generic_boot.c
index e1c59a06..d31976da 100644
--- a/core/arch/arm/kernel/generic_boot.c
+++ b/core/arch/arm/kernel/generic_boot.c
@@ -76,6 +76,9 @@ KEEP_PAGER(sem_cpu_sync);
#ifdef CFG_DT
extern uint8_t embedded_secure_dtb[];
static void *dt_blob_addr;
+#ifdef CFG_EXTERNAL_DTB_OVERLAY
+static int __dt_frag_id;
+#endif
#endif
#ifdef CFG_SECONDARY_INIT_CNTFRQ
@@ -484,6 +487,33 @@ static void reset_dt_references(void)
dt_blob_addr = NULL;
}
+#ifdef CFG_EXTERNAL_DTB_OVERLAY
+static int add_dt_overlay_fragment(void *fdt, int ioffs)
+{
+ char frag[32];
+ int offs;
+ int ret;
+
+ snprintf(frag, sizeof(frag), "fragment@%d", __dt_frag_id);
+ offs = fdt_add_subnode(fdt, ioffs, frag);
+ if (offs < 0)
+ return offs;
+
+ __dt_frag_id += 1;
+
+ ret = fdt_setprop_string(fdt, offs, "target-path", "/");
+ if (ret < 0)
+ return -1;
+
+ return fdt_add_subnode(fdt, offs, "__overlay__");
+}
+#else
+static int add_dt_overlay_fragment(void *fdt __unused, int offs)
+{
+ return offs;
+}
+#endif /* CFG_EXTERNAL_DTB_OVERLAY */
+
static int add_dt_path_subnode(void *fdt, const char *path, const char *subnode)
{
int offs;