[PATCH v3 4/8] dts: Add alternative location for upstream DTB builds

Tom Rini trini at konsulko.com
Sun Dec 31 21:39:53 CET 2023


On Sun, Dec 31, 2023 at 07:28:52AM -0700, Simon Glass wrote:
> Hi Sumit,
> 
> On Fri, Dec 29, 2023 at 8:30 AM Sumit Garg <sumit.garg at linaro.org> wrote:
> >
> > On Fri, 29 Dec 2023 at 01:18, Simon Glass <sjg at chromium.org> wrote:
> > >
> > > Hi Tom,
> > >
> > > On Thu, Dec 28, 2023 at 3:54 PM Tom Rini <trini at konsulko.com> wrote:
> > > >
> > > > On Thu, Dec 28, 2023 at 03:09:12PM +0000, Simon Glass wrote:
> > > > > Hi Tom, Sumit,
> > > > >
> > > > > On Thu, Dec 28, 2023 at 2:03 PM Tom Rini <trini at konsulko.com> wrote:
> > > > > >
> > > > > > On Thu, Dec 28, 2023 at 01:37:26PM +0000, Simon Glass wrote:
> > > > > > > Hi Sumit,
> > > > > > >
> > > > > > > On Thu, Dec 28, 2023 at 11:58 AM Sumit Garg <sumit.garg at linaro.org> wrote:
> > > > > > > >
> > > > > > > > Allow platform owners to mirror devicetree files from devitree-rebasing
> > > > > > > > directory into dts/arch/$(ARCH) (special case for dts/arch/arm64). Then
> > > > > > > > build then along with any *-u-boot.dtsi file present in arch/$(ARCH)/dts
> > > > > > > > directory. Also add a new Makefile for arm64.
> > > > > > > >
> > > > > > > > This will help easy migration for platforms which currently are compliant
> > > > > > > > with upstream Linux kernel devicetree files.
> > > > > > > >
> > > > > > > > Signed-off-by: Sumit Garg <sumit.garg at linaro.org>
> > > > > > > > ---
> > > > > > > >
> > > > > > > > Changes in v3:
> > > > > > > > --------------
> > > > > > > > - Minor commit message update
> > > > > > > >
> > > > > > > > Changes in v2:
> > > > > > > > --------------
> > > > > > > > - s/DEVICE_TREE_LOC/dt_dir/ and s/U-boot/U-Boot/
> > > > > > > >
> > > > > > > >  dts/Kconfig             | 11 +++++++++++
> > > > > > > >  dts/Makefile            | 17 ++++++++++++++---
> > > > > > > >  dts/arch/arm64/Makefile | 14 ++++++++++++++
> > > > > > > >  3 files changed, 39 insertions(+), 3 deletions(-)
> > > > > > > >  create mode 100644 dts/arch/arm64/Makefile
> > > > > > > >
> > > > > > > > diff --git a/dts/Kconfig b/dts/Kconfig
> > > > > > > > index 00c0aeff893..e58c1c6f2ab 100644
> > > > > > > > --- a/dts/Kconfig
> > > > > > > > +++ b/dts/Kconfig
> > > > > > > > @@ -85,6 +85,17 @@ config OF_LIVE
> > > > > > > >           enables a live tree which is available after relocation,
> > > > > > > >           and can be adjusted as needed.
> > > > > > > >
> > > > > > > > +config OF_UPSTREAM
> > > > > > > > +       bool "Enable use of devicetree imported from Linux kernel release"
> > > > > > > > +       help
> > > > > > > > +         Traditionally, U-Boot platforms used to have their custom devicetree
> > > > > > > > +         files or copy devicetree files from Linux kernel which are hard to
> > > > > > > > +         maintain and can usually get out-of-sync from Linux kernel. This
> > > > > > > > +         option enables platforms to migrate to devicetree-rebasing repo where
> > > > > > > > +         a regular sync will be maintained every major Linux kernel release
> > > > > > > > +         cycle. However, platforms can still have some custom u-boot specific
> > > > > > > > +         bits maintained as part of *-u-boot.dtsi files.
> > > > > > >
> > > > > > > My only other suggestion here is to mention that this should be set in
> > > > > > > Kconfig, for the SoC as a whole. So I believe that means that it
> > > > > > > should be hidden, with no string for the 'bool':
> > > > > > >
> > > > > > >       bool  # Enable use of devicetree imported from Linux kernel release
> > > > > >
> > > > > > I think we can just keep prompting for it now, to make the transition
> > > > > > easier, before this option just goes away in time, hopefully.
> > > > > >
> > > > > > > Also, this doesn't seem to work for me. Before this series I get these
> > > > > > > files when building firefly-rk3399:
> > > > > > >
> > > > > > > rk3399-eaidk-610.dtb            rk3399-khadas-edge-v.dtb
> > > > > > > rk3399-orangepi.dtb        rk3399-rock-pi-4a.dtb
> > > > > > > rk3399-evb.dtb                  rk3399-leez-p710.dtb
> > > > > > > rk3399-pinebook-pro.dtb    rk3399-rock-pi-4c.dtb
> > > > > > > rk3399-ficus.dtb                rk3399-nanopc-t4.dtb
> > > > > > > rk3399-pinephone-pro.dtb   rk3399-rockpro64.dtb
> > > > > > > rk3399-firefly.dtb              rk3399-nanopi-m4-2gb.dtb
> > > > > > > rk3399pro-rock-pi-n10.dtb  rk3399-roc-pc.dtb
> > > > > > > rk3399-gru-bob.dtb              rk3399-nanopi-m4b.dtb
> > > > > > > rk3399-puma-haikou.dtb     rk3399-roc-pc-mezzanine.dtb
> > > > > > > rk3399-gru-kevin.dtb            rk3399-nanopi-m4.dtb
> > > > > > > rk3399-rock-4c-plus.dtb
> > > > > > > rk3399-khadas-edge-captain.dtb  rk3399-nanopi-neo4.dtb    rk3399-rock-4se.dtb
> > > > > > > rk3399-khadas-edge.dtb          rk3399-nanopi-r4s.dtb     rk3399-rock960.dtb
> > > > > > >
> > > > > > > Afterwards I get this:
> > > > > > >
> > > > > > > make[3]: *** No rule to make target
> > > > > > > 'dts/arch/arm64/rk3399-firefly.dtb', needed by 'dtbs'.  Stop.
> > > > > > >
> > > > > > > So I set this manually for that one board:
> > > > > > >
> > > > > > > CONFIG_DEFAULT_DEVICE_TREE="rockchip/rk3399-firefly"
> > > > > > >
> > > > > > > and get:
> > > > > > >
> > > > > > > make[3]: *** No rule to make target
> > > > > > > 'dts/arch/arm64/rockchip/rk3399-firefly.dtb', needed by 'dtbs'.  Stop.
> > > > > > >
> > > > > > > I am not sure how to fix this, nor how this can be made to build all
> > > > > > > the DTs for rk3399, as it does today.
> > > > > >
> > > > > > Looking at the patch for amlogic boards, you need to make the link to
> > > > > > devicetree-rebasing inside dts/...
> > > > >
> > > > > OK, let me give up on rk3399 for now...that doesn't seem to work even
> > > > > with the link.
> > > > >
> > > > > Using odroid-c2 with -next I see:
> > > > >
> > > > > $ ls /tmp/b/odroid-c2/arch/arm/dts/
> > > > > meson-a1-ad401.dtb                 meson-g12b-odroid-n2l.dtb
> > > > >     meson-gxl-s905x-libretech-cc.dtb
> > > > > meson-axg-jethome-jethub-j100.dtb  meson-g12b-odroid-n2-plus.dtb
> > > > >     meson-gxl-s905x-libretech-cc-v2.dtb
> > > > > meson-axg-s400.dtb                 meson-g12b-radxa-zero2.dtb
> > > > >     meson-gxl-s905x-p212.dtb
> > > > > meson-g12a-radxa-zero.dtb          meson-gxbb-kii-pro.dtb
> > > > >     meson-gxm-gt1-ultimate.dtb
> > > > > meson-g12a-sei510.dtb              meson-gxbb-nanopi-k2.dtb
> > > > >     meson-gxm-khadas-vim2.dtb
> > > > > meson-g12a-u200.dtb                meson-gxbb-odroidc2.dtb
> > > > >     meson-gxm-s912-libretech-pc.dtb
> > > > > meson-g12b-a311d-bananapi-m2s.dtb  meson-gxbb-p200.dtb
> > > > >     meson-gxm-wetek-core2.dtb
> > > > > meson-g12b-a311d-khadas-vim3.dtb   meson-gxbb-p201.dtb
> > > > >     meson-sm1-bananapi-m2-pro.dtb
> > > > > meson-g12b-bananapi-cm4-cm4io.dtb  meson-gxbb-wetek-hub.dtb
> > > > >     meson-sm1-bananapi-m5.dtb
> > > > > meson-g12b-gsking-x.dtb            meson-gxbb-wetek-play2.dtb
> > > > >     meson-sm1-khadas-vim3l.dtb
> > > > > meson-g12b-gtking.dtb              meson-gxl-s805x-libretech-ac.dtb
> > > > >     meson-sm1-odroid-c4.dtb
> > > > > meson-g12b-gtking-pro.dtb          meson-gxl-s905d-libretech-pc.dtb
> > > > >     meson-sm1-odroid-hc4.dtb
> > > > > meson-g12b-odroid-go-ultra.dtb
> > > > > meson-gxl-s905w-jethome-jethub-j80.dtb  meson-sm1-sei610.dtb
> > > > > meson-g12b-odroid-n2.dtb           meson-gxl-s905x-khadas-vim.dtb
> > > > > $
> > > > > With this series (sort of, since I am really not sure how to
> > > > > cherry-pick the commits from the PR) I see nothing:
> > > > >
> > > > > $ ls /tmp/b/odroid-c2/arch/arm/dts/
> > > > > $
> > > > >
> > > > > This shows some of the files:
> > > > >
> > > > > $ find /tmp/b/odroid-c2/ -name "*.dtb"
> > > > > /tmp/b/odroid-c2/dts/dt.dtb
> > > > > /tmp/b/odroid-c2/dts/arch/arm64/amlogic/meson-gxbb-odroidc2.dtb
> > > > > /tmp/b/odroid-c2/dts/arch/arm64/amlogic/meson-gxbb-nanopi-k2.dtb
> > > > > /tmp/b/odroid-c2/dts/arch/arm64/amlogic/meson-gxbb-wetek-play2.dtb
> > > > > /tmp/b/odroid-c2/dts/arch/arm64/amlogic/meson-gxbb-kii-pro.dtb
> > > > > /tmp/b/odroid-c2/dts/arch/arm64/amlogic/meson-gxbb-p200.dtb
> > > > > /tmp/b/odroid-c2/dts/arch/arm64/amlogic/meson-gxbb-p201.dtb
> > > > > /tmp/b/odroid-c2/dts/arch/arm64/amlogic/meson-gxbb-wetek-hub.dtb
> > > > > /tmp/b/odroid-c2/u-boot.dtb
> > > > >
> > > > > but where are the rest? Also, is it possible to put the output .dtb
> > > > > files into the same directory? Otherwise we may have some pain with
> > > > > binman.
> > > >
> > > > What do you mean by same directory? But maybe also, what's an example of
> > > > a board you think might end up having problems? Converting that in a
> > > > follow-up series is likely a good idea, to highlight and address these
> > > > issues sooner rather than later.#
> > >
> > > Today the .dtb files go into arch/arm/dts - so it would be easier if
> > > this series could do the same.
> >
> > The kbuild infrastructure keeps the dtb alongside dts files which is
> > the preferred way too as otherwise it would be complicated to locate
> > DT files for the users. Also, we have to move towards Linux DT
> > directory structure and thereby the tools like binman have to be
> > adjusted. I will do that when I get to migrating SoCs supporting
> > binman.
> 
> OK, I want to stop here and rethink this. This is the path taken so
> far, I believe:
> 
> 1. We want to use devicetree files taken from Linux and
> devicetree-rebasing provides these

