public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
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

  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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox