[PATCH 05/13] boot: Move handling of the load_op into a separate function
Simon Glass
sjg at chromium.org
Wed Mar 25 17:54:14 CET 2026
Since fit_image_load() is still too long, move the load-operation
handling into a separate function.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
boot/image-fit.c | 107 ++++++++++++++++++++++++++++++++---------------
1 file changed, 73 insertions(+), 34 deletions(-)
diff --git a/boot/image-fit.c b/boot/image-fit.c
index 3a6120e9151..c5067b63682 100644
--- a/boot/image-fit.c
+++ b/boot/image-fit.c
@@ -2232,6 +2232,75 @@ static int check_allowed(const void *fit, int noffset,
return 0;
}
+/**
+ * handle_load_op() - Handle the load operation
+ *
+ * Process the load_op and figure out where the image should be loaded, now
+ * that it has been located
+ *
+ * @fit: FIT to check
+ * @noffset: Node offset of the image being loaded
+ * @prop_name: Property name (in the configuration node) indicating the image
+ * that was loaded
+ * @buf: Pointer to image (within the FIT)
+ * @size: Size of the image in bytes
+ * @image_type: Type of the image
+ * @load_op: Load operation to process
+ * @bootstage_id: ID of starting bootstage to use for progress updates
+ * @datap: Returns buf
+ * @loadp: Returns the address to which the data should be loaded
+ * @load_endp: Returns the end address of the data-loading location
+ * Return: 0 if OK, -ve on error
+ */
+static int handle_load_op(const void *fit, int noffset, const char *prop_name,
+ void *buf, ulong size,
+ enum image_type_t image_type,
+ enum fit_load_op load_op, int bootstage_id,
+ ulong *datap, ulong *loadp, ulong *load_endp)
+{
+ ulong data, load;
+
+ data = map_to_sysmem(buf);
+ load = data;
+ *load_endp = 0;
+ if (load_op == FIT_LOAD_IGNORED) {
+ log_debug("load_op: not loading\n");
+ /* Don't load */
+ } else if (fit_image_get_load(fit, noffset, &load)) {
+ if (load_op == FIT_LOAD_REQUIRED) {
+ printf("Can't get %s subimage load address!\n",
+ prop_name);
+ bootstage_error(bootstage_id + BOOTSTAGE_SUB_LOAD);
+ return -EBADF;
+ }
+ } else if (load_op != FIT_LOAD_OPTIONAL_NON_ZERO || load) {
+ ulong image_start, image_end;
+
+ /*
+ * move image data to the load address,
+ * make sure we don't overwrite initial image
+ */
+ image_start = map_to_sysmem(fit);
+ image_end = image_start + fit_get_size(fit);
+
+ *load_endp = load + size;
+ if (image_type != IH_TYPE_KERNEL &&
+ load < image_end && *load_endp > image_start) {
+ printf("Error: %s overwritten\n", prop_name);
+ return -EXDEV;
+ }
+
+ printf(" Loading %s from 0x%08lx to 0x%08lx\n",
+ prop_name, data, load);
+ } else {
+ load = data; /* No load address specified */
+ }
+ *datap = data;
+ *loadp = load;
+
+ return 0;
+}
+
int fit_image_load(struct bootm_headers *images, ulong addr,
const char **fit_unamep, const char **fit_uname_configp,
enum image_arch_t arch, int ph_type, int bootstage_id,
@@ -2305,40 +2374,10 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
bootstage_mark(bootstage_id + BOOTSTAGE_SUB_GET_DATA_OK);
- data = map_to_sysmem(buf);
- load = data;
- if (load_op == FIT_LOAD_IGNORED) {
- log_debug("load_op: not loading\n");
- /* Don't load */
- } else if (fit_image_get_load(fit, noffset, &load)) {
- if (load_op == FIT_LOAD_REQUIRED) {
- printf("Can't get %s subimage load address!\n",
- prop_name);
- bootstage_error(bootstage_id + BOOTSTAGE_SUB_LOAD);
- return -EBADF;
- }
- } else if (load_op != FIT_LOAD_OPTIONAL_NON_ZERO || load) {
- ulong image_start, image_end;
-
- /*
- * move image data to the load address,
- * make sure we don't overwrite initial image
- */
- image_start = addr;
- image_end = addr + fit_get_size(fit);
-
- load_end = load + len;
- if (image_type != IH_TYPE_KERNEL &&
- load < image_end && load_end > image_start) {
- printf("Error: %s overwritten\n", prop_name);
- return -EXDEV;
- }
-
- printf(" Loading %s from 0x%08lx to 0x%08lx\n",
- prop_name, data, load);
- } else {
- load = data; /* No load address specified */
- }
+ ret = handle_load_op(fit, noffset, prop_name, buf, len, image_type,
+ load_op, bootstage_id, &data, &load, &load_end);
+ if (ret)
+ return ret;
comp = IH_COMP_NONE;
loadbuf = buf;
--
2.43.0
More information about the U-Boot
mailing list