summaryrefslogtreecommitdiff
path: root/ufdt_node.c
diff options
context:
space:
mode:
authorSzuWei Lin <szuweilin@google.com>2017-03-30 11:44:54 +0800
committerSzuWei Lin <szuweilin@google.com>2017-04-13 07:28:55 +0000
commit1be68ae53e645de1b2ec26140b302fbfcbbb919f (patch)
tree0e79ad15ef00132600def67f61616b558f9280cc /ufdt_node.c
parent70107c8f5c65bc9798d8f6b7f5b580997d0aca19 (diff)
downloadlibufdt-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.c65
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) {