fdt: Use phandle to distinguish DT nodes with same name
authorAswath Govindraju <a-govindraju@ti.com>
Thu, 3 Dec 2020 05:25:45 +0000 (10:55 +0530)
committerSimon Glass <sjg@chromium.org>
Wed, 23 Dec 2020 03:39:25 +0000 (20:39 -0700)
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.

In arch/arm/dts/k3-am65-main.dtsi there are two USB controllers with the
same device tree node name but different path. When aliases are defined for
these USB controllers then fdtdec_get_alias_seq() fails to pick the correct
instance for a given index.

fdt_path_offset() function is slow and this would effect the U-Boot
startup. To avert the time penalty on all boards, apply this extra check
only when required by using a config option.

Fix it by comparing the phandles of DT nodes after the node names match,
under a config option.

Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Fix whitespace error in Kconfig:
Signed-off-by: Simon Glass <sjg@chromium.org>
lib/Kconfig
lib/fdtdec.c

index 06eb8d0..a704568 100644 (file)
@@ -699,3 +699,11 @@ config LIB_ELF
          This supports fir 32 bit and 64 bit versions.
 
 endmenu
+
+config PHANDLE_CHECK_SEQ
+       bool "Enable phandle check while getting sequence number"
+       default n
+       help
+         When there are multiple device tree nodes with same name,
+          enable this config option to distinguish them using
+         phandles in fdtdec_get_alias_seq() function.
index ee1bd41..0ab7105 100644 (file)
@@ -500,6 +500,17 @@ int fdtdec_get_alias_seq(const void *blob, const char *base, int offset,
                slash = strrchr(prop, '/');
                if (strcmp(slash + 1, find_name))
                        continue;
+
+               /*
+                * Adding an extra check to distinguish DT nodes with
+                * same name
+                */
+               if (IS_ENABLED(CONFIG_PHANDLE_CHECK_SEQ)) {
+                       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;