Hi Rob, On Tue, 1 Nov 2022 at 21:13, Simon Glass <sjg@xxxxxxxxxxxx> wrote: > > U-Boot has some particular challenges with device tree and devices: > > - U-Boot has multiple build phases, such as a Secondary Program Loader > (SPL) phase which typically runs in a pre-SDRAM environment where code > and data space are limited. In particular, there may not be enough > space for the full device tree blob. U-Boot uses various automated > techniques to reduce the size from perhaps 40KB to 3KB. It is not > always possible to handle these tags entirely at build time, since > U-Boot proper must have the full device tree, even though we do not > want it to process all nodes until after relocation. > - Some U-Boot phases needs to run before the clocks are properly set up, > where the CPU may be running very slowly. Therefore it is important to > bind only those devices which are actually needed in that phase > - U-Boot uses lazy initialisation for its devices, with 'bind' and > 'probe' being separate steps. Even if a device is bound, it is not > actually probed until it is used. This is necessary to keep the boot > time reasonable, e.g. to under a second > > The phases of U-Boot in order are: TPL, VPL, SPL, U-Boot (first > pre-relocation, then post-relocation). ALl but the last two are optional. > > For the above reasons, U-Boot only includes the full device tree in the > final 'U-Boot proper' build. Even then, before relocation U-Boot only > processes nodes which are marked as being needed. > > For this to work, U-Boot's driver model[1] provides a way to mark device > tree nodes as applicable for a particular phase. This works by adding a > tag to the node, e.g.: > > cru: clock-controller@ff760000 { > phase,all; > compatible = "rockchip,rk3399-cru"; > reg = <0x0 0xff760000 0x0 0x1000>; > rockchip,grf = <&grf>; > #clock-cells = <1>; > #reset-cells = <1>; > ... > }; > > Here the "phase,all" tag indicates that the node must be present in all > phases, since the clock driver is required. > > There has been discussion over the years about whether this could be done > in a property instead, e.g. > > options { > phase,all = <&cru> <&gpio_a> ...; > ... > }; > > Some problems with this: > > - we need to be able to merge several such tags from different .dtsi files > since many boards have their own specific requirements > - it is hard to find and cross-reference the affected nodes > - it is more error-prone > - it requires significant tool rework in U-Boot, including fdtgrep and > the build system > - is harder (slower, more code) to process since it involves scanning > another node/property to find out what to do with a particular node > - we don't want to add phandle arguments to the above since we are > referring, e.g., to the clock device as a whole, not a paricular clock > - the of-platdata feature[2], which converts device tree to C for even > more constrained environments, would need to become aware of the > /options node > > There is also the question about whether this needs to be U-Boot-specific, > or whether the tags could be generic. From what I can tell, U-Boot is the > only bootloader which seriously attempts to use a runtime device tree in > all cases. For this version, an attempt is made to name the phases in a > generic manner. > > It should also be noted that the approach provided here has stood the test > of time, used in U-Boot for 8 years so far. > > So add the schema for this. This will allow a major class of schema > exceptions to be dropped from the U-Boot source tree. > > This being sent to the mailing list since it might attract more review. > A PR will be sent when this has had some review. That is why the file > path is set up for https://github.com/devicetree-org/dt-schema rather > than the Linux kernel. > > [1] https://u-boot.readthedocs.io/en/latest/develop/driver-model/index.html > [2] https://u-boot.readthedocs.io/en/latest/develop/driver-model/of-plat.html > > Signed-off-by: Simon Glass <sjg@xxxxxxxxxxxx> > --- > > Changes in v4: > - Drop some unnecessary context from the commit message > - Explain why parent nodes do not automatically inherit their children's > tags > - Rename the tags to use a phase,xxx format, explaining each one > > Changes in v3: > - Fix an incorrect schema path in $id > > Changes in v2: > - Expand docs to include a description of each tag > - Fix some typos and unclear wording > > dtschema/lib.py | 5 +++ > dtschema/schemas/phase.yaml | 73 +++++++++++++++++++++++++++++++++++++ > test/phases.dts | 26 +++++++++++++ > 3 files changed, 104 insertions(+) > create mode 100644 dtschema/schemas/phase.yaml > create mode 100644 test/phases.dts Any thoughts on this please? Regards, Simon