Currently the list of DTB overlays to apply on top of the DTB is described in a configuration node. With this scheme, it becomes quickly hard to manage combinations of more than a hand few of DTB overlays. Instead the board could tell for each overlay if it is needed or not. This is the role of board_fit_get_additionnal_images(). Note that it is not limited to dtb overlays, it could be used for kind of images (fpga, loadables, etc.)
Signed-off-by: Jean-Jacques Hiblot <jjhib...@ti.com> --- common/spl/spl_fit.c | 28 ++++++++++++++++++++++++++++ include/spl.h | 20 ++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index ebce93ec1f..6e39bfa2b4 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -25,6 +25,12 @@ __weak ulong board_spl_fit_size_align(ulong size) return size; } +__weak int board_fit_get_additionnal_images(int index, const char *type, + const char **name) +{ + return -ENOENT; +} + /** * spl_fit_get_image_name(): By using the matching configuration subnode, * retrieve the name of an image, specified by a property name and an index @@ -374,6 +380,28 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image, if (ret) return ret; } + + /* Apply overlays, the name of which are provided by board-level code */ + for (index = 0; ; index++) { + const char *str; + + ret = board_fit_get_additionnal_images(index, FIT_FDT_PROP, + &str); + if (ret) + break; + if (!str) + continue; + + node = fdt_subnode_offset(fit, images, str); + if (node < 0) { + pr_err("cannot find image node '%s': %d\n", str, node); + continue; + } + ret = load_and_apply_overlay(spl_image->fdt_addr, info, sector, + fit, base_offset, node); + if (ret) + return ret; + } #endif #if !CONFIG_IS_ENABLED(FIT_IMAGE_TINY) /* Try to make space, so we can inject details on the loadables */ diff --git a/include/spl.h b/include/spl.h index f09909e189..5acc0a6c6e 100644 --- a/include/spl.h +++ b/include/spl.h @@ -370,6 +370,26 @@ void board_spl_fit_post_load(ulong load_addr, size_t length); */ ulong board_spl_fit_size_align(ulong size); +/** + * board_fit_get_additionnal_images - Get additional image names from board- + * level code. + * This function can be used to provide the image names based on runtime + * detection. A classic use-case would when DTBOs are used to describe + * additionnal daughter cards. + * + * @param index Index of the image. Starts at 0 and gets incremented after each + * call to this function. + * @param type The type of image. For example, "fdt" for DTBs + * @param name Output. The name of the node describing the image. If NULL, it + * should be ignored by the caller but it does not indicate that + * there no more images to get from this function. + * + * @return 0 if there are still images to get of this type to get from + * this function. Otherwise error code. + */ +int board_fit_get_additionnal_images(int index, const char *type, + const char **name); + /** * spl_perform_fixups() - arch/board-specific callback before processing * the boot-payload -- 2.17.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot