[U-Boot] [RFC PATCH v2 10/12] spl: fit: Allow the board to tell if more images must be loaded from FIT
Jean-Jacques Hiblot
jjhiblot at ti.com
Wed Mar 27 15:38:59 UTC 2019
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 <jjhiblot at 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
More information about the U-Boot
mailing list