]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - tools/fdtgrep.c
dtoc: Move BytesToValue() and GetEmpty() into PropBase
[people/ms/u-boot.git] / tools / fdtgrep.c
index caaf6006a5dd24c96cd6a969d8fda1b1fa2e2554..8d3fef40279a5bdaf6ee48d6137f18be06d3a013 100644 (file)
@@ -660,6 +660,8 @@ static int fdtgrep_find_regions(const void *fdt,
                if (!ret)
                        count++;
        }
+       if (ret && ret != -FDT_ERR_NOTFOUND)
+               return ret;
 
        /* Find all the aliases and add those regions back in */
        if (disp->add_aliases && count < max_regions) {
@@ -667,33 +669,22 @@ static int fdtgrep_find_regions(const void *fdt,
 
                new_count = fdt_add_alias_regions(fdt, region, count,
                                                  max_regions, &state);
-               if (new_count > max_regions) {
-                       region = malloc(new_count * sizeof(struct fdt_region));
-                       if (!region) {
-                               fprintf(stderr,
-                                       "Out of memory for %d regions\n",
-                                       count);
-                               return -1;
-                       }
-                       memcpy(region, state.region,
-                              count * sizeof(struct fdt_region));
-                       free(state.region);
-                       new_count = fdt_add_alias_regions(fdt, region, count,
-                                                         max_regions, &state);
+               if (new_count == -FDT_ERR_NOTFOUND) {
+                       /* No alias node found */
+               } else if (new_count < 0) {
+                       return new_count;
+               } else if (new_count <= max_regions) {
+                       /*
+                       * The alias regions will now be at the end of the list.
+                       * Sort the regions by offset to get things into the
+                       * right order
+                       */
+                       count = new_count;
+                       qsort(region, count, sizeof(struct fdt_region),
+                             h_cmp_region);
                }
-
-               /*
-                * The alias regions will now be at the end of the list. Sort
-                * the regions by offset to get things into the right order
-                */
-               qsort(region, new_count, sizeof(struct fdt_region),
-                     h_cmp_region);
-               count = new_count;
        }
 
-       if (ret != -FDT_ERR_NOTFOUND)
-               return ret;
-
        return count;
 }
 
@@ -805,7 +796,7 @@ static int do_fdtgrep(struct display_info *disp, const char *filename)
         * The first pass will count the regions, but if it is too many,
         * we do another pass to actually record them.
         */
-       for (i = 0; i < 2; i++) {
+       for (i = 0; i < 3; i++) {
                region = malloc(count * sizeof(struct fdt_region));
                if (!region) {
                        fprintf(stderr, "Out of memory for %d regions\n",
@@ -819,6 +810,9 @@ static int do_fdtgrep(struct display_info *disp, const char *filename)
                                disp->flags);
                if (count < 0) {
                        report_error("fdt_find_regions", count);
+                       if (count == -FDT_ERR_BADLAYOUT)
+                               fprintf(stderr,
+                                       "/aliases node must come before all other nodes\n");
                        return -1;
                }
                if (count <= max_regions)