diff mbox series

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

Message ID 20200408093528.24276-3-matthias.bgg@kernel.org
State New
Headers show
Series Reading size-cells and address-cells from a node should walk up the | expand

Commit Message

Matthias Brugger April 8, 2020, 9:35 a.m. UTC
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(-)

Comments

Simon Glass April 9, 2020, 4:25 p.m. UTC | #1
Hi Matthias,

On Wed, 8 Apr 2020 at 03:35, <matthias.bgg at kernel.org> wrote:
>
> 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(-)
>

Please can you send these upstream? I think you'll need to add a test
when doing that, too.

Regards,
Simon
Matthias Brugger April 11, 2020, 6:05 p.m. UTC | #2
Hi Simon,

On 4/9/20 6:25 PM, Simon Glass wrote:
> Hi Matthias,
> 
> On Wed, 8 Apr 2020 at 03:35, <matthias.bgg at kernel.org> wrote:
>>
>> 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(-)
>>
> 
> Please can you send these upstream? I think you'll need to add a test
> when doing that, too.
> 

What is the upstream project for drivers/core/ofnode.c? I wasn't able to
find it.

Regards,
Matthias
Simon Glass April 19, 2020, 11:37 p.m. UTC | #3
Hi Matthias,

On Sat, 11 Apr 2020 at 12:05, Matthias Brugger <matthias.bgg at gmail.com> wrote:
>
> Hi Simon,
>
> On 4/9/20 6:25 PM, Simon Glass wrote:
> > Hi Matthias,
> >
> > On Wed, 8 Apr 2020 at 03:35, <matthias.bgg at kernel.org> wrote:
> >>
> >> 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(-)
> >>
> >
> > Please can you send these upstream? I think you'll need to add a test
> > when doing that, too.
> >
>
> What is the upstream project for drivers/core/ofnode.c? I wasn't able to
> find it.

Sorry I meant the other patch...

This one:

Reviewed-by: Simon Glass <sjg at chromium.org>

Regards,
Simon
diff mbox series

Patch

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)