[PATCH 2/2] dm: core: Walk the tree to find address- and size-cells properties

matthias.bgg at kernel.org matthias.bgg at kernel.org
Wed Apr 8 11:35:28 CEST 2020


From: Matthias Brugger <mbrugger at suse.com>

Walk the tree when reading size-cells or address-cells properties.

Reported-by: Robin Randhawa <Robin.Randhawa at ARM.com>
Signed-off-by: Matthias Brugger <mbrugger at suse.com>

---

 drivers/core/ofnode.c |  8 ++++----
 include/dm/ofnode.h   | 36 ++++++++++++++++++++++++++++++++++++
 include/dm/read.h     |  6 ++----
 3 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
index 96a5dd20bd..5f23826b70 100644
--- a/drivers/core/ofnode.c
+++ b/drivers/core/ofnode.c
@@ -697,16 +697,16 @@ int ofnode_read_addr_cells(ofnode node)
 {
 	if (ofnode_is_np(node))
 		return of_n_addr_cells(ofnode_to_np(node));
-	else  /* NOTE: this call should walk up the parent stack */
-		return fdt_address_cells(gd->fdt_blob, ofnode_to_offset(node));
+	else
+		return __ofnode_read_address_cells(node);
 }
 
 int ofnode_read_size_cells(ofnode node)
 {
 	if (ofnode_is_np(node))
 		return of_n_size_cells(ofnode_to_np(node));
-	else  /* NOTE: this call should walk up the parent stack */
-		return fdt_size_cells(gd->fdt_blob, ofnode_to_offset(node));
+	else
+		return __ofnode_read_size_cells(node);
 }
 
 int ofnode_read_simple_addr_cells(ofnode node)
diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h
index b5a50e8849..c6b768763d 100644
--- a/include/dm/ofnode.h
+++ b/include/dm/ofnode.h
@@ -660,6 +660,24 @@ int ofnode_read_pci_vendev(ofnode node, u16 *vendor, u16 *device);
  */
 int ofnode_read_addr_cells(ofnode node);
 
+static inline int __ofnode_read_address_cells(ofnode node)
+{
+	/* NOTE: this call walks up the parent stack */
+	int val = -FDT_ERR_NOTFOUND;
+	ofnode nd = node;
+
+	while (val == -FDT_ERR_NOTFOUND) {
+		val = fdt_cells(gd->fdt_blob, ofnode_to_offset(nd),
+				"#address-cells");
+		nd = ofnode_get_parent(nd);
+	}
+
+	if (val == -FDT_ERR_NOTFOUND)
+		return OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
+	else
+		return val;
+}
+
 /**
  * ofnode_read_size_cells() - Get the number of size cells for a node
  *
@@ -671,6 +689,24 @@ int ofnode_read_addr_cells(ofnode node);
  */
 int ofnode_read_size_cells(ofnode node);
 
+static inline int __ofnode_read_size_cells(ofnode node)
+{
+	/* NOTE: this call walks up the parent stack */
+	int val = -FDT_ERR_NOTFOUND;
+	ofnode nd = node;
+
+	while (val == -FDT_ERR_NOTFOUND) {
+		val = fdt_cells(gd->fdt_blob, ofnode_to_offset(nd),
+				"#size-cells");
+		nd = ofnode_get_parent(nd);
+	}
+
+	if (val == -FDT_ERR_NOTFOUND)
+		return OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
+	else
+		return val;
+}
+
 /**
  * ofnode_read_simple_addr_cells() - Get the address cells property in a node
  *
diff --git a/include/dm/read.h b/include/dm/read.h
index da8c7f25e7..0302c7bffb 100644
--- a/include/dm/read.h
+++ b/include/dm/read.h
@@ -789,14 +789,12 @@ static inline int dev_count_phandle_with_args(const struct udevice *dev,
 
 static inline int dev_read_addr_cells(const struct udevice *dev)
 {
-	/* NOTE: this call should walk up the parent stack */
-	return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev));
+	return __ofnode_read_address_cells(dev_ofnode(dev));
 }
 
 static inline int dev_read_size_cells(const struct udevice *dev)
 {
-	/* NOTE: this call should walk up the parent stack */
-	return fdt_size_cells(gd->fdt_blob, dev_of_offset(dev));
+	return __ofnode_read_size_cells(dev_ofnode(dev));
 }
 
 static inline int dev_read_simple_addr_cells(const struct udevice *dev)
-- 
2.26.0



More information about the U-Boot mailing list