[U-Boot] [PATCH] dm: fdtdec: Check full path for alias
Simon Glass
sjg at chromium.org
Wed Apr 20 16:41:52 CEST 2016
Hi Michal,
On 14 April 2016 at 07:02, Michal Simek <michal.simek at xilinx.com> wrote:
> Fix fdtdec_get_alias_seq() which is not checking full path to certain
> node and it incorrectly provides incorrect seq number.
> Checking full path ensure that if alias is present correct seq number is
> return.
> This problem was found on ZynqMP zcu102 where are several I2C muxes
> where the first bus name is i2c at 0 and for following muxes incorrect seq
> numbers are return.
>
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>
> ---
>
> I am not sure if there is any macro for max alias length which I can use
> instead of new macro.
>
> Before:
> ZynqMP> i2c bus
> Bus 0: i2c at ff020000
> 20: gpio at 20, offset len 1, flags 0
> 21: gpio at 21, offset len 1, flags 0
> 75: i2cswitch at 75, offset len 1, flags 0
> Bus 750: i2c at 0
> Bus 751: i2c at 1
> Bus 752: i2c at 2
> Bus 1: i2c at ff030000
> 74: i2cswitch at 74, offset len 1, flags 0
> 75: i2cswitch at 75, offset len 1, flags 0
> Bus 750: i2c at 0
Sorry I'm a bit confused by this. Do you have two i2c at 0 buses?
> Bus 751: i2c at 1
> Bus 752: i2c at 2
> Bus 1743: i2c at 3
> Bus 1744: i2c at 4
> Bus 750: i2c at 0
> Bus 751: i2c at 1
> Bus 752: i2c at 2
> Bus 1743: i2c at 3
> Bus 1744: i2c at 4
> Bus 1755: i2c at 5
> Bus 1756: i2c at 6
> Bus 1757: i2c at 7
>
> After:
> ZynqMP> i2c bus
> Bus 0: i2c at ff020000
> 20: gpio at 20, offset len 1, flags 0
> 21: gpio at 21, offset len 1, flags 0
> 75: i2cswitch at 75, offset len 1, flags 0
> Bus 750: i2c at 0
> Bus 751: i2c at 1
> Bus 752: i2c at 2
> Bus 1: i2c at ff030000
> 74: i2cswitch at 74, offset len 1, flags 0
> 75: i2cswitch at 75, offset len 1, flags 0
> Bus 1740: i2c at 0
> Bus 1741: i2c at 1
> Bus 1742: i2c at 2
> Bus 1743: i2c at 3
> Bus 1744: i2c at 4
> Bus 1750: i2c at 0
> Bus 1751: i2c at 1
> Bus 1752: i2c at 2
> Bus 1753: i2c at 3
> Bus 1754: i2c at 4
> Bus 1755: i2c at 5
> Bus 1756: i2c at 6
> Bus 1757: i2c at 7
>
> Which reflects my aliases
> i2c0 = &i2c0;
> i2c750 = &i2c0_75_0;
> i2c751 = &i2c0_75_1;
> i2c752 = &i2c0_75_2;
> i2c1 = &i2c1;
> i2c1740 = &i2c1_74_0;
> i2c1741 = &i2c1_74_1;
> i2c1742 = &i2c1_74_2;
> i2c1743 = &i2c1_74_3;
> i2c1744 = &i2c1_74_4;
> i2c1750 = &i2c1_75_0;
> i2c1751 = &i2c1_75_1;
> i2c1752 = &i2c1_75_2;
> i2c1753 = &i2c1_75_3;
> i2c1754 = &i2c1_75_4;
> i2c1755 = &i2c1_75_5;
> i2c1756 = &i2c1_75_6;
> i2c1757 = &i2c1_75_7;
I only see one in you aliases above.
>
> ---
> lib/fdtdec.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index 70acc29c924d..79efcf0cd6b0 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -506,6 +506,8 @@ int fdtdec_add_aliases_for_id(const void *blob, const char *name,
> return num_found;
> }
>
> +#define FDT_ALIAS_PATH_LEN 64
> +
> int fdtdec_get_alias_seq(const void *blob, const char *base, int offset,
> int *seqp)
> {
> @@ -514,9 +516,13 @@ int fdtdec_get_alias_seq(const void *blob, const char *base, int offset,
> int find_namelen;
> int prop_offset;
> int aliases;
> + char buf[FDT_ALIAS_PATH_LEN];
> +
> + fdt_get_path(blob, offset, buf, sizeof(buf));
Eek! That is pretty expensive.
>
> find_name = fdt_get_name(blob, offset, &find_namelen);
> - debug("Looking for '%s' at %d, name %s\n", base, offset, find_name);
> + debug("Looking for '%s' at %d, name %s, buf %s\n",
> + base, offset, find_name, buf);
>
> aliases = fdt_path_offset(blob, "/aliases");
> for (prop_offset = fdt_first_property_offset(blob, aliases);
> @@ -533,6 +539,13 @@ int fdtdec_get_alias_seq(const void *blob, const char *base, int offset,
> strncmp(name, base, base_len))
> continue;
>
> + if (len >= FDT_ALIAS_PATH_LEN)
> + printf("Too long path in aliases node\n");
Can you return an error and make it debug() here?
> +
> + /* Check full path first not to point to incorrect alias */
> + if (strncmp(prop, buf, min(len, FDT_ALIAS_PATH_LEN)))
> + continue;
> +
> slash = strrchr(prop, '/');
> if (strcmp(slash + 1, find_name))
> continue;
> --
> 1.9.1
>
Regards,
Simon
More information about the U-Boot
mailing list