[PATCH v6 00/25] fdt: Make OF_BOARD a boolean option
Ilias Apalodimas
ilias.apalodimas at linaro.org
Sat Dec 4 19:46:24 CET 2021
Hi Simon,
On Sat, Dec 04, 2021 at 10:25:29AM -0700, Simon Glass wrote:
> Hi Ilias,
>
> On Sat, 4 Dec 2021 at 08:58, Ilias Apalodimas
> <ilias.apalodimas at linaro.org> wrote:
> >
> > Hi Simon,
> >
> > [...]
> > > > [huge snip]
> > > > > > There's things that need to be cleaned up because we have some small
> > > > > > number of platforms that went off and did their own thing. But largely
> > > > > > yes, things make sense to me. We have:
> > > > > > - We embedded the device tree that will configure U-Boot, because there
> > > > > > is no way for the hardware to have provided us one.
> > > > > > - We do not embed the device tree that will configure U-Boot, because
> > > > > > there is already one present in memory for us to use.
> > > > > >
> > > > > > Then we have the developer option of:
> > > > > > - We embedded the device tree that will configure U-Boot, because we're
> > > > > > developing something.
> > > > >
> > > > > Yes, agreed those are the cases. To me this needs to be a run-time choice.
> > > >
> >
> > I am not convinced the case is "we are developing something". The
> > arguments for this are something along the lines of:
> > 1. U-Boot will fail to compile if OF_SEPARATE is selected and you provide
> > no DT so we need to include it. With which I disagree. The config option
> > says "You must provide an external device tree" for a reason.
>
> Where are you reading that? I'm lost.
In the XEN patch commit message [1]
>
> OF_SEPARATE means it is not embedded in U-Boot but is attached to the end of it.
>
> > 2. The DT's are hard to find. The 'hard to find' RPI DTs are in fact
> > committed in the kernel. I am not sure about the rest, but honestly this
> > isn't a convincing argument for me.
>
> Great, so you've solved that one but even that was confusing for me,
> as my patch should make clear. Every single board would be its own
> special snowflake if we went that way.
>
> So if they are in the kernel, we just need to put them in U-Boot too,
> so problem solved. The auto-sync thing that I believe Rob is working
> on will make things easy.
My problem is not usable DTs like the PRI4. My problem is the OF_BOARD
being a runtime option and always building that DT, while at the same time
introduce a third option to not include it in the binary. Another problem
is 'empty' DTs.
>
> >
> > What else are we gaining with it being a run time choice? One of the
>
> We are requiring a DT to be present in the U-Boot tree for
> development, documentation and discoverability purposes. Devs can turn
> OF_BOARD on and off as it suits them when iterating on a platform.
They can also do the same thing without tangling the 2 options. The *real*
problem is that in a month from now we'll get a patch saying "I need to
change X on RPI4 DTB because I have this special reason and I want a
specific u-boot binding" and then we are back at the start. We also have
OF_EMBED for the 'developer' option which is also mentioned explicitly in
the Kconfig.
>
> > things this approach does address, but we keep conveniently ignoring, is
> > that it tries to preserve the current status quo. You can go and add the
> > special missing U-Boot nodes in those DT's. So that would bypass problems
> > if the bindings get NAK'ed. But this is going to work against the
> > fragmentation we are trying to resolve.
>
> Well that's another reason why we need in-tree DTs at the moment. That
> reason goes away once we have our bindings upstream and are able to do
> what we need with DT there.
>
Again, that's a huge if. I am honestly not saying this in bad faith, but I
have my concerns on if and what gets upstreamed. So what this really does
in my head is preserve the current functionality. So what I am trying to
avoid here is, in case the bindings get NAK'ed, we go back and say "that's
fine we got this covered, look it's in docs and commit messages!"
> >
> > > > But it's not possible. That's the problem we keep going around and
> > > > around about. People keep raising real life examples where you cannot
> > > > make a run time choice between "device tree we're passed at run time"
> > > > and "device tree we're compiled with".
> > >
> > > I haven't seen one. The most extreme case is QEMU and it works fine. I
> > > even added a test with it. What am I missing?
>
> (I think my point there is made)
>
> >
> > IMHO 3b595da441cf is the commit that started the problem and tangled those
> > 2 options. Note that this support has been removed from the dragonboard
> > later in 0204d1b56b2f ....
>
> Yes it is one of them. There may be cases where we want to patch up
> the DT that U-Boot builds. In fact OF_BOARD does not mean it came from
> a prior stage. All sorts of things could be going on. We should not
> conflate building a DT with OF_BOARD.
It says 'board specific way'. To means that means we either create it on
the fly or inherit it. In the case you want to fixup the DTB provided by
OF_SEPARATE, there are _weak platform functions to patch that up.
You don't really need OF_BOARD for that, you can do that fine with OF_SEPARATE
and check fdtdec_board_setup().
>
> >
> > >
> > > >
> > > > And it's not helpful. It is ALWAYS the case that we know that we want
> > > > to override the run time device tree with our own, because it's a
> > > > developer developing things or it's a user / production case where we
> > > > must use the provided tree. NOT doing that is what leads to madness
> > > > like we see for example on Pi where if we don't use the passed tree we
> > > > still need to copy X/Y/Z out of it.
> > >
> > > Aren't you talking about the distro DT there, rather than the the one
> > > on the boot disk? That is my reading of that patch. If we need to do
> > > that sort of thing, it doesn't matter where the the cointrol DT comes
> > > from. You are still going to have to do that sort of thing.
> > >
> > > It is not ALWAYS the case. I've shown you how easy it is to disable
> > > OF_BOARD and still boot / iterate.
> > >
> > > >
> > > > > > > Are you looking to have an empty DT in u-boot.bin? Perhaps we should
> > > > > > > provide a way to do that? But what is driving that desire?
> > > > > >
> > > > > > I'm looking for ways to convince you that we do not need to include a
> > > > > > device tree in the binary. There's a growing set of devices where the
> > > > > > device tree exists with the device. If it's missing, that's a huge
> > > > > > fatal error we can't do all that much about. If we need to do something
> > > > > > to that device tree for U-Boot, yes, fine, we should make it straight
> > > > > > forward for the developer to do that. But that's not the common case!
> > > > >
> > > > > Well we could add another Kconfig which tells U-Boot not to include a
> > > > > devicetree in u-boot.bin, if that would resolve this?
> > > > >
> > > > > I just want to make sure that we always build the devicetrees and that
> > > > > it is easy for a knowledgeable dev to switch over to use them, without
> > > > > spelunking through dozens of other projects to discover the secret DT
> > > > > that no one will tell us about.
> >
> > So the translation of this for me is:
> > We have 2 discrete options (that can be cleaned up further) which choose
> > either to embed or receive the DTB. Let's tangle them and introduce a
> > *new* third option to separate them if someone needs to. Which makes no
> > sense to me.
>
> Embed is confusing because OF_EMBED means to link it into U-Boot (just
> used for debugging)
>
Which as I said, it's what development should use?
> I think this is the core of the problem. There are just lots of ideas
> about how all of this should work. Please try out the series and see
> if you find any problems. Then we can talk about actual issues rather
> than things that might happen.
I am pretty sure the patches work. I never doubted that. What I don't love
is the architecture and the way it entangles the existing options.
>
> The two options you refer to are OF_SEPARATE and OF_BOARD. We will
> perhaps have OF_PASSAGE at some point. We already have OF_EMBED.
>
> To me, OF_BOARD and OF_PASSAGE are run-time things because they
> indicate what we expect to happen at runtime. If something goes wrong,
> we might still be able to print an error message, if we have a backup
> DT.
I don't see a point saving a developer from a mistake. I'd much rather
crash as loudly as possible to indicate "HEY YOU MESSED UP", instead of
hiding a problem he might miss under the mat.
Maybe I am missing something, but OF_PASSAGE seems superfluous to me.
OF_SEPARATE and OF_BOARD cover all the cases I can think of.
>
> But OF_BOARD and OF_PASSAGE are not related to the build itself. IMO
> OF_BOARD is underspecified. One day I would like to move towards
> defining these cases better, e.g.
>
> - DT is passed in a register (rpi and apple_m1, stm32mp, RISC-V, qemu
> RISC-V, bcmstb, Octeon, Xen)
> - DT is at a fixed address (qemu, highbank, socrates, qemu ppc)
> - DT is in a file (sandbox)
Again I might be missing something but to me:
1. OF_SEPARATE = provided by u-boot. If someone wants to fix that up we
got a number of ways already.
2. OF_BOARD providing with magic somehow at runtime (prior loader,
constructed at runtime, read from a flash, whatever).
3. OF_EMBED whatever special developer case we want to use it for.
>
> IMO many of these could all be handled with standard passage, i.e. in
> a standard way.
>
[...]
>
> Regards,
> Simon
[1] https://lore.kernel.org/u-boot/20211204180318.GV1220664@bill-the-cat/T/#m543a10a4b558ccd540fa425d61106ea515393105
Regards
/Ilias
More information about the U-Boot
mailing list