From: Simon Glass <sjg@chromium.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] fdtgrep: Copy with the /aliases node being last
Date: Sun, 2 Apr 2017 12:26:44 -0600 [thread overview]
Message-ID: <20170402182644.15239-1-sjg@chromium.org> (raw)
With skeleton.dtsi being dropped it is more likely that the /aliases node
will be last in the device tree. Update fdtgrep to handle this.
Signed-off-by: Simon Glass <sjg@chromium.org>
---
lib/libfdt/fdt_region.c | 40 +++++++++++++++++++++++++++++++++++-----
tools/fdtgrep.c | 3 ---
2 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/lib/libfdt/fdt_region.c b/lib/libfdt/fdt_region.c
index d2ce4c1c53..8b8a547555 100644
--- a/lib/libfdt/fdt_region.c
+++ b/lib/libfdt/fdt_region.c
@@ -63,6 +63,30 @@ static int region_list_contains_offset(struct fdt_region_state *info,
return 0;
}
+/**
+ * fdt_add_alias_regions() - Add regions covering the aliases that we want
+ *
+ * The /aliases node is not automatically included by fdtgrep unless the
+ * command-line arguments cause to be included (or not excluded). However
+ * aliases are special in that we generally want to include those which
+ * reference a node that fdtgrep includes.
+ *
+ * In fact we want to include only aliases for those nodes still included in
+ * the fdt, and drop the other aliases since they point to nodes that will not
+ * be present.
+ *
+ * This function scans the aliases and adds regions for those which we want
+ * to keep.
+ *
+ * @fdt: Device tree to scan
+ * @region: List of regions
+ * @count: Number of regions in the list so far (i.e. starting point for this
+ * function)
+ * @max_regions: Maximum number of regions in @region list
+ * @info: Place to put the region state
+ * @return number of regions after processing, or -FDT_ERR_NOSPACE if we did
+ * not have enough room in the regions table for the regions we wanted to add.
+ */
int fdt_add_alias_regions(const void *fdt, struct fdt_region *region, int count,
int max_regions, struct fdt_region_state *info)
{
@@ -74,11 +98,17 @@ int fdt_add_alias_regions(const void *fdt, struct fdt_region *region, int count,
if (node < 0)
return -FDT_ERR_NOTFOUND;
- /* The aliases node must come before the others */
+ /*
+ * Find the next node so that we know where the /aliases node ends. We
+ * need special handling if /aliases is the last node.
+ */
node_end = fdt_next_subnode(fdt, node);
- if (node_end <= 0)
- return -FDT_ERR_BADLAYOUT;
- node_end -= sizeof(fdt32_t);
+ if (node_end == -FDT_ERR_NOTFOUND)
+ /* Move back to the FDT_END_NODE tag of '/' */
+ node_end = fdt_size_dt_struct(fdt) - sizeof(fdt32_t) * 2;
+ else if (node_end < 0) /* other error */
+ return node_end;
+ node_end -= sizeof(fdt32_t); /* Move to FDT_END_NODE tag of /aliases */
did_alias_header = 0;
info->region = region;
@@ -109,7 +139,7 @@ int fdt_add_alias_regions(const void *fdt, struct fdt_region *region, int count,
fdt_add_region(info, base + offset, next - offset);
}
- /* Add the 'end' tag */
+ /* Add the FDT_END_NODE tag */
if (did_alias_header)
fdt_add_region(info, base + node_end, sizeof(fdt32_t));
diff --git a/tools/fdtgrep.c b/tools/fdtgrep.c
index b9078273c9..e373c43e36 100644
--- a/tools/fdtgrep.c
+++ b/tools/fdtgrep.c
@@ -810,9 +810,6 @@ 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)
--
2.12.2.564.g063fe858b8-goog
next reply other threads:[~2017-04-02 18:26 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-02 18:26 Simon Glass [this message]
2017-04-03 0:33 ` [U-Boot] [PATCH] fdtgrep: Copy with the /aliases node being last Masahiro Yamada
2017-04-03 1:05 ` Simon Glass
2017-04-13 21:16 ` Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170402182644.15239-1-sjg@chromium.org \
--to=sjg@chromium.org \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.