[RFC PATCH] dts: automatically build necessary .dtb files

Rasmus Villemoes rasmus.villemoes at prevas.dk
Mon Jan 24 22:15:18 CET 2022


On 24/01/2022 18.57, Simon Glass wrote:
> Hi,
> 
> On Mon, 24 Jan 2022 at 09:02, Tom Rini <trini at konsulko.com> wrote:
>>
>> On Mon, Jan 10, 2022 at 02:34:41PM +0100, Rasmus Villemoes wrote:
>>
>>> When building for a custom board, it is quite common to maintain a
>>> private branch which include some defconfig and .dts files. But to
>>> hook up those .dts files requires modifying a file "belonging" to
>>> upstream U-Boot, the arch/*/dts/Makefile. Forward-porting that branch
>>> to a newer upstream then often results in a conflict which, while it
>>> is trivial to resolve by hand, makes it harder to have a CI do "try to
>>> build our board against latest upstream".
>>>
>>> The .config usually includes information on precisely what .dtb(s) are
>>> needed, so to avoid having to modify the Makefile, simply add the
>>> files in (SPL_)OF_LIST to dtb-y.
>>>
>>> A technicality is that (SPL_)OF_LIST is not always defined, so rework
>>> the Kconfig symbols so that (SPL_)OF_LIST is always defined (when
>>> (SPL_)OF_CONTROL), but only prompted for in the cases which used to be
>>> their "depends on".
>>>
>>> nios2 and microblaze already have something like this in their
>>> dts/Makefile, and the rationale in commit 41f59f68539 is similar to
>>> the above. So this simply generalizes existing practice. Followup
>>> patches could remove the logic in those two makefiles, just as there's
>>> potential for moving some common boilerplate from all the
>>> arch/*/dts/Makefile files to the new scripts/Makefile.dts.
>>>
>>> Signed-off-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
>>> ---
>>>  arch/arc/dts/Makefile        | 2 ++
>>>  arch/arm/dts/Makefile        | 2 ++
>>>  arch/m68k/dts/Makefile       | 2 ++
>>>  arch/microblaze/dts/Makefile | 2 ++
>>>  arch/mips/dts/Makefile       | 2 ++
>>>  arch/nds32/dts/Makefile      | 2 ++
>>>  arch/nios2/dts/Makefile      | 2 ++
>>>  arch/powerpc/dts/Makefile    | 2 ++
>>>  arch/riscv/dts/Makefile      | 2 ++
>>>  arch/sandbox/dts/Makefile    | 2 ++
>>>  arch/sh/dts/Makefile         | 2 ++
>>>  arch/x86/dts/Makefile        | 2 ++
>>>  arch/xtensa/dts/Makefile     | 2 ++
>>>  dts/Kconfig                  | 8 ++++----
>>>  scripts/Makefile.dts         | 3 +++
>>>  15 files changed, 33 insertions(+), 4 deletions(-)
>>>  create mode 100644 scripts/Makefile.dts
>>>
>>> diff --git a/arch/arc/dts/Makefile b/arch/arc/dts/Makefile
>>> index 515fe1fe53..532a8131c5 100644
>>> --- a/arch/arc/dts/Makefile
>>> +++ b/arch/arc/dts/Makefile
>>> @@ -8,6 +8,8 @@ dtb-$(CONFIG_TARGET_EMSDP) +=  emsdp.dtb
>>>  dtb-$(CONFIG_TARGET_HSDK) +=  hsdk.dtb hsdk-4xd.dtb
>>>  dtb-$(CONFIG_TARGET_IOT_DEVKIT) +=  iot_devkit.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS += -R 4 -p 0x1000
>>> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
>>> index b3e2a9c9d7..ef58be0381 100644
>>> --- a/arch/arm/dts/Makefile
>>> +++ b/arch/arm/dts/Makefile
>>> @@ -1163,6 +1163,8 @@ dtb-$(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE) += imx8mm-cl-iot-gate-optee.dtb
>>>
>>>  dtb-$(CONFIG_TARGET_EA_LPC3250DEVKITV2) += lpc3250-ea3250.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  # Add any required device tree compiler flags here
>>> diff --git a/arch/m68k/dts/Makefile b/arch/m68k/dts/Makefile
>>> index fdd435bc34..7988522eb9 100644
>>> --- a/arch/m68k/dts/Makefile
>>> +++ b/arch/m68k/dts/Makefile
>>> @@ -18,6 +18,8 @@ dtb-$(CONFIG_TARGET_M5373EVB) += M5373EVB.dtb
>>>  dtb-$(CONFIG_TARGET_AMCORE) += amcore.dtb
>>>  dtb-$(CONFIG_TARGET_STMARK2) += stmark2.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS += -R 4 -p 0x1000
>>> diff --git a/arch/microblaze/dts/Makefile b/arch/microblaze/dts/Makefile
>>> index 4690dc1b9f..427a8f9aac 100644
>>> --- a/arch/microblaze/dts/Makefile
>>> +++ b/arch/microblaze/dts/Makefile
>>> @@ -2,6 +2,8 @@
>>>
>>>  dtb-y += $(shell echo $(CONFIG_DEFAULT_DEVICE_TREE)).dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS += -R 4 -p 0x1000
>>> diff --git a/arch/mips/dts/Makefile b/arch/mips/dts/Makefile
>>> index 215283cfa0..95144b24dc 100644
>>> --- a/arch/mips/dts/Makefile
>>> +++ b/arch/mips/dts/Makefile
>>> @@ -34,6 +34,8 @@ dtb-$(CONFIG_SOC_JR2) += jr2_pcb110.dtb jr2_pcb111.dtb serval2_pcb112.dtb
>>>  dtb-$(CONFIG_SOC_SERVALT) += servalt_pcb116.dtb
>>>  dtb-$(CONFIG_SOC_SERVAL) += serval_pcb105.dtb serval_pcb106.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  # Add any required device tree compiler flags here
>>> diff --git a/arch/nds32/dts/Makefile b/arch/nds32/dts/Makefile
>>> index a8e23ad9ad..5a09e3b45b 100644
>>> --- a/arch/nds32/dts/Makefile
>>> +++ b/arch/nds32/dts/Makefile
>>> @@ -2,6 +2,8 @@
>>>
>>>  dtb-$(CONFIG_TARGET_ADP_AG101P) += ag101p.dtb
>>>  dtb-$(CONFIG_TARGET_ADP_AE3XX) += ae3xx.dtb
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS += -R 4 -p 0x1000
>>> diff --git a/arch/nios2/dts/Makefile b/arch/nios2/dts/Makefile
>>> index 0014acfdfb..2b29fa90f6 100644
>>> --- a/arch/nios2/dts/Makefile
>>> +++ b/arch/nios2/dts/Makefile
>>> @@ -2,6 +2,8 @@
>>>
>>>  dtb-y += $(CONFIG_DEFAULT_DEVICE_TREE:"%"=%).dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS += -R 4 -p 0x1000
>>> diff --git a/arch/powerpc/dts/Makefile b/arch/powerpc/dts/Makefile
>>> index ceaa8ce5c8..6f0e4d69f2 100644
>>> --- a/arch/powerpc/dts/Makefile
>>> +++ b/arch/powerpc/dts/Makefile
>>> @@ -29,6 +29,8 @@ dtb-$(CONFIG_TARGET_TUXX1) += kmtuxa1.dtb
>>>  dtb-$(CONFIG_TARGET_MCR3000) += mcr3000.dtb
>>>  dtb-$(CONFIG_TARGET_GAZERBEAM) += gazerbeam.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  # Add any required device tree compiler flags here
>>> diff --git a/arch/riscv/dts/Makefile b/arch/riscv/dts/Makefile
>>> index b6e9166767..45b6381139 100644
>>> --- a/arch/riscv/dts/Makefile
>>> +++ b/arch/riscv/dts/Makefile
>>> @@ -8,6 +8,8 @@ dtb-$(CONFIG_TARGET_SIFIVE_UNLEASHED) += hifive-unleashed-a00.dtb
>>>  dtb-$(CONFIG_TARGET_SIFIVE_UNMATCHED) += hifive-unmatched-a00.dtb
>>>  dtb-$(CONFIG_TARGET_SIPEED_MAIX) += k210-maix-bit.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS += -R 4 -p 0x1000
>>> diff --git a/arch/sandbox/dts/Makefile b/arch/sandbox/dts/Makefile
>>> index 3e5dc67d53..6cbc9bbcaa 100644
>>> --- a/arch/sandbox/dts/Makefile
>>> +++ b/arch/sandbox/dts/Makefile
>>> @@ -8,6 +8,8 @@ endif
>>>  dtb-$(CONFIG_UT_DM) += test.dtb
>>>  dtb-$(CONFIG_CMD_EXTENSION) += overlay0.dtbo overlay1.dtbo
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS += -R 4 -p 0x1000
>>> diff --git a/arch/sh/dts/Makefile b/arch/sh/dts/Makefile
>>> index e423bfd566..144fd3e7d2 100644
>>> --- a/arch/sh/dts/Makefile
>>> +++ b/arch/sh/dts/Makefile
>>> @@ -1,5 +1,7 @@
>>>  dtb-y += sh7751-r2dplus.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  # Add any required device tree compiler flags here
>>> diff --git a/arch/x86/dts/Makefile b/arch/x86/dts/Makefile
>>> index be209aaaf8..8c1c366546 100644
>>> --- a/arch/x86/dts/Makefile
>>> +++ b/arch/x86/dts/Makefile
>>> @@ -22,6 +22,8 @@ dtb-y += bayleybay.dtb \
>>>       slimbootloader.dtb \
>>>       baytrail_som-db5800-som-6867.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS += -R 4 -p 0x1000
>>> diff --git a/arch/xtensa/dts/Makefile b/arch/xtensa/dts/Makefile
>>> index 06ee25d2da..fbbdefaf2c 100644
>>> --- a/arch/xtensa/dts/Makefile
>>> +++ b/arch/xtensa/dts/Makefile
>>> @@ -2,6 +2,8 @@
>>>
>>>  dtb-$(CONFIG_XTFPGA) += ml605.dtb ml605_nommu.dtb kc705.dtb kc705_nommu.dtb
>>>
>>> +include $(srctree)/scripts/Makefile.dts
>>> +
>>>  targets += $(dtb-y)
>>>
>>>  DTC_FLAGS +=
>>> diff --git a/dts/Kconfig b/dts/Kconfig
>>> index b7c4a2fec0..446d709715 100644
>>> --- a/dts/Kconfig
>>> +++ b/dts/Kconfig
>>> @@ -132,8 +132,8 @@ config DEFAULT_DEVICE_TREE
>>>         $ make DEVICE_TREE=<device-tree-name>
>>>
>>>  config OF_LIST
>>> -     string "List of device tree files to include for DT control"
>>> -     depends on SPL_LOAD_FIT || MULTI_DTB_FIT
>>> +     string "List of device tree files to include for DT control" if SPL_LOAD_FIT || MULTI_DTB_FIT
>>> +     depends on OF_CONTROL
>>>       default DEFAULT_DEVICE_TREE
>>>       help
>>>         This option specifies a list of device tree files to use for DT
>>> @@ -240,8 +240,8 @@ config SPL_MULTI_DTB_FIT
>>>         capabilities, pad configurations).
>>>
>>>  config SPL_OF_LIST
>>> -     string "List of device tree files to include for DT control in SPL"
>>> -     depends on SPL_MULTI_DTB_FIT
>>> +     string "List of device tree files to include for DT control in SPL" if SPL_MULTI_DTB_FIT
>>> +     depends on SPL_OF_CONTROL
>>>       default OF_LIST
>>>       help
>>>         This option specifies a list of device tree files to use for DT
>>> diff --git a/scripts/Makefile.dts b/scripts/Makefile.dts
>>> new file mode 100644
>>> index 0000000000..2561025da8
>>> --- /dev/null
>>> +++ b/scripts/Makefile.dts
>>> @@ -0,0 +1,3 @@
>>> +# SPDX-License-Identifier: GPL-2.0+
>>> +
>>> +dtb-y += $(patsubst %,%.dtb,$(subst ",,$(CONFIG_$(SPL_)OF_LIST)))
>>
>> This seems like a good thing to me.  Simon?
> 
> Maybe. This is the second time I've read the patch and I'm still a bit
> confused. It would help to have a clear statement of what the patch
> does and some update to the docs.

The patch makes the build system DTRT in more cases, and makes it easier
to maintain a private branch (which almost all real-world projects end
up using) on top of U-Boot master.

> I really don't like the referred commit though:
> 
> 41f59f68539 microblaze: Build only DTBs for selected target
> 
> I much prefer that we build all the .dts for an SoC, not just the
> particular one for the single board, since they typically use common
> .dtsi files and it is easier to detect problems with related boards.
> So I actually don't like the idea of just building the one DT at all
> and I think the Makefile should list the .dts files too.

The patch changes nothing in that regard. I only add a few elements to
dtb-y which are clearly needed (namely, stuff mentioned in
CONFIG_OF_LIST). And the only reason I wrote the patch was because I was
burnt by the build system clearly _not_ doing the right thing - I've
told Kconfig that I need foo.dtb and foo-bootstrap.dtb (both of which
being custom .dts files I've added in a private branch, which include an
in-tree-soc.dtsi), but neither were being built. Of course, I could
patch the Makefile in the same private branch, but as I said, that just
leads to eternal merge conflicts. And I believe others have had the same
experience.

> Also, what exactly does it mean to make the prompt depend on an
> option? Does that make the option such that it can be set by defconfig
> only if the condition is true?

Yes, as has always been the case. If it's 'depends on BLA', the element
only exists (and can only be set via defconfig) if BLA is set. If it's
'string "The prompt" if BLA', the element always exists, but is only
settable (manually or from a defconfig) if BLA is set, otherwise it has
its default value (in this case, the singleton
CONFIG_DEFAULT_DEVICE_TREE). And this is precisely what is needed here -
if the conditions for OF_LIST to be changeable (extendable) are not met,
it should not be visible, but to make the makefile rule simple, we need
CONFIG_OF_LIST to always be defined.

Rasmus


More information about the U-Boot mailing list