summaryrefslogtreecommitdiff
path: root/libfdt/fdt_overlay.c
diff options
context:
space:
mode:
Diffstat (limited to 'libfdt/fdt_overlay.c')
-rw-r--r--libfdt/fdt_overlay.c53
1 files changed, 53 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;
+}