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 |
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
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
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 --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)