diff options
author | Hridya Valsaraju <hridya@google.com> | 2018-01-30 13:01:53 -0800 |
---|---|---|
committer | Hridya Valsaraju <hridya@google.com> | 2018-02-02 18:22:17 +0000 |
commit | c0957f2fa7c1b47b61044b3af3d7d82ca44e0680 (patch) | |
tree | 1fcbde564de85a8f388086789accae958c893dc9 /ufdt_overlay.c | |
parent | 9ec4bdabb790b0ddbb627c86830569a809121000 (diff) | |
download | libufdt-c0957f2fa7c1b47b61044b3af3d7d82ca44e0680.tar.gz |
Refactor code to find overlay target
Test: mm
Bug: 67779848
Change-Id: Iec654609d12e1925076ff65aafb94bf6bdf4775d
Diffstat (limited to 'ufdt_overlay.c')
-rw-r--r-- | ufdt_overlay.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/ufdt_overlay.c b/ufdt_overlay.c index 10c6acb..bdc7bd6 100644 --- a/ufdt_overlay.c +++ b/ufdt_overlay.c @@ -318,56 +318,57 @@ static int ufdt_overlay_node(struct ufdt_node *target_node, return ufdt_node_merge_into(target_node, overlay_node, pool); } -/* - * Return value of ufdt_apply_fragment(). - */ - -enum overlay_result { - OVERLAY_RESULT_OK, - OVERLAY_RESULT_MISSING_TARGET, - OVERLAY_RESULT_MISSING_OVERLAY, - OVERLAY_RESULT_TARGET_PATH_INVALID, - OVERLAY_RESULT_TARGET_INVALID, - OVERLAY_RESULT_MERGE_FAIL, -}; - -/* - * Apply one overlay fragment (subtree). - */ -static enum overlay_result ufdt_apply_fragment(struct ufdt *tree, - struct ufdt_node *frag_node, - struct ufdt_node_pool *pool) { +enum overlay_result ufdt_overlay_get_target(struct ufdt *tree, + struct ufdt_node *frag_node, + struct ufdt_node **target_node) { uint32_t target; const char *target_path; const void *val; - struct ufdt_node *target_node = NULL; - struct ufdt_node *overlay_node = NULL; + *target_node = NULL; val = ufdt_node_get_fdt_prop_data_by_name(frag_node, "target", NULL); if (val) { dto_memcpy(&target, val, sizeof(target)); target = fdt32_to_cpu(target); - target_node = ufdt_get_node_by_phandle(tree, target); - if (target_node == NULL) { + *target_node = ufdt_get_node_by_phandle(tree, target); + if (*target_node == NULL) { dto_error("failed to find target %04x\n", target); return OVERLAY_RESULT_TARGET_INVALID; } } - if (target_node == NULL) { + if (*target_node == NULL) { target_path = ufdt_node_get_fdt_prop_data_by_name(frag_node, "target-path", NULL); if (target_path == NULL) { return OVERLAY_RESULT_MISSING_TARGET; } - target_node = ufdt_get_node_by_path(tree, target_path); - if (target_node == NULL) { + *target_node = ufdt_get_node_by_path(tree, target_path); + if (*target_node == NULL) { dto_error("failed to find target-path %s\n", target_path); return OVERLAY_RESULT_TARGET_PATH_INVALID; } } + return OVERLAY_RESULT_OK; +} + +/* + * Apply one overlay fragment (subtree). + */ +static enum overlay_result ufdt_apply_fragment(struct ufdt *tree, + struct ufdt_node *frag_node, + struct ufdt_node_pool *pool) { + struct ufdt_node *target_node = NULL; + struct ufdt_node *overlay_node = NULL; + + enum overlay_result result = + ufdt_overlay_get_target(tree, frag_node, &target_node); + if (target_node == NULL) { + return result; + } + overlay_node = ufdt_node_get_node_by_path(frag_node, "__overlay__"); if (overlay_node == NULL) { dto_error("missing __overlay__ sub-node\n"); |