Yes.

> 2. We want to use 'git subtree' to avoid needing a script to do the
> sync / create a commit

No. We want to use 'git subtree' to avoid having to use git submodules.

> 3. But this leaves us with a directory structure which doesn't match
> U-Boot (no script to fix it up)

No. We intentionally abandon arch/*/dts because it's so full of
out of date files and never fully re-synced, only re-synced ad-hoc.

> 4. So we deal with that by skipping the build rules and using CONFIG
> options to select what is built
> 5. So now we cannot build all the files for an SoC, just the ones that
> are in the CONFIG options
> 6. Linux doesn't actually use devicetree-rebasing itself, so doesn't
> have this problem

No. devicetree-rebasing skips the Makefiles because they're part of the
kernel. We couldn't re-use them ourselves because we don't have the same
CONFIG names the kernel does. And Sumit has not replicated the logic we
have under arch/*/dts/Makefile today because I've asked him not to, and
we'll figure out what subsets of that logic make sense to add back in as
a second step not a first step.

> So this is heading in the wrong direction. Nor is it clear that this
> would just be a temporary problem.

A previous iteration of this series built all of the dtb files for the
SoC that Sumit has migrated with this series, but then dropped it.

[snip]
> I would like to do this series properly, maintaining the SoC-specific
> build rules, not removing what I see as an important feature. It
> should not be that difficult to figure out and I am happy to help with
> it.

