spl_fit_get_image_name() is used to get the names of the images that the SPL must load from the FIT. It relies on the content of a property present in the FIT. The list of images is thus statically defined in the FIT. With this scheme, it becomes quickly hard to manage combinations of more than a hand few of images. To address this problem, give the board-level code the opportunity to add to the list of images. The images from the FIT property are loaded first, and then the board_fit_get_additionnal_images() is called to get more image names.
Signed-off-by: Jean-Jacques Hiblot <jjhib...@ti.com> --- Changes in v2: None common/spl/spl_fit.c | 28 +++++++++++++++++++++++++--- include/spl.h | 16 ++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index b11344ec6a..9d4ceb4ae1 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 const char *board_fit_get_additionnal_images(int index, + const char *type) +{ + return NULL; +} + /** * 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 @@ -45,6 +51,7 @@ static int spl_fit_get_image_name(const void *fit, int images, __maybe_unused int node; int conf_node; int len, i; + bool found = true; conf_node = fit_find_config_node(fit); if (conf_node < 0) { @@ -70,12 +77,27 @@ static int spl_fit_get_image_name(const void *fit, int images, for (i = 0; i < index; i++) { str = strchr(str, '\0') + 1; if (!str || (str - name >= len)) { - debug("no string for index %d\n", index); - return -E2BIG; + found = false; + break; } } - *outname = (char *)str; + if (!found) { + /* + * no string in the property for this index. Check if the board + * level code can supply one. + */ + str = board_fit_get_additionnal_images(index - i - 1, type); + if (str) + found = true; + } + + if (!found) { + debug("no string for index %d\n", index); + return -E2BIG; + } + + *outname = str; return 0; } diff --git a/include/spl.h b/include/spl.h index f09909e189..72e9c75e36 100644 --- a/include/spl.h +++ b/include/spl.h @@ -370,6 +370,22 @@ 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 + * + * @return The name of the node describing the image. NULL indicates that + * there no more images to get from this function. + */ +const char *board_fit_get_additionnal_images(int index, const char *type); + /** * 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