Hi Heinrich, On Sat, 28 Aug 2021 at 07:39, Tom Rini <tr...@konsulko.com> wrote: > > On Sat, Aug 28, 2021 at 03:30:15PM +0200, Heinrich Schuchardt wrote: > > On 8/28/21 3:01 PM, Tom Rini wrote: > > > On Sat, Aug 28, 2021 at 02:29:21PM +0200, Heinrich Schuchardt wrote: > > > > On 8/28/21 5:23 AM, Simon Glass wrote: > > > > > At present some of the ideas and techniques behind devicetree in > > > > > U-Boot > > > > > are assumed, implied or unsaid. Add some documentation to cover how > > > > > devicetree is build, how it can be modified and the rules about using > > > > > the various CONFIG_OF_... options. > > > > > > > > > > Signed-off-by: Simon Glass <s...@chromium.org> > > > > > --- > > > > > > > > > > doc/develop/index.rst | 1 + > > > > > doc/develop/package/devicetree.rst | 315 > > > > > +++++++++++++++++++++++++++++ > > > > > doc/develop/package/index.rst | 1 + > > > > > 3 files changed, 317 insertions(+) > > > > > create mode 100644 doc/develop/package/devicetree.rst > > > > > > > > > > diff --git a/doc/develop/index.rst b/doc/develop/index.rst > > > > > index 83c929babda..d5ad8f9fe53 100644 > > > > > --- a/doc/develop/index.rst > > > > > +++ b/doc/develop/index.rst > > > > > @@ -36,6 +36,7 @@ Packaging > > > > > :maxdepth: 1 > > > > > > > > > > package/index > > > > > + package/devicetree > > > > > > > > > > Testing > > > > > ------- > > > > > diff --git a/doc/develop/package/devicetree.rst > > > > > b/doc/develop/package/devicetree.rst > > > > > new file mode 100644 > > > > > index 00000000000..fccbb182f3e > > > > > --- /dev/null > > > > > +++ b/doc/develop/package/devicetree.rst > > > > > @@ -0,0 +1,315 @@ > > > > > +.. SPDX-License-Identifier: GPL-2.0+ > > > > > + > > > > > +Updating the devicetree > > > > > +======================= > > > > > + > > > > > +U-Boot uses devicetree for runtime configuration and storing > > > > > required blobs or > > > > > +any other information it needs to operate. It is possible to update > > > > > the > > > > > +devicetree separately from actually building U-Boot. This provides a > > > > > good degree > > > > > +of control and flexibility for firmware that uses U-Boot in > > > > > conjunction with > > > > > +other project. > > > > > + > > > > > +There are many reasons why it is useful to modify the devicetree > > > > > after building > > > > > +it: > > > > > + > > > > > +- Configuration can be changed, e.g. which UART to use > > > > > +- A serial number can be added > > > > > +- Public keys can be added to allow image verification > > > > > +- Console output can be changed (e.g. to select serial or vidconsole) > > > > > + > > > > > +This section describes how to work with devicetree to accomplish > > > > > your goals. > > > > > + > > > > > +See also :doc:`../devicetree/control` for a basic summary of the > > > > > available > > > > > +features. > > > > > + > > > > > + > > > > > +Devicetree source > > > > > +----------------- > > > > > + > > > > > +Every board in U-Boot must include a devicetree sufficient to build > > > > > and boot > > > > > +that board on suitable hardware (or emulation). This is specified > > > > > using the > > > > > +`CONFIG DEFAULT_DEVICE_TREE` option. > > > > > + > > > > > + > > > > > +Current situation (August 2021) > > > > > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > > > > + > > > > > +As an aside, at present U-Boot allows `CONFIG_DEFAULT_DEVICE_TREE` > > > > > to be empty, > > > > > +e.g. if `CONFIG_OF_BOARD` or `CONFIG_OF_PRIOR_STAGE` are used. This > > > > > has > > > > > +unfortunately created an enormous amount of confusion and some > > > > > wasted effort. > > > > > +This was not intended and this bug will be fixed soon. Specifically: > > > > > + > > > > > +- `CONFIG_OF_BOARD` was added in rpi_patch_ for Raspberry Pi, which > > > > > does have > > > > > + an in-tree devicetree, but this feature has since been used for > > > > > boards that > > > > > + don't > > > > > +- `CONFIG_OF_PRIOR_STAGE` was added in bcm_patch_ as part of a > > > > > larger Broadcom > > > > > + change with a tag indicating it only affected one board, so the > > > > > change in > > > > > + behaviour was not noticed at the time. It has since been used by > > > > > RISC-V qemu > > > > > + boards. > > > > > + > > > > > +Once this bug is fixed, CONFIG_OF_BOARD and CONFIG_OF_PRIOR_STAGE > > > > > will override > > > > > +(at runtime) the devicetree suppled with U-Boot, but will otherwise > > > > > use > > > > > +CONFIG_OF_SEPARATE for the in-tree build. So these two will become > > > > > options, > > > > > +moving out of the 'choice' in `dts/Kconfig` > > > > > + > > > > > +Offending boards are: > > > > > + > > > > > +- bcm7260 > > > > > +- bcm7445 > > > > > +- qemu_arm64 > > > > > +- qemu_arm > > > > > +- qemu-ppce500 > > > > > +- qemu-riscv32 > > > > > +- qemu-riscv32_smode > > > > > +- qemu-riscv64 > > > > > +- qemu-riscv64_smode > > > > > + > > > > > +All of these need to have a devicetree added in-tree. This is > > > > > targeted to be > > > > > +fixed in the 2022.01 release. > > > > > + > > > > > + > > > > > +Building the devicetree > > > > > +----------------------- > > > > > + > > > > > +U-Boot automatically builds the devicetree for a board, from the > > > > > +`arch/<arch>/dts` directory. The Makefile in those directories has > > > > > rules for > > > > > +building devicetree files. It is preferable to avoid target-specific > > > > > rules in > > > > > +those files: i.e. all boards for a particular SoC should be built at > > > > > once, > > > > > +where practical. Apart from simplifying the Makefile, this helps to > > > > > efficiently > > > > > +(and immediately) ensure that changes in one board's DT do not break > > > > > others that > > > > > +are related. Building devicetrees is fast, so performance is seldom > > > > > a concern > > > > > +here. > > > > > + > > > > > + > > > > > +Overriding the default devicetree > > > > > +--------------------------------- > > > > > + > > > > > +When building U-Boot, the `DEVICE_TREE` environment variable allows > > > > > the > > > > > +default devicetree file to be overridden at build time. This can be > > > > > useful if > > > > > +modifications have to be made to the in-tree devicetree file, for > > > > > the benefit > > > > > +of a downstream build system. Note that the in-tree devicetree must > > > > > be > > > > > +sufficient to build and boot, so this is not a way to bypass that > > > > > requirement. > > > > > + > > > > > + > > > > > +Modifying the devicetree after building > > > > > +--------------------------------------- > > > > > + > > > > > +While it is generally painful and hacky to modify the code or rodata > > > > > of a > > > > > +program after it is built, in many cases it is useul to do so, e.g. > > > > > to add > > > > > +configuration information like serial numbers, enabling/disabling > > > > > features, etc. > > > > > + > > > > > +Devicetree provides a very nice solution to these problems since it > > > > > is > > > > > +structured data and it is relatively easy to change it, even in > > > > > binary form > > > > > +(see fdtput). > > > > > + > > > > > +U-Boot takes care that the devicetree is easily accessible after the > > > > > build > > > > > +process. In fact it is placed in a separate file called > > > > > `u-boot.dtb`. If the > > > > > +build system wants to modify or replace that file, it can do so. > > > > > Then all that > > > > > +is needed is to run `binman update` to update the file inside the > > > > > image. If > > > > > +binman is not used, then `u-boot-nodtb.bin` and the new `u-boot.dtb` > > > > > can simply > > > > > +be concatenated to achieve the desired result. U-Boot happily copes > > > > > with the > > > > > +devicetree growing or shrinking. > > > > > + > > > > > +The `u-boot.bin` image contains both pieces. While it is possible to > > > > > locate the > > > > > +devicetree within the image using the signature at the start of the > > > > > file, this > > > > > +is a bit messy. > > > > > + > > > > > +This is why `CONFIG_OF_SEPARATE` should always be used when building > > > > > U-Boot. > > > > > +The `CONFIG_OF_EMBED` option embeds the devicetree somewhere in the > > > > > U-Boot ELF > > > > > +image as rodata, meaning that it is hard to find it and it cannot > > > > > increase in > > > > > +size. > > > > > + > > > > > +When modifying the devicetree, the different cases to consider are > > > > > as follows: > > > > > + > > > > > +- CONFIG_OF_SEPARATE > > > > > + This is easy, described above. Just change, replace or rebuild > > > > > the > > > > > + devicetree so it suits your needs, then rerun binman or redo the > > > > > `cat` > > > > > + operation to join `u-boot-nodtb.bin` and the new `u-boot.dtb` > > > > > + > > > > > +- CONFIG_OF_EMBD > > > > > + This is tricky, since the devicetree cannot easily be located. > > > > > If the EFL > > > > > + file is available, then the _dtb_dt_begin and __dtb_dt_end > > > > > symbols can be > > > > > + examined to find it. While it is possible to contract the file, > > > > > it is not > > > > > + possible to expand the file since that would involve re-linking > > > > > + > > > > > +- CONFIG_OF_PRIOR_STAGE > > > > > + In this case the devicetree must be modified in the project > > > > > which provides > > > > > + it, as described below > > > > > + > > > > > +- CONFIG_OF_BOARD > > > > > + This is a board-specific situation, so needs to be considered on > > > > > a > > > > > + case-by-case base. The devicetree must be modified so that the > > > > > correct > > > > > + one is provided to U-Boot. How this is done depends entirely on > > > > > the > > > > > + implementation of this option for the board. It might require > > > > > injecting the > > > > > + changes into a different project somehow using tooling available > > > > > there, or > > > > > + it might involve merging an overlay file at runtime to obtain > > > > > the desired > > > > > + result. > > > > > + > > > > > + > > > > > +Devicetree in another project > > > > > +----------------------------- > > > > > + > > > > > +In some cases U-Boot receive its devicetree at runtime from a > > > > > program that calls > > > > > +it. For example ARM's Trusted Firmware A (`TF-A`_) may have a > > > > > devicetree that it > > > > > +passes to U-Boot. This overrides any devicetree build by U-Boot. > > > > > When packaging > > > > > +the firmware, the U-Boot devicetree may in fact be left out if it > > > > > can be > > > > > +guaranteed that it will receive one from another project. > > > > > + > > > > > +In this case, the devicetree in the other project must track > > > > > U-Boot's use of > > > > > +device tree. It must provide a way to add configuration and other > > > > > information to > > > > > > > > U-Boot does not rule the world. So never ever is this going to happen. > > > > It is the other way round. U-Boot must consume what the prior bootstage > > > > delivers. If U-Boot needs extra nodes it has to provide these on its > > > > own. > > > > > > > > Please, remove this assumption from the document. > > > > > > We need to figure out which compatibles we need to push upstream, and > > > which we need to see if we can solve another way. > > > > > > > > +the devicetree for use by U-Boot, such as the /config node. Note > > > > > that the > > > > > +U-Boot in-tree devicetree must be sufficient to build and boot, so > > > > > this is not a > > > > > +way to bypass that requirement. > > > > > + > > > > > +If binman is used, the in-tree U-Boot devicetree must contain the > > > > > binman > > > > > +definition so that a valid image can be build. > > > > > > > > No clue what an in-tree tree might be. Please, avoid such confusing > > > > language. > > > > > > Would "source tree devicetree" be less confusing? Or can you suggest an > > > alternative? > > > > > > > > > > > > + > > > > > +If verified boot is used, the project must provide a way to inject a > > > > > public key, > > > > > > > > %s/the project/U-Boot/ > > > > > > > > > +certificate or other material into the U-Boot devicetree so that it > > > > > is available > > > > > +to U-Boot at runtime. See `Signing with U-Boot devicetree`_. This > > > > > may be > > > > > +through tooling in the project itself or by making use of U-Boot's > > > > > tooling. > > > > > + > > > > > + > > > > > +Devicetree generated on-the-fly in another project > > > > > +-------------------------------------------------- > > > > > > I think this is a confusing topic, and gets things a bit backwards. > > > > > > > > + > > > > > +In some rare cases, another project may wish to create a devicetree > > > > > for U-Boot > > > > > +entirely on-the-fly, then pass it to U-Boot at runtime. The only > > > > > known example > > > > > +of this at the time of writing (2021) is qemu, for ARM (`QEMU ARM`_) > > > > > and > > > > > +RISC-V (`QEMU RISC-V`_). > > > > > > What's the difference between QEMU and hardware that ships with a device > > > tree stored in flash? In both cases, we need to have the device tree > > > that's provided be the device tree that works. Like I was just raising > > > in another thread, there are not multiple device trees for a given > > > device, there is the device tree and it works for everyone that needs to > > > consume a device tree. > > > > > > > > +In this case, the devicetree in the other project must track > > > > > U-Boot's use of > > > > > +device tree, so that it remains compatible. If a particular version > > > > > of the > > > > > > > > Why? U-Boot must support its internal needs itself! > > > > > > > > Don't try to force a bad U-Boot design on other projects. > > > > > > > > Please, come up with a concept that makes sense. > > > > > > This is the same situation as above, where we need to see about pushing > > > some changes upstream perhaps. > > > > > > > In U-Boot we currently have a lot of device-tree nodes that are > > irrelevant for anything but U-Boot, e.g. all those nodes marked as > > compatible to "u-boot,*". It does not make sense to push these upstream. > > > > So if a prior bootstage provides a devicetree, we need a separate > > devicetree in U-Boot. > > > > We can copy the incoming devicetree to a private copy and amend all our > > U-Boot specific stuff. Then let's use this private copy for > > $fdt_control_addr and bringing up U-Boot while keeping the original > > incoming devicetree as $fdt_addr so that we can pass it to the next boot > > stage. > > I'm not sure that's how this works? The "linux" vendor prefix is for > Linux specific bindings and are expected to be present in the tree it > receives, and not fixed up and added at runtime. But if you can proof > of concept out what your idea, I suspect that would work to resolve a > handful of problems all the same, so it would be good to see.
I actually suggested a different approach: copy the DT before fixing it up. This effectively happens already if OF_LIVE is enabled. U-Boot obviously cannot 'amend all our U-Boot specific stuff' at runtime unless that is available somewhere else (at runtime). I'll address that point in the v2 series. Should we require the Linux stuff to be in a separate DT also? :-) Regards, SImon