diff options
author | SzuWei Lin <szuweilin@google.com> | 2017-03-30 11:44:54 +0800 |
---|---|---|
committer | SzuWei Lin <szuweilin@google.com> | 2017-04-13 07:28:55 +0000 |
commit | 1be68ae53e645de1b2ec26140b302fbfcbbb919f (patch) | |
tree | 0e79ad15ef00132600def67f61616b558f9280cc /ufdt_node.c | |
parent | 70107c8f5c65bc9798d8f6b7f5b580997d0aca19 (diff) | |
download | libufdt-1be68ae53e645de1b2ec26140b302fbfcbbb919f.tar.gz |
Avoid to re-generate string table from ufdt to fdt
String table contains the strings of all property name in a fdt.
The ufdt_apply_overlay() converts two dtbs from fdt to ufdt,
overlays, and converts merged ufdt to fdt. These operations
shouldn't create new peroperty names, so we can just re-use the
string tables in original dtbs, and just copy them into merged
fdt. This solution can enhance a lot of performance for device
tree overlaying.
To avoid the error that some users could use string offset in
string table, the solution also give a same string offset for
the name properties by ufdt_prop_dict;
Futher, the patch also removed unused header files after
changing algorithm.
Bug: 35255584
Test: ./tests/run_tests.sh
Change-Id: Id422730115531bd20d21117285291bdd860915ff
Diffstat (limited to 'ufdt_node.c')
-rw-r--r-- | ufdt_node.c | 65 |
1 files changed, 2 insertions, 63 deletions
diff --git a/ufdt_node.c b/ufdt_node.c index 6ff4dc1..5a63df7 100644 --- a/ufdt_node.c +++ b/ufdt_node.c @@ -1,6 +1,4 @@ #include "libufdt.h" -#include "ufdt_util.h" - int node_cmp(const void *a, const void *b) { const struct ufdt_node *na = *(struct ufdt_node **)a; @@ -23,11 +21,12 @@ bool node_name_eq(const struct ufdt_node *node, const char *name, int len) { struct ufdt_node *ufdt_node_construct(void *fdtp, fdt32_t *fdt_tag_ptr) { uint32_t tag = fdt32_to_cpu(*fdt_tag_ptr); if (tag == FDT_PROP) { + const struct fdt_property *prop = (const struct fdt_property *)fdt_tag_ptr; struct fdt_prop_ufdt_node *res = dto_malloc(sizeof(struct fdt_prop_ufdt_node)); if (res == NULL) return NULL; res->parent.fdt_tag_ptr = fdt_tag_ptr; res->parent.sibling = NULL; - res->name = get_name(fdtp, (struct ufdt_node *)res); + res->name = fdt_string(fdtp, fdt32_to_cpu(prop->nameoff)); return (struct ufdt_node *)res; } else { struct fdt_node_ufdt_node *res = dto_malloc(sizeof(struct fdt_node_ufdt_node)); @@ -192,66 +191,6 @@ struct ufdt_node *ufdt_node_get_node_by_path(const struct ufdt_node *node, * END of searching-in-ufdt_node methods. */ -int output_property_to_fdt(struct ufdt_node *prop_node, void *fdtp, - struct ufdt_node_dict *props_dict) { - int err = 0; - int len = 0; - void *data = ufdt_node_get_fdt_prop_data(prop_node, &len); - int nameoff = 0; - struct ufdt_node *same_name_prop = - ufdt_node_dict_find_node(props_dict, name_of(prop_node)); - - /* - * There's already a property with same name, take its nameoff instead. - */ - if (same_name_prop != NULL) { - const struct fdt_property *prop = - (const struct fdt_property *)same_name_prop->fdt_tag_ptr; - nameoff = fdt32_to_cpu(prop->nameoff); - } - /* - * Modifies prop_node->fdt_tag_ptr to point to the node in new fdtp. - */ - err = fast_fdt_sw_property(fdtp, name_of(prop_node), data, len, &nameoff, - (struct fdt_property **)&(prop_node->fdt_tag_ptr)); - - if (err < 0) { - dto_error("Not enough space for the string space: %d\n", - fdt_size_dt_strings(fdtp)); - } - ufdt_node_dict_add(props_dict, prop_node); - return err; -} - -int output_ufdt_node_to_fdt(struct ufdt_node *node, void *fdtp, - struct ufdt_node_dict *props_dict) { - uint32_t tag = tag_of(node); - - if (tag == FDT_PROP) { - int err = output_property_to_fdt(node, fdtp, props_dict); - return err; - } - - int err = fdt_begin_node(fdtp, name_of(node)); - if (err < 0) return -1; - - struct ufdt_node **it; - for_each_prop(it, node) { - err = output_ufdt_node_to_fdt(*it, fdtp, props_dict); - if (err < 0) return -1; - } - - for_each_node(it, node) { - err = output_ufdt_node_to_fdt(*it, fdtp, props_dict); - if (err < 0) return -1; - } - - err = fdt_end_node(fdtp); - if (err < 0) return -1; - - return 0; -} - #define TAB_SIZE 2 void ufdt_node_print(const struct ufdt_node *node, int depth) { |