summaryrefslogtreecommitdiff
path: root/ufdt_overlay.c
diff options
context:
space:
mode:
authorHridya Valsaraju <hridya@google.com>2018-01-30 13:01:53 -0800
committerHridya Valsaraju <hridya@google.com>2018-02-02 18:22:17 +0000
commitc0957f2fa7c1b47b61044b3af3d7d82ca44e0680 (patch)
tree1fcbde564de85a8f388086789accae958c893dc9 /ufdt_overlay.c
parent9ec4bdabb790b0ddbb627c86830569a809121000 (diff)
downloadlibufdt-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.c53
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");