diff options
author | Bryan O'Donoghue <bryan.odonoghue@linaro.org> | 2018-11-19 14:18:30 +0000 |
---|---|---|
committer | Jérôme Forissier <jerome.forissier@linaro.org> | 2018-11-29 16:57:21 +0100 |
commit | 0a3ad9b62dc216404d651a2d19c7c1e2d8569ba9 (patch) | |
tree | 209ad8196e1c65c65058061039626eccc8332a61 /core/arch/arm/kernel | |
parent | fe24f1a10023caac1e052caf87ca05937c7ae788 (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.c | 30 |
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; |