[PATCH] fdtdec: fdtdec_get_aliases_highest_id: skip aliases to disabled nodes
Simon Glass
sjg at chromium.org
Sun Jul 4 21:24:29 CEST 2021
Hi Tim,
On Fri, 11 Jun 2021 at 11:30, Tim Harvey <tharvey at gateworks.com> wrote:
>
> On Fri, Jun 11, 2021 at 10:23 AM Sean Anderson <sean.anderson at seco.com> wrote:
> >
> >
> >
> > On 6/11/21 1:16 PM, Tim Harvey wrote:
> > > On Fri, Jun 11, 2021 at 10:09 AM Sean Anderson <sean.anderson at seco.com> wrote:
> > >>
> > >>
> > >>
> > >> On 6/11/21 12:32 PM, Tim Harvey wrote:
> > >> > On Thu, Apr 29, 2021 at 9:48 AM Tim Harvey <tharvey at gateworks.com> wrote:
> > >> >>
> > >> >> On Thu, Apr 29, 2021 at 9:10 AM Simon Glass <sjg at chromium.org> wrote:
> > >> >>>
> > >> >>> Hi Tim,
> > >> >>>
> > >> >>> On Fri, 16 Apr 2021 at 14:30, Tim Harvey <tharvey at gateworks.com> wrote:
> > >> >>>>
> > >> >>>> When looking for an alias with the highest id skip aliases for nodes
> > >> >>>> that are disabled.
> > >> >>>>
> > >> >>>> Signed-off-by: Tim Harvey <tharvey at gateworks.com>
> > >> >>>> ---
> > >> >>>> lib/fdtdec.c | 2 ++
> > >> >>>> 1 file changed, 2 insertions(+)
> > >> >>>>
> > >> >>>> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> > >> >>>> index 864589193b..d47195525a 100644
> > >> >>>> --- a/lib/fdtdec.c
> > >> >>>> +++ b/lib/fdtdec.c
> > >> >>>> @@ -546,6 +546,8 @@ int fdtdec_get_alias_highest_id(const void *blob, const char *base)
> > >> >>>> if (*prop != '/' || prop[len - 1] ||
> > >> >>>> strncmp(name, base, base_len))
> > >> >>>> continue;
> > >> >>>> + if (!fdtdec_get_is_enabled(blob, fdt_path_offset(blob, prop)))
> > >> >>>> + continue;
> > >> >>>
> > >> >>> We really can't do this here. It is quite an expensive operation to
> > >> >>> locate the node for a path.
> > >> >>>
> > >> >>> Why is this needed? It seems odd to have an alias pointing to a disabled device.
> > >> >>>
> > >> >>
> > >> >> Simon,
> > >> >>
> > >> >> The issue I ran into here was with an imx6 based board that does not
> > >> >> use the FEC ethernet on the SoC. In this case imx6qdl.dtsi delcares an
> > >> >> alias 'thernet0 = &fec' yet the fec node is not enabled. However
> > >> >> because fdtdec_get_alias_highest_id does not skip this alias to a
> > >> >> disabled device any enumerated ethernet devices get an index of 1
> > >> >> instead of 0 which is incorrect and causes the mac addresses to be
> > >> >> misaligned.
> > >>
> > >> Is this due getting mac address from the OTP? As I understand it, the
> > >> OTP mac addresses are for fec0/fec1, and not for whatever ethernet0
> > >> happens to be.
> > >>
> > >
> > > Sean,
> > >
> > > No, the issue is that U-Boot thinks there is an fec device simply
> > > because an alias points to it even though the fec node pointed to is
> > > disabled so when U-Boot finds an ethernet device that is enumerated at
> > > runtime (think pcie or usb based mac) those start at index 1 instead
> > > of index 0 and end up wanting to be assigned mac's from eth1addr
> > > instead of ethaddr.
> >
> > Ok, and this behavior was different in the past? E.g. it used to be that
> > these interfaces were assigned to ethernet0, and so their mac address
> > was stored in ethaddr. And then something changed and now they are
> > ethernet1 and are trying to get the incorrect mac address?
> >
>
> Sean,
>
> Yes, in the past before using driver-model this did not occur as
> everything was statically declared in board files.
>
> > Do you know whether it would be possible to remove the alias at the same
> > time you mark the fec as disabled?
> >
>
> The dt's are all merged together. The base SoC dt declares the alias
> to internal fec ethernet device and that alias can be overridden by
> any dts that includes that base soc dt but if you have a gbe that is
> discovered and not declared in dt there will be no alias to override
> it. When I submitted this patch I looked at what the kernel code did
> and noticed it did not reserve indexes/slots for disabled devices so I
> figure that's what the bootloader should do also.
Can you try enabled OF_LIVE? It is possible that it might be different
there. Even if not, it should be a cheap fix.
As mentioned the problem with your patch is that the path operation is
very expensive. I'm fine with it if you want to add it as a new CONFIG
option, so it doesn't affect all platforms. But if you do that, please
do update test-fdt.c for the sandbox tests.
Regards,
Simon
More information about the U-Boot
mailing list