
On Thu, 23 May 2019 at 11:39, Jean-Jacques Hiblot jjhiblot@ti.com wrote:
From: Michal Simek michal.simek@xilinx.com
doc/uImage.FIT/overlay-fdt-boot.txt is describing how to create FIT image with DT overlays in it. Add support for this feature to SPL.
Here is the ZynqMP fragment where dtb points to full DT and dtbo is overlay which should be applied on the top of dtb. config { description = "ATF with full u-boot overlay"; firmware = "atf"; loadables = "uboot"; fdt = "dtb", "dtbo"; };
The whole feature depends on OF_LIBFDT_OVERLAY which is adding +4kB code and 0 for platforms which are not enabling this feature.
Signed-off-by: Michal Simek michal.simek@xilinx.com Signed-off-by: Jean-Jacques Hiblot jjhiblot@ti.com
Changes in v3:
- Add a new config option: SPL_LOAD_FIT_APPLY_OVERLAY. By default, it is
not selected.
Changes in v2: None
Kconfig | 10 ++++++++++ common/spl/spl_fit.c | 27 +++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
nits below
diff --git a/Kconfig b/Kconfig index 5f5c5ccfd6..8197c9066a 100644 --- a/Kconfig +++ b/Kconfig @@ -398,6 +398,16 @@ config SPL_LOAD_FIT particular it can handle selecting from multiple device tree and passing the correct one to U-Boot.
+config SPL_LOAD_FIT_APPLY_OVERLAY
bool "Enable SPL applying DT overlays from FIT"
depends on SPL_LOAD_FIT
select OF_LIBFDT_OVERLAY
default n
this is the default anyway so you can omit this line
help
The device tree is loaded from the FIT image. Allow the SPL is to
also load device-tree overlays from the FIT image an apply them
over the device tree.
Where are the instructions for this? At least add a pointer to a README somewhere else.
config SPL_LOAD_FIT_FULL bool "Enable SPL loading U-Boot as a FIT" select SPL_FIT diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index 87ecf0bb9e..3fbcb969f8 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -278,10 +278,10 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image, void *fit, int images, ulong base_offset) { struct spl_image_info image_info;
int node, ret;
int node, ret, index = 0; /* Figure out which device tree the board wants to use */
node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, 0);
node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, index++); if (node < 0) { debug("%s: cannot find FDT node\n", __func__); return node;
@@ -303,8 +303,31 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image, #if !CONFIG_IS_ENABLED(FIT_IMAGE_TINY) /* Try to make space, so we can inject details on the loadables */ ret = fdt_shrink_to_minimum(spl_image->fdt_addr, 8192);
if (ret < 0)
return ret;
#endif +#if defined(CONFIG_SPL_LOAD_FIT_APPLY_OVERLAY)
Can you use if (CONFIG_IS_ENABLED()) so that this builds with sandbox?
Actually we should really enable this with sandbox, too, so we can add a test.
for (; ; index++) {
node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, index);
if (node < 0) {
debug("%s: No additional FDT node\n", __func__);
return 0;
}
ret = spl_load_fit_image(info, sector, fit, base_offset, node,
&image_info);
if (ret < 0)
return ret;
ret = fdt_overlay_apply_verbose(spl_image->fdt_addr,
(void *)image_info.load_addr);
if (ret)
return ret;
debug("%s: DT overlay %s applied\n", __func__,
fit_get_name(fit, node, NULL));
}
+#endif return ret; }
-- 2.17.1
Regards, Simon