[Patch] fdt: Use phandle to distinguish DT nodes with same name

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[Patch] fdt: Use phandle to distinguish DT nodes with same name

Aswath Govindraju
While assigning the sequence number to subsystem instances by reading the
aliases property, only DT nodes names are compared and not the complete
path. This causes a problem when there are two DT nodes with same name but
have different paths.

Fix it by comparing the phandles of DT nodes after the node names match.

Signed-off-by: Aswath Govindraju <[hidden email]>
---
 lib/fdtdec.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index 2015907dee7d..9e1bfe0b519e 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -478,6 +478,11 @@ int fdtdec_get_alias_seq(const void *blob, const char *base, int offset,
  slash = strrchr(prop, '/');
  if (strcmp(slash + 1, find_name))
  continue;
+
+ if (fdt_get_phandle(blob, offset) !=
+    fdt_get_phandle(blob, fdt_path_offset(blob, prop)))
+ continue;
+
  val = trailing_strtol(name);
  if (val != -1) {
  *seqp = val;
--
2.17.1

Reply | Threaded
Open this post in threaded view
|

Re: [Patch] fdt: Use phandle to distinguish DT nodes with same name

Simon Glass-3
Hi Aswath,

On Wed, 11 Nov 2020 at 07:26, Aswath Govindraju <[hidden email]> wrote:

>
> While assigning the sequence number to subsystem instances by reading the
> aliases property, only DT nodes names are compared and not the complete
> path. This causes a problem when there are two DT nodes with same name but
> have different paths.
>
> Fix it by comparing the phandles of DT nodes after the node names match.
>
> Signed-off-by: Aswath Govindraju <[hidden email]>
> ---
>  lib/fdtdec.c | 5 +++++
>  1 file changed, 5 insertions(+)

fdt_path_offset() is slow. Could we just add this for the livetree
case perhaps, thus avoiding the speed penalty?

Can you also add a case where this causes a problem?

>
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index 2015907dee7d..9e1bfe0b519e 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -478,6 +478,11 @@ int fdtdec_get_alias_seq(const void *blob, const char *base, int offset,
>                 slash = strrchr(prop, '/');
>                 if (strcmp(slash + 1, find_name))
>                         continue;
> +
> +               if (fdt_get_phandle(blob, offset) !=
> +                   fdt_get_phandle(blob, fdt_path_offset(blob, prop)))
> +                       continue;
> +
>                 val = trailing_strtol(name);
>                 if (val != -1) {
>                         *seqp = val;
> --
> 2.17.1
>

Regards,
Simon