On 19/05/2022 12.41, Aswath Govindraju wrote: > Hi Rasmus, > > On 19/05/22 14:40, Rasmus Villemoes wrote: >> Asking if the alias we found actually points at the device tree node >> we passed in (in the guise of its offset from blob) can be done simply >> by asking if the fdt_path_offset() of the alias' path is identical to >> offset. >> >> In fact, the current method suffers from the possibility of false >> negatives: dtc does not necessarily emit a phandle property for a node >> just because it is referenced in /aliases; it only emits a phandle >> property for a node if it is referenced in <angle brackets> >> somewhere. So if both the node we passed in and the alias node we're >> considering don't have phandles, fdt_get_phandle() returns 0 for both. >> >> Since the proper check is so simple, there's no reason to hide that >> behind a config option (and if one really wanted that, it should be >> called something else because there's no need to involve phandle in >> the check). >> >> Signed-off-by: Rasmus Villemoes <rasmus.villem...@prevas.dk> >> --- >> configs/am65x_evm_a53_defconfig | 1 - >> configs/evb-ast2600_defconfig | 1 - >> configs/sama7g5ek_mmc1_defconfig | 1 - >> configs/sama7g5ek_mmc_defconfig | 1 - >> lib/Kconfig | 7 ------- >> lib/fdtdec.c | 7 ++----- >> 6 files changed, 2 insertions(+), 16 deletions(-) >> >> diff --git a/configs/am65x_evm_a53_defconfig >> b/configs/am65x_evm_a53_defconfig >> index 9f41b397c3..a635d6d137 100644 >> --- a/configs/am65x_evm_a53_defconfig >> +++ b/configs/am65x_evm_a53_defconfig >> @@ -170,4 +170,3 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0451 >> CONFIG_USB_GADGET_PRODUCT_NUM=0x6162 >> CONFIG_USB_GADGET_DOWNLOAD=y >> CONFIG_OF_LIBFDT_OVERLAY=y >> -CONFIG_PHANDLE_CHECK_SEQ=y >> diff --git a/configs/evb-ast2600_defconfig b/configs/evb-ast2600_defconfig >> index ea75762926..015df20f09 100644 >> --- a/configs/evb-ast2600_defconfig >> +++ b/configs/evb-ast2600_defconfig >> @@ -84,4 +84,3 @@ CONFIG_WDT=y >> CONFIG_SHA384=y >> CONFIG_HEXDUMP=y >> # CONFIG_EFI_LOADER is not set >> -CONFIG_PHANDLE_CHECK_SEQ=y >> diff --git a/configs/sama7g5ek_mmc1_defconfig >> b/configs/sama7g5ek_mmc1_defconfig >> index 42d96f7c02..3f33eb1142 100644 >> --- a/configs/sama7g5ek_mmc1_defconfig >> +++ b/configs/sama7g5ek_mmc1_defconfig >> @@ -76,4 +76,3 @@ CONFIG_TIMER=y >> CONFIG_MCHP_PIT64B_TIMER=y >> CONFIG_OF_LIBFDT_OVERLAY=y >> # CONFIG_EFI_LOADER_HII is not set >> -CONFIG_PHANDLE_CHECK_SEQ=y >> diff --git a/configs/sama7g5ek_mmc_defconfig >> b/configs/sama7g5ek_mmc_defconfig >> index e03a6ba9af..6266eb0b59 100644 >> --- a/configs/sama7g5ek_mmc_defconfig >> +++ b/configs/sama7g5ek_mmc_defconfig >> @@ -76,4 +76,3 @@ CONFIG_TIMER=y >> CONFIG_MCHP_PIT64B_TIMER=y >> CONFIG_OF_LIBFDT_OVERLAY=y >> # CONFIG_EFI_LOADER_HII is not set >> -CONFIG_PHANDLE_CHECK_SEQ=y >> diff --git a/lib/Kconfig b/lib/Kconfig >> index acc0ac081a..884569f9b1 100644 >> --- a/lib/Kconfig >> +++ b/lib/Kconfig >> @@ -958,11 +958,4 @@ config LMB_RESERVED_REGIONS >> Define the number of supported reserved regions in the library logical >> memory blocks. >> >> -config PHANDLE_CHECK_SEQ >> - bool "Enable phandle check while getting sequence number" >> - 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. >> - >> endmenu >> diff --git a/lib/fdtdec.c b/lib/fdtdec.c >> index e20f6aad9c..ffa78f97ca 100644 >> --- a/lib/fdtdec.c >> +++ b/lib/fdtdec.c >> @@ -516,11 +516,8 @@ int fdtdec_get_alias_seq(const void *blob, const char >> *base, int offset, >> * 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; >> - } >> + if (offset != fdt_path_offset(blob, prop)) >> + continue; > > The offset over here is the offset of the dt node
Yes. > and the offset that we > get from fdt_path_offset(blob, prop) is the offset of the aliases > property. No. Here "prop" is the value of the property under the /aliases node with the name "name", i.e. if you have aliases { ethernet0 = "/soc@0/bus@30800000/ethernet@30be0000"; } then name would be "ethernet0" and "prop" would be "/soc@0/bus@30800000/ethernet@30be0000". That's why there's some sanity checks on prop before this, i.e. the value must start with a '/' and must be a proper nul-terminated string: if (len < find_namelen || *prop != '/' || prop[len - 1] || strncmp(name, base, base_len)) continue; The next check then matches the basename of that path against the name of the node passed in: slash = strrchr(prop, '/'); if (strcmp(slash + 1, find_name)) continue; And then fdt_path_offset() simply follows the given path from the root of blob to that node and returns its offset. [Yes, fdt_path_offset() also supports non-absolute paths and in that case does an alias lookup by itself, but we're not passing the alias, we're passing the value of that alias which is the absolute path.] > I don't think these both offsets will match for any case. That > is the reason behind comparing phandles and not offsets. It does, I've tested it. > Also, as fdt_path_offset() slow and this would effect the U-Boot > startup. First, we only get to do that fdt_path_offset() if the node names actually match, so it's not for each and every alias lookup. Second, as I pointed out, it's somewhat fragile to rely on (at least one of) the nodes in question to even have a phandle. > To avert the time penalty on all boards, this extra check > put under a config option. I prefer correctness out-of-the-box instead of having to discover some config knob, while also somehow making sure that all nodes do get phandles. And since this no longer does two fdt_get_phandle() calls, the overhead is much smaller. I really doubt you can measure any difference in boot time. If you can, let's add a config option, but make it opt-out with a help text that says "only disable this if you know you never have two nodes with the same node name". Rasmus