From: Michal Simek <michal.simek@xilinx.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] dm: fdtdec: Check full path for alias
Date: Thu, 21 Apr 2016 06:47:28 +0200 [thread overview]
Message-ID: <57185B60.4020403@xilinx.com> (raw)
In-Reply-To: <CAPnjgZ1UJO3yBkjqP+DfVdhehOxnug=JfQgEDVB5EV=UttNuvQ@mail.gmail.com>
Hi Simon,
On 20.4.2016 16:41, Simon Glass wrote:
> Hi Michal,
>
> On 14 April 2016 at 07:02, Michal Simek <michal.simek@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@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?
Yes there are two i2c IP cores. It means 2 main i2c busses.
Here is full i2c description
arch/arm/dts/zynqmp-zcu102.dts
I have pushed my hacky/testing tree here with these changes.
u-boot-microblaze.git xnext/i2c
>
>> 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.
i2c0 and i2c1 are that main one.
>
>>
>> ---
>> 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.
How to do it better?
>
>>
>> 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?
Error code?
>
>> +
>> + /* 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
>>
Thanks,
Michal
next prev parent reply other threads:[~2016-04-21 4:47 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-14 13:02 [U-Boot] [PATCH] dm: fdtdec: Check full path for alias Michal Simek
2016-04-14 15:24 ` Stephen Warren
2016-04-20 14:41 ` Simon Glass
2016-04-21 4:47 ` Michal Simek [this message]
2016-05-01 18:54 ` Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=57185B60.4020403@xilinx.com \
--to=michal.simek@xilinx.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.