diff options
Diffstat (limited to 'libfdt')
-rw-r--r-- | libfdt/fdt_overlay.c | 53 | ||||
-rw-r--r-- | libfdt/libfdt.h | 18 |
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 */ /**********************************************************************/ |