The problem is that the rest of us do not understand the use case you're
describing where a dtb file that would be useful in a build is not
already in the list to build. The only one of those use cases I
understand thus far is the exynos4 (iirc) case you mentioned previously
where yes, really, one defconfig + appending board.dtb is fine, or fine
enough. It's not that far off of the SPL_LOAD_FIT case, but there we
know what to build already.

And I guess trying to tie things up, that's my puzzle. SPL_LOAD_FIT is
how I see the use case you talk about being solved, if a full U-Boot is
generic enough for N boards, SPL_LOAD_FIT does the right thing (in this
non-bloblist DTB, non-reusing-OS-inntended DTB world). I really don't
knnow how many modern SoCs can take a literal concatenated DTB and even
in those cases I don't get why that's the win we want now? 1 build to N
binaries?

But even then, I don't object to adding those rules to the Makefiles. If
it works it works. I object to adding them when they don't work.

> > > The fundamental question is (I believe) whether to:
> > >
> > > 1. Build only a single DT for a board
> > > 2. Build all DTs for the SoC the board uses
> > >
> > > This series seems to head towards (1),
> >
> > v2 of this series had the Makefile rules [1] for meson gxbb SoC but..
> >
> > [1] https://patchwork.ozlabs.org/project/uboot/patch/20231222061208.3009970-8-sumit.garg@linaro.org/
> >
> > > which worries me. We are
> > > currently mostly at (2).
> >
> > ..after discussion with Tom, the Makefile rules are already coming via
> > Kconfig options like DEFAULT_DEVICE_TREE, OF_LIST etc. So having
> > redundant rules in Makefile doesn't add any value, so I took them off
> > in v3.
> 
> Yes, I see that you did that.
> 
> This seems to be a fundamental point of disagreement. I would like all
> boards for an SoC to have mostly the same defconfig and just use a
> devicetree for differences, at least in U-Boot proper. That is what
> devicetree is for. In fact, I would like to see a lot more defaults in
> U-Boot, so that defconfig files are just a few lines like [2] and
> there is no board-specific C code not gated by a compatible string.

