[PATCH 1/3] doc: Move devicetree control doc to rST
Heinrich Schuchardt
xypron.glpk at gmx.de
Sun Aug 1 10:22:48 CEST 2021
On 7/25/21 6:43 PM, Simon Glass wrote:
> Move this to rST format, largely unchanged to start with. Add an index
> for this topic, as well as an empty intro.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> .../devicetree/control.rst} | 50 +++++++++----------
> doc/develop/devicetree/index.rst | 13 +++++
> doc/develop/devicetree/intro.rst | 4 ++
> doc/develop/index.rst | 1 +
> 4 files changed, 43 insertions(+), 25 deletions(-)
> rename doc/{README.fdt-control => develop/devicetree/control.rst} (89%)
> create mode 100644 doc/develop/devicetree/index.rst
> create mode 100644 doc/develop/devicetree/intro.rst
>
> diff --git a/doc/README.fdt-control b/doc/develop/devicetree/control.rst
> similarity index 89%
> rename from doc/README.fdt-control
> rename to doc/develop/devicetree/control.rst
> index 424d13fc5b1..1289b6156fe 100644
> diff --git a/doc/develop/devicetree/control.rst
b/doc/develop/devicetree/control.rst
> new file mode 100644
> index 0000000000..1289b6156f
> --- /dev/null
> +++ b/doc/develop/devicetree/control.rst
> @@ -0,0 +1,230 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +.. sectionauthor:: Copyright 2011 The Chromium OS Authors
> +
> +Device Tree Control in U-Boot
> +=============================
> +
> +This feature provides for run-time configuration of U-Boot via a flat
%s/flat/flattened/
Please, use the terminology of the Devicetree Specification.
> +device tree (fdt). U-Boot configuration has traditionally been done
> +using CONFIG options in the board config file. This feature aims to
%s/config/configuration/
Please, avoid slang.
> +make it possible for a single U-Boot binary to support multiple boards,
> +with the exact configuration of each board controlled by a flat device
%s/flag/flattened/
> +tree (fdt). This is the approach recently taken by the ARM Linux kernel
RISC-V too.
> +and has been used by PowerPC for some time.
> +
> +The fdt is a convenient vehicle for implementing run-time configuration
> +for three reasons. Firstly it is easy to use, being a simple text file.
No. The flattened devicetree is not a text file format. It is a binary
format.
Assume that a reader does not know that these different formats exist.
You need to explain at the beginning of the chapter what a devicetree is
and that it can be converted to a binary format, the flattened divice tree.
> +It is extensible since it consists of nodes and properties in a nice
> +hierarchical format.
> +
> +Finally, there is already excellent infrastructure for the fdt: a
> +compiler checks the text file and converts it to a compact binary
> +format, and a library is already available in U-Boot (libfdt) for
> +handling this format.
> +
> +The dts directory contains a Makefile for building the device tree blob
The arch/<arch>/dts directories contain Makefiles ...
> +and embedding it in your U-Boot image. This is useful since it allows
%s/your/the/
> +U-Boot to configure itself according to what it finds there. If you have
> +a number of similar boards with different peripherals, you can describe
> +the features of each board in the device tree file, and have a single
> +generic source base.
> +
> +To enable this feature, add CONFIG_OF_CONTROL to your board config file.
> +
> +
> +What is a Flat Device Tree?
%s/Flat/Flattened/
> +---------------------------
> +
> +An fdt can be specified in source format as a text file. To read about
> +the fdt syntax, take a look at the specification (dtspec_).
Please, provide a URL link to the Devicetree Specification, Release v0.3.
> +
> +You also might find this section of the Linux kernel documentation
> +useful: (access this in the Linux kernel source code)
> +
> + Documentation/devicetree/booting-without-of.txt
> +
> +There is also a mailing list:
> +
> + http://lists.ozlabs.org/listinfo/devicetree-discuss
> +
> +In case you are wondering, OF stands for Open Firmware.
> +
> +
> +Tools
> +-----
> +
> +To use this feature you will need to get the device tree compiler.
This is
"this feature" does not relate to anything. Better:
To create flattened device trees the device tree compiler is used.
> +provided by U-Boot automatically. If you have a system version of dtc
What automatism? Better:
U-Boot comes with a copy of the device tree compiler code in /scripts/dtc/.
> +(typically in the 'device-tree-compiler' package), it is currently
not used.
What is not used? /scripts/dtc/ or the system instance?
> +
> +If you want to build your own dtc, it is kept here::
> +
> + git://git.kernel.org/pub/scm/utils/dtc/dtc.git
> +
> +For example::
> +
> + $ git clone git://git.kernel.org/pub/scm/utils/dtc/dtc.git
> + $ cd dtc
> + $ make
> + $ sudo make install
Why should we describe this? We have the code in /scripts/dtc/. We
enable CONFIG_DTC as neeeded.
> +
> +Then run the compiler (your version will vary)::
> +
> + $ dtc -v
> + Version: DTC 1.2.0-g2cb4b51f
> + $ make tests
> + $ cd tests
> + $ ./run_tests.sh
> + ********** TEST SUMMARY
> + * Total testcases: 1371
> + * PASS: 1371
> + * FAIL: 0
> + * Bad configuration: 0
> + * Strange test result: 0
> +
> +You will also find a useful fdtdump utility for decoding a binary
file, as
fdtdump is deprecated. Use 'dtc -I dtb -O dts'.
> +well as fdtget/fdtput for reading and writing properties in a binary
file.
> +
> +
> +Where do I get an fdt file for my board?>
+----------------------------------------
> +
> +You may find that the Linux kernel has a suitable file. Look in the
> +kernel source in arch/<arch>/boot/dts.
There is no fdt file in the kernel source.
> +
> +If not you might find other boards with suitable files that you can
> +modify to your needs. Look in the board directories for files with a
> +.dts extension.
> +
> +Failing that, you could write one from scratch yourself!
> +
> +
> +Configuration
> +-------------
> +
> +Use::
> +
> + #define CONFIG_DEFAULT_DEVICE_TREE "<name>"
> +
> +to set the filename of the device tree source. Then put your device tree
> +file into::
> +
> + board/<vendor>/dts/<name>.dts
> +
> +This should include your CPU or SOC's device tree file, placed in
> +arch/<arch>/dts, and then make any adjustments required.
> +
> +If CONFIG_OF_EMBED is defined, then it will be picked up and built into
> +the U-Boot image (including u-boot.bin). This is suitable for debugging
> +and development only and is not recommended for production devices.
> +
> +If CONFIG_OF_SEPARATE is defined, then it will be built and placed in
> +a u-boot.dtb file alongside u-boot-nodtb.bin. A common approach is
then to
> +join the two::
> +
> + cat u-boot-nodtb.bin u-boot.dtb >image.bin
All these steps will not be taken by a normal user. So this is very
confusing for him.
Please, clearly distinguish between steps a user takes who uses an
existing defconfig file and those taken by a developer.
> +
> +and then flash image.bin onto your board. Note that U-Boot creates
> +u-boot-dtb.bin which does the above step for you also. Resulting
> +u-boot.bin is a copy of u-boot-dtb.bin in this case. If you are using
> +CONFIG_SPL_FRAMEWORK, then u-boot.img will be built to include the
device
> +tree binary.
> +
> +If CONFIG_OF_BOARD is defined, a board-specific routine will provide the
> +device tree at runtime, for example if an earlier bootloader stage
creates
> +it and passes it to U-Boot.
> +
> +If CONFIG_OF_HOSTFILE is defined, then it will be read from a file on
> +startup. This is only useful for sandbox. Use the -d flag to U-Boot to
> +specify the file to read.
> +
> +You cannot use more than one of these options at the same time.
> +
> +To use a device tree file that you have compiled yourself, pass
> +EXT_DTB=<filename> to 'make', as in::
> +
> + make EXT_DTB=boot/am335x-boneblack-pubkey.dtb
> +
> +Then U-Boot will copy that file to u-boot.dtb, put it in the .img file
> +if used, and u-boot-dtb.bin.
> +
> +If you wish to put the fdt at a different address in memory, you can
> +define the "fdtcontroladdr" environment variable. This is the hex
> +address of the fdt binary blob, and will override either of the options.
> +Be aware that this environment variable is checked prior to relocation,
> +when only the compiled-in environment is available. Therefore it is not
> +possible to define this variable in the saved SPI/NAND flash
> +environment, for example (it will be ignored). After relocation, this
> +variable will be set to the address of the newly relocated fdt blob.
> +It is read-only and cannot be changed. It can optionally be used to
> +control the boot process of Linux with bootm/bootz commands.
> +
> +To use this, put something like this in your board header file::
> +
> + #define CONFIG_EXTRA_ENV_SETTINGS "fdtcontroladdr=10000\0"
> +
> +Build:
> +
> +After board configuration is done, fdt supported u-boot can be build
in two
%s/After/After the/
%s/build/built/
> +ways:
> +
> +# build the default dts which is defined from
CONFIG_DEFAULT_DEVICE_TREE::
> +
> + $ make
> +
> +# build the user specified dts file::
> +
> + $ make DEVICE_TREE=<dts-file-name>
> +
> +
> +Relocation, SPL and TPL
> +-----------------------
> +
> +U-Boot can be divided into three phases: TPL, SPL and U-Boot proper.> +
> +The full device tree is available to U-Boot proper, but normally
only a subset
> +(or none at all) is available to TPL and SPL. See 'Pre-Relocation
Support' and
> +'SPL Support' in doc/driver-model/design.rst for more details.
> +
> +
> +Using several DTBs in the SPL (CONFIG_SPL_MULTI_DTB)
> +----------------------------------------------------
> +In some rare cases it is desirable to let SPL be able to select one
DTB among
> +many. This usually not very useful as the DTB for the SPL is small
and usually
Quite the contrary. It is very useful to reduce the number of different
images a Linux distribution has to supply.
> +fits several platforms. However the DTB sometimes include
information that do
> +work on several platforms (like IO tuning parameters).
> +In this case it is possible to use CONFIG_SPL_MULTI_DTB. This option
appends to
How does this compare to CONFIG_MULTI_DTB_FIT and CONFIG_SPL_MULTI_DTB_FIT?
> +the SPL a FIT image containing several DTBs listed in SPL_OF_LIST.
> +board_fit_config_name_match() is called to select the right DTB.
> +
> +If board_fit_config_name_match() relies on DM (DM driver to access
an EEPROM
CONFIG_SPL_MULTI_DTB seems not to be related to
board_fit_config_name_match(). It is CONFIG_$(SPL_)MULTI_DTB_FIT that
enables compiling common_fit.o.
> +containing the board ID for example), it possible to start with a
generic DTB
> +and then switch over to the right DTB after the detection. For this
purpose,
> +the platform code must call fdtdec_resetup(). Based on the returned
flag, the
> +platform may have to re-initiliaze the DM subusystem using
dm_uninit() and
> +dm_init_and_scan().
> +
> +
> +Limitations
> +-----------
> +
> +U-Boot is designed to build with a single architecture type and CPU
%s/with/for/
> +type. So for example it is not possible to build a single ARM binary
> +which runs on your AT91 and OMAP boards, relying on an fdt to configure
> +the various features. This is because you must select one of
> +the CPU families within arch/arm/cpu/arm926ejs (omap or at91) at build
> +time. Similarly you cannot build for multiple cpu types or
> +architectures.
%s/you cannot build/U-Boot cannot be built/
It is not the user's fault.
> +
> +That said the complexity reduction by using fdt to support variants of
> +boards which use the same SOC / CPU can be substantial.
This complexity reduction should be described first. The limitations
(e.g. same CPU architecture) second.
Best regards
Heinrich
> +
> +It is important to understand that the fdt only selects options
> +available in the platform / drivers. It cannot add new drivers (yet). So
> +you must still have the CONFIG option to enable the driver. For example,
> +you need to define CONFIG_SYS_NS16550 to bring in the NS16550 driver,
> +but can use the fdt to specific the UART clock, peripheral address, etc.
> +In very broad terms, the CONFIG options in general control *what* driver
> +files are pulled in, and the fdt controls *how* those files work.
> +
> +.. _dtspec:
https://www.power.org/resources/downloads/Power_ePAPR_APPROVED_v1.0.pdf
> diff --git a/doc/develop/devicetree/index.rst
b/doc/develop/devicetree/index.rst
> new file mode 100644
> index 0000000000..fa5db3eb76
> --- /dev/null
> +++ b/doc/develop/devicetree/index.rst
> @@ -0,0 +1,13 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +
> +Devicetree in U-Boot
> +====================
> +
> +The following holds information on how U-Boot makes use of
devicetree for
> +build-time and runtime configuration.
> +
> +.. toctree::
> + :maxdepth: 2
> +
> + intro
> + control
> diff --git a/doc/develop/devicetree/intro.rst
b/doc/develop/devicetree/intro.rst
> new file mode 100644
> index 0000000000..344851327c
> --- /dev/null
> +++ b/doc/develop/devicetree/intro.rst
> @@ -0,0 +1,4 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +
> +Devicetree Introduction
> +=======================
> diff --git a/doc/develop/index.rst b/doc/develop/index.rst
> index 54e14dd77b..1b90418994 100644
> --- a/doc/develop/index.rst
> +++ b/doc/develop/index.rst
> @@ -10,6 +10,7 @@ Implementation
> :maxdepth: 1
>
> commands
> + devicetree/index
> driver-model/index
> global_data
> logging
>
More information about the U-Boot
mailing list