summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Srivatsa Vaddagiri <vatsa@codeaurora.org> 2018-04-11 15:34:42 +0530
committer Michael Bestas <mkbestas@lineageos.org> 2025-06-15 18:57:38 +0300
commit5a4323bd4931d3ca51ece0c421a1de786ccd5ae4 (patch)
treec81986c2b98d74d3ce1ee7ec78344994cfab8bc3
parent652c213df12d76d6c07ded688d634e2856eec73b (diff)
libfdt: overlay_merge: Introduce fdt_overlay_merge()
fdt_overlay_merge() merges two overlay blobs. This is largely expected to be used offline on a build machine to combine two or more overlay blobs into one. This is intended to help maintain device-tree overlay code in multiple source repositories, but merge their binary forms (overlay blobs) into one so that bootloader's task of searching for all relevant overlay blobs is simplified. This patch introduces fdt_overlay_merge() which is exactly identical to fdt_overlay_apply(). Subsequent patches will introduce required changes to merge overlay blobs. Change-Id: I2d278227f53cb08e7c5b1e90b15062a044e12930 Signed-off-by: Srivatsa Vaddagiri <vatsa@codeaurora.org>
-rw-r--r--libfdt/fdt_overlay.c53
-rw-r--r--libfdt/libfdt.h18
2 files changed, 71 insertions, 0 deletions
diff --git a/libfdt/fdt_overlay.c b/libfdt/fdt_overlay.c
index 5c0c398..c8d5b8c 100644
--- a/libfdt/fdt_overlay.c
+++ b/libfdt/fdt_overlay.c
@@ -865,3 +865,56 @@ err:
return ret;
}
+
+int fdt_overlay_merge(void *fdt, void *fdto, int *fdto_nospace)
+{
+ uint32_t delta = fdt_get_max_phandle(fdt);
+ int ret;
+
+ fdt_check_header(fdt);
+ fdt_check_header(fdto);
+
+ *fdto_nospace = 0;
+
+ ret = overlay_adjust_local_phandles(fdto, delta);
+ if (ret)
+ goto err;
+
+ ret = overlay_update_local_references(fdto, delta);
+ if (ret)
+ goto err;
+
+ ret = overlay_fixup_phandles(fdt, fdto);
+ if (ret)
+ goto err;
+
+ ret = overlay_merge(fdt, fdto);
+ if (ret)
+ goto err;
+
+ ret = overlay_symbol_update(fdt, fdto);
+ if (ret)
+ goto err;
+
+ /*
+ * The overlay has been damaged, erase its magic.
+ */
+ fdt_set_magic(fdto, ~0);
+
+ return 0;
+
+err:
+ /*
+ * The overlay might have been damaged, erase its magic.
+ */
+ fdt_set_magic(fdto, ~0);
+
+ /*
+ * The base device tree might have been damaged, erase its
+ * magic.
+ */
+ if (!*fdto_nospace)
+ fdt_set_magic(fdt, ~0);
+
+ return ret;
+}
diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h
index d0a2ed2..8576aef 100644
--- a/libfdt/libfdt.h
+++ b/libfdt/libfdt.h
@@ -2141,6 +2141,24 @@ int fdt_overlay_apply(void *fdt, void *fdto);
int fdt_overlay_target_offset(const void *fdt, const void *fdto,
int fragment_offset, char const **pathp);
+/**
+ * fdt_overlay_merge - Merge two overlays into one
+ * @fdt: pointer to the first device tree overlay blob
+ * @fdto: pointer to the second device tree overlay blob
+ * @fdto_nospace: indicates if FDT_ERR_NOSPACE error code applies to @fdto
+ *
+ * fdt_overlay_merge() will merge second overlay blob into first overlay blob.
+ *
+ * Expect the first device tree to be modified, even if the function
+ * returns an error.
+ *
+ * returns:
+ * 0, on success
+ * -FDT_ERR_NOSPACE, there's not enough space in first device tree blob
+ * -FDT_ERR_BADVALUE
+ */
+int fdt_overlay_merge(void *fdt, void *fdto, int *fdto_nospace);
+
/**********************************************************************/
/* Debugging / informational functions */
/**********************************************************************/