All of lore.kernel.org
 help / color / mirror / Atom feed
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

             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.