Lines Matching +full:child +full:- +full:node
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
33 if (streq(new->label, label)) { in add_label()
34 new->deleted = 0; in add_label()
40 new->label = label; in add_label()
41 new->next = *labels; in add_label()
50 label->deleted = 1; in delete_labels()
59 new->name = name; in build_property()
60 new->val = val; in build_property()
71 new->name = name; in build_property_delete()
72 new->deleted = 1; in build_property_delete()
79 assert(first->next == NULL); in chain_property()
81 first->next = list; in chain_property()
92 next = p->next; in reverse_properties()
93 p->next = head; in reverse_properties()
100 struct node *build_node(struct property *proplist, struct node *children) in build_node()
102 struct node *new = xmalloc(sizeof(*new)); in build_node()
103 struct node *child; in build_node() local
107 new->proplist = reverse_properties(proplist); in build_node()
108 new->children = children; in build_node()
110 for_each_child(new, child) { in build_node()
111 child->parent = new; in build_node()
117 struct node *build_node_delete(void) in build_node_delete()
119 struct node *new = xmalloc(sizeof(*new)); in build_node_delete()
123 new->deleted = 1; in build_node_delete()
128 struct node *name_node(struct node *node, char *name) in name_node() argument
130 assert(node->name == NULL); in name_node()
132 node->name = name; in name_node()
134 return node; in name_node()
137 struct node *omit_node_if_unused(struct node *node) in omit_node_if_unused() argument
139 node->omit_if_unused = 1; in omit_node_if_unused()
141 return node; in omit_node_if_unused()
144 struct node *reference_node(struct node *node) in reference_node() argument
146 node->is_referenced = 1; in reference_node()
148 return node; in reference_node()
151 struct node *merge_nodes(struct node *old_node, struct node *new_node) in merge_nodes()
154 struct node *new_child, *old_child; in merge_nodes()
157 old_node->deleted = 0; in merge_nodes()
159 /* Add new node labels to old node */ in merge_nodes()
160 for_each_label_withdel(new_node->labels, l) in merge_nodes()
161 add_label(&old_node->labels, l->label); in merge_nodes()
163 /* Move properties from the new node to the old node. If there in merge_nodes()
165 while (new_node->proplist) { in merge_nodes()
167 new_prop = new_node->proplist; in merge_nodes()
168 new_node->proplist = new_prop->next; in merge_nodes()
169 new_prop->next = NULL; in merge_nodes()
171 if (new_prop->deleted) { in merge_nodes()
172 delete_property_by_name(old_node, new_prop->name); in merge_nodes()
179 if (streq(old_prop->name, new_prop->name)) { in merge_nodes()
181 for_each_label_withdel(new_prop->labels, l) in merge_nodes()
182 add_label(&old_prop->labels, l->label); in merge_nodes()
184 old_prop->val = new_prop->val; in merge_nodes()
185 old_prop->deleted = 0; in merge_nodes()
192 /* if no collision occurred, add property to the old node. */ in merge_nodes()
197 /* Move the override child nodes into the primary node. If in merge_nodes()
199 while (new_node->children) { in merge_nodes()
200 /* Pop the child node off the list */ in merge_nodes()
201 new_child = new_node->children; in merge_nodes()
202 new_node->children = new_child->next_sibling; in merge_nodes()
203 new_child->parent = NULL; in merge_nodes()
204 new_child->next_sibling = NULL; in merge_nodes()
206 if (new_child->deleted) { in merge_nodes()
207 delete_node_by_name(old_node, new_child->name); in merge_nodes()
214 if (streq(old_child->name, new_child->name)) { in merge_nodes()
221 /* if no collision occurred, add child to the old node. */ in merge_nodes()
226 /* The new node contents are now merged into the old node. Free in merge_nodes()
227 * the new node. */ in merge_nodes()
233 struct node * add_orphan_node(struct node *dt, struct node *new_node, char *ref) in add_orphan_node()
236 struct node *node; in add_orphan_node() local
244 p = build_property("target-path", d); in add_orphan_node()
255 node = build_node(p, new_node); in add_orphan_node()
256 name_node(node, name); in add_orphan_node()
258 add_child(dt, node); in add_orphan_node()
262 struct node *chain_node(struct node *first, struct node *list) in chain_node()
264 assert(first->next_sibling == NULL); in chain_node()
266 first->next_sibling = list; in chain_node()
270 void add_property(struct node *node, struct property *prop) in add_property() argument
274 prop->next = NULL; in add_property()
276 p = &node->proplist; in add_property()
278 p = &((*p)->next); in add_property()
283 void delete_property_by_name(struct node *node, char *name) in delete_property_by_name() argument
285 struct property *prop = node->proplist; in delete_property_by_name()
288 if (streq(prop->name, name)) { in delete_property_by_name()
292 prop = prop->next; in delete_property_by_name()
298 prop->deleted = 1; in delete_property()
299 delete_labels(&prop->labels); in delete_property()
302 void add_child(struct node *parent, struct node *child) in add_child() argument
304 struct node **p; in add_child()
306 child->next_sibling = NULL; in add_child()
307 child->parent = parent; in add_child()
309 p = &parent->children; in add_child()
311 p = &((*p)->next_sibling); in add_child()
313 *p = child; in add_child()
316 void delete_node_by_name(struct node *parent, char *name) in delete_node_by_name()
318 struct node *node = parent->children; in delete_node_by_name() local
320 while (node) { in delete_node_by_name()
321 if (streq(node->name, name)) { in delete_node_by_name()
322 delete_node(node); in delete_node_by_name()
325 node = node->next_sibling; in delete_node_by_name()
329 void delete_node(struct node *node) in delete_node() argument
332 struct node *child; in delete_node() local
334 node->deleted = 1; in delete_node()
335 for_each_child(node, child) in delete_node()
336 delete_node(child); in delete_node()
337 for_each_property(node, prop) in delete_node()
339 delete_labels(&node->labels); in delete_node()
342 void append_to_property(struct node *node, in append_to_property() argument
348 p = get_property(node, name); in append_to_property()
350 d = data_append_data(p->val, data, len); in append_to_property()
351 p->val = d; in append_to_property()
355 add_property(node, p); in append_to_property()
365 new->address = address; in build_reserve_entry()
366 new->size = size; in build_reserve_entry()
374 assert(first->next == NULL); in chain_reserve_entry()
376 first->next = list; in chain_reserve_entry()
385 new->next = NULL; in add_reserve_entry()
390 for (last = list; last->next; last = last->next) in add_reserve_entry()
393 last->next = new; in add_reserve_entry()
400 struct node *tree, uint32_t boot_cpuid_phys) in build_dt_info()
405 dti->dtsflags = dtsflags; in build_dt_info()
406 dti->reservelist = reservelist; in build_dt_info()
407 dti->dt = tree; in build_dt_info()
408 dti->boot_cpuid_phys = boot_cpuid_phys; in build_dt_info()
417 const char *get_unitname(struct node *node) in get_unitname() argument
419 if (node->name[node->basenamelen] == '\0') in get_unitname()
422 return node->name + node->basenamelen + 1; in get_unitname()
425 struct property *get_property(struct node *node, const char *propname) in get_property() argument
429 for_each_property(node, prop) in get_property()
430 if (streq(prop->name, propname)) in get_property()
438 assert(prop->val.len == sizeof(cell_t)); in propval_cell()
439 return fdt32_to_cpu(*((fdt32_t *)prop->val.val)); in propval_cell()
444 assert(prop->val.len / sizeof(cell_t) >= n); in propval_cell_n()
445 return fdt32_to_cpu(*((fdt32_t *)prop->val.val + n)); in propval_cell_n()
448 struct property *get_property_by_label(struct node *tree, const char *label, in get_property_by_label()
449 struct node **node) in get_property_by_label() argument
452 struct node *c; in get_property_by_label()
454 *node = tree; in get_property_by_label()
459 for_each_label(prop->labels, l) in get_property_by_label()
460 if (streq(l->label, label)) in get_property_by_label()
465 prop = get_property_by_label(c, label, node); in get_property_by_label()
470 *node = NULL; in get_property_by_label()
474 struct marker *get_marker_label(struct node *tree, const char *label, in get_marker_label()
475 struct node **node, struct property **prop) in get_marker_label() argument
479 struct node *c; in get_marker_label()
481 *node = tree; in get_marker_label()
485 m = p->val.markers; in get_marker_label()
487 if (streq(m->ref, label)) in get_marker_label()
492 m = get_marker_label(c, label, node, prop); in get_marker_label()
498 *node = NULL; in get_marker_label()
502 struct node *get_subnode(struct node *node, const char *nodename) in get_subnode() argument
504 struct node *child; in get_subnode() local
506 for_each_child(node, child) in get_subnode()
507 if (streq(child->name, nodename)) in get_subnode()
508 return child; in get_subnode()
513 struct node *get_node_by_path(struct node *tree, const char *path) in get_node_by_path()
516 struct node *child; in get_node_by_path() local
519 if (tree->deleted) in get_node_by_path()
529 for_each_child(tree, child) { in get_node_by_path()
530 if (p && (strlen(child->name) == p-path) && in get_node_by_path()
531 strprefixeq(path, p - path, child->name)) in get_node_by_path()
532 return get_node_by_path(child, p+1); in get_node_by_path()
533 else if (!p && streq(path, child->name)) in get_node_by_path()
534 return child; in get_node_by_path()
540 struct node *get_node_by_label(struct node *tree, const char *label) in get_node_by_label()
542 struct node *child, *node; in get_node_by_label() local
547 for_each_label(tree->labels, l) in get_node_by_label()
548 if (streq(l->label, label)) in get_node_by_label()
551 for_each_child(tree, child) { in get_node_by_label()
552 node = get_node_by_label(child, label); in get_node_by_label()
553 if (node) in get_node_by_label()
554 return node; in get_node_by_label()
560 struct node *get_node_by_phandle(struct node *tree, cell_t phandle) in get_node_by_phandle()
562 struct node *child, *node; in get_node_by_phandle() local
564 if ((phandle == 0) || (phandle == -1)) { in get_node_by_phandle()
569 if (tree->phandle == phandle) { in get_node_by_phandle()
570 if (tree->deleted) in get_node_by_phandle()
575 for_each_child(tree, child) { in get_node_by_phandle()
576 node = get_node_by_phandle(child, phandle); in get_node_by_phandle()
577 if (node) in get_node_by_phandle()
578 return node; in get_node_by_phandle()
584 struct node *get_node_by_ref(struct node *tree, const char *ref) in get_node_by_ref()
594 cell_t get_node_phandle(struct node *root, struct node *node) in get_node_phandle() argument
598 if ((node->phandle != 0) && (node->phandle != -1)) in get_node_phandle()
599 return node->phandle; in get_node_phandle()
604 node->phandle = phandle; in get_node_phandle()
606 if (!get_property(node, "linux,phandle") in get_node_phandle()
608 add_property(node, in get_node_phandle()
612 if (!get_property(node, "phandle") in get_node_phandle()
614 add_property(node, in get_node_phandle()
618 /* If the node *does* have a phandle property, we must in get_node_phandle()
619 * be dealing with a self-referencing phandle, which will be in get_node_phandle()
622 return node->phandle; in get_node_phandle()
625 uint32_t guess_boot_cpuid(struct node *tree) in guess_boot_cpuid()
627 struct node *cpus, *bootcpu; in guess_boot_cpuid()
635 bootcpu = cpus->children; in guess_boot_cpuid()
640 if (!reg || (reg->val.len != sizeof(uint32_t))) in guess_boot_cpuid()
643 /* FIXME: Sanity check node? */ in guess_boot_cpuid()
655 if (a->address < b->address) in cmp_reserve_info()
656 return -1; in cmp_reserve_info()
657 else if (a->address > b->address) in cmp_reserve_info()
659 else if (a->size < b->size) in cmp_reserve_info()
660 return -1; in cmp_reserve_info()
661 else if (a->size > b->size) in cmp_reserve_info()
672 for (ri = dti->reservelist; in sort_reserve_entries()
674 ri = ri->next) in sort_reserve_entries()
682 for (ri = dti->reservelist; in sort_reserve_entries()
684 ri = ri->next) in sort_reserve_entries()
689 dti->reservelist = tbl[0]; in sort_reserve_entries()
690 for (i = 0; i < (n-1); i++) in sort_reserve_entries()
691 tbl[i]->next = tbl[i+1]; in sort_reserve_entries()
692 tbl[n-1]->next = NULL; in sort_reserve_entries()
704 return strcmp(a->name, b->name); in cmp_prop()
707 static void sort_properties(struct node *node) in sort_properties() argument
712 for_each_property_withdel(node, prop) in sort_properties()
720 for_each_property_withdel(node, prop) in sort_properties()
725 node->proplist = tbl[0]; in sort_properties()
726 for (i = 0; i < (n-1); i++) in sort_properties()
727 tbl[i]->next = tbl[i+1]; in sort_properties()
728 tbl[n-1]->next = NULL; in sort_properties()
735 const struct node *a, *b; in cmp_subnode()
737 a = *((const struct node * const *)ax); in cmp_subnode()
738 b = *((const struct node * const *)bx); in cmp_subnode()
740 return strcmp(a->name, b->name); in cmp_subnode()
743 static void sort_subnodes(struct node *node) in sort_subnodes() argument
746 struct node *subnode, **tbl; in sort_subnodes()
748 for_each_child_withdel(node, subnode) in sort_subnodes()
756 for_each_child_withdel(node, subnode) in sort_subnodes()
761 node->children = tbl[0]; in sort_subnodes()
762 for (i = 0; i < (n-1); i++) in sort_subnodes()
763 tbl[i]->next_sibling = tbl[i+1]; in sort_subnodes()
764 tbl[n-1]->next_sibling = NULL; in sort_subnodes()
769 static void sort_node(struct node *node) in sort_node() argument
771 struct node *c; in sort_node()
773 sort_properties(node); in sort_node()
774 sort_subnodes(node); in sort_node()
775 for_each_child_withdel(node, c) in sort_node()
782 sort_node(dti->dt); in sort_tree()
786 static struct node *build_and_name_child_node(struct node *parent, char *name) in build_and_name_child_node()
788 struct node *node; in build_and_name_child_node() local
790 node = build_node(NULL, NULL); in build_and_name_child_node()
791 name_node(node, xstrdup(name)); in build_and_name_child_node()
792 add_child(parent, node); in build_and_name_child_node()
794 return node; in build_and_name_child_node()
797 static struct node *build_root_node(struct node *dt, char *name) in build_root_node()
799 struct node *an; in build_root_node()
806 die("Could not build root node /%s\n", name); in build_root_node()
811 static bool any_label_tree(struct dt_info *dti, struct node *node) in any_label_tree() argument
813 struct node *c; in any_label_tree()
815 if (node->labels) in any_label_tree()
818 for_each_child(node, c) in any_label_tree()
826 struct node *an, struct node *node, in generate_label_tree_internal() argument
829 struct node *dt = dti->dt; in generate_label_tree_internal()
830 struct node *c; in generate_label_tree_internal()
835 if (node->labels) { in generate_label_tree_internal()
837 /* now add the label in the node */ in generate_label_tree_internal()
838 for_each_label(node->labels, l) { in generate_label_tree_internal()
841 p = get_property(an, l->label); in generate_label_tree_internal()
844 " exists in /%s", l->label, in generate_label_tree_internal()
845 an->name); in generate_label_tree_internal()
850 p = build_property(l->label, in generate_label_tree_internal()
851 data_copy_mem(node->fullpath, in generate_label_tree_internal()
852 strlen(node->fullpath) + 1)); in generate_label_tree_internal()
856 /* force allocation of a phandle for this node */ in generate_label_tree_internal()
858 (void)get_node_phandle(dt, node); in generate_label_tree_internal()
861 for_each_child(node, c) in generate_label_tree_internal()
865 static bool any_fixup_tree(struct dt_info *dti, struct node *node) in any_fixup_tree() argument
867 struct node *c; in any_fixup_tree()
871 for_each_property(node, prop) { in any_fixup_tree()
872 m = prop->val.markers; in any_fixup_tree()
874 if (!get_node_by_ref(dti->dt, m->ref)) in any_fixup_tree()
879 for_each_child(node, c) { in any_fixup_tree()
887 static void add_fixup_entry(struct dt_info *dti, struct node *fn, in add_fixup_entry()
888 struct node *node, struct property *prop, in add_fixup_entry() argument
893 /* m->ref can only be a REF_PHANDLE, but check anyway */ in add_fixup_entry()
894 assert(m->type == REF_PHANDLE); in add_fixup_entry()
897 if (strchr(node->fullpath, ':') || strchr(prop->name, ':')) in add_fixup_entry()
901 node->fullpath, prop->name, m->offset); in add_fixup_entry()
902 append_to_property(fn, m->ref, entry, strlen(entry) + 1); in add_fixup_entry()
908 struct node *fn, in generate_fixups_tree_internal()
909 struct node *node) in generate_fixups_tree_internal() argument
911 struct node *dt = dti->dt; in generate_fixups_tree_internal()
912 struct node *c; in generate_fixups_tree_internal()
915 struct node *refnode; in generate_fixups_tree_internal()
917 for_each_property(node, prop) { in generate_fixups_tree_internal()
918 m = prop->val.markers; in generate_fixups_tree_internal()
920 refnode = get_node_by_ref(dt, m->ref); in generate_fixups_tree_internal()
922 add_fixup_entry(dti, fn, node, prop, m); in generate_fixups_tree_internal()
926 for_each_child(node, c) in generate_fixups_tree_internal()
930 static bool any_local_fixup_tree(struct dt_info *dti, struct node *node) in any_local_fixup_tree() argument
932 struct node *c; in any_local_fixup_tree()
936 for_each_property(node, prop) { in any_local_fixup_tree()
937 m = prop->val.markers; in any_local_fixup_tree()
939 if (get_node_by_ref(dti->dt, m->ref)) in any_local_fixup_tree()
944 for_each_child(node, c) { in any_local_fixup_tree()
953 struct node *lfn, struct node *node, in add_local_fixup_entry() argument
955 struct node *refnode) in add_local_fixup_entry()
957 struct node *wn, *nwn; /* local fixup node, walk node, new */ in add_local_fixup_entry()
964 for (wn = node; wn; wn = wn->parent) in add_local_fixup_entry()
971 for (wn = node, i = depth - 1; wn; wn = wn->parent, i--) in add_local_fixup_entry()
972 compp[i] = wn->name; in add_local_fixup_entry()
976 /* if no node exists, create it */ in add_local_fixup_entry()
984 value_32 = cpu_to_fdt32(m->offset); in add_local_fixup_entry()
985 append_to_property(wn, prop->name, &value_32, sizeof(value_32)); in add_local_fixup_entry()
989 struct node *lfn, in generate_local_fixups_tree_internal()
990 struct node *node) in generate_local_fixups_tree_internal() argument
992 struct node *dt = dti->dt; in generate_local_fixups_tree_internal()
993 struct node *c; in generate_local_fixups_tree_internal()
996 struct node *refnode; in generate_local_fixups_tree_internal()
998 for_each_property(node, prop) { in generate_local_fixups_tree_internal()
999 m = prop->val.markers; in generate_local_fixups_tree_internal()
1001 refnode = get_node_by_ref(dt, m->ref); in generate_local_fixups_tree_internal()
1003 add_local_fixup_entry(dti, lfn, node, prop, m, refnode); in generate_local_fixups_tree_internal()
1007 for_each_child(node, c) in generate_local_fixups_tree_internal()
1013 if (!any_label_tree(dti, dti->dt)) in generate_label_tree()
1015 generate_label_tree_internal(dti, build_root_node(dti->dt, name), in generate_label_tree()
1016 dti->dt, allocph); in generate_label_tree()
1021 if (!any_fixup_tree(dti, dti->dt)) in generate_fixups_tree()
1023 generate_fixups_tree_internal(dti, build_root_node(dti->dt, name), in generate_fixups_tree()
1024 dti->dt); in generate_fixups_tree()
1029 if (!any_local_fixup_tree(dti, dti->dt)) in generate_local_fixups_tree()
1031 generate_local_fixups_tree_internal(dti, build_root_node(dti->dt, name), in generate_local_fixups_tree()
1032 dti->dt); in generate_local_fixups_tree()