That's a nice goal to aim for. Sumit's work doesn't stop that being
aimed for, and by making it easy to keep our device trees modern, it
makes that easier, not harder.

Heck, it's something I've been working with the TI folks with for a few
years now, and this work will make things easier for them because the
dts files will get synced back, for all of the chips, sooner rather than
later, and we can push towards getting rid of most of the -u-boot.dtsi
work, and deal with the hard question of "where do r5 dts files go?".
But that will not get rid of board/siemens/iot2050/ because that's what
a custom hardware design needs and wants. Not "just pass the new DTB".
This is another of the valid use cases that we need to keep in mind and
design around, the explicit and intentional starting point of "don't
just run the EVM binary for custom hardware design production".

> > However, I am very much in favour of having a generalized U-Boot
> > image. This might become true in some cases like U-Boot acts as a
> > second stage bootloader for a particular SoC which is a unified image
> > where the prior stage passes the DT to it. The Qcom effort in this
> > direction can be an example here.
> 
> Not relevant to the topic at hand, perhaps, but Qualcomm uses a
> closed-source blob to jump to U-Boot and is certainly not an example
> we should emulate. But yes, passing a DT to U-Boot proper can be
> useful.

It's a very valid use case we need to continue to support. And to save
Mark from having to repeat himself, again, it's intentionally and not
changing, how the Apple M1/M2/etc platforms boot. I'm pretty sure the
fact that one can use U-Boot this way is part of how engineers get proof
of concept work done to show that if they had U-Boot available then they
could also support X/Y/Z easier. And maybe they'll be able to longer
term push internally to use bloblist to pass things along.

Heck, trying to not go too far off on a tangent, maybe the m1n1 loader
can implement both conventions, as both Linux Kernel[0] and Bloblist[1]
use x0 for device tree, but bloblist has x1 non-zero and Linux does not,
so both could be present here? Or is there some incompatibility I don't
see on quick skimming?

-- 
Tom

[0]: https://www.kernel.org/doc/html/latest/arch/arm64/booting.html
[1]: https://github.com/FirmwareHandoff/firmware_handoff/blob/main/source/register_conventions.rst
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20231231/e6860bd5/attachment.sig>


More information about the U-Boot mailing list