From: Rob Herring <robh@kernel.org>
To: Masahiro Yamada <masahiroy@kernel.org>
Cc: linux-kbuild@vger.kernel.org, linux-arch@vger.kernel.org,
linux-snps-arc@lists.infradead.org, linux-kernel@vger.kernel.org,
Michal Simek <monstr@monstr.eu>,
devicetree@vger.kernel.org, linux-mips@vger.kernel.org,
linux-openrisc@vger.kernel.org, Dinh Nguyen <dinguyen@kernel.org>
Subject: Re: [PATCH 04/15] kbuild: add generic support for built-in boot DTBs
Date: Thu, 5 Sep 2024 09:17:23 -0500 [thread overview]
Message-ID: <20240905141723.GC1517132-robh@kernel.org> (raw)
In-Reply-To: <20240904234803.698424-5-masahiroy@kernel.org>
On Thu, Sep 05, 2024 at 08:47:40AM +0900, Masahiro Yamada wrote:
> Some architectures embed boot DTBs in vmlinux. A potential issue for
> these architectures is a race condition during parallel builds because
> Kbuild descends into arch/*/boot/dts/ twice.
>
> One build thread is initiated by the 'dtbs' target, which is a
> prerequisite of the 'all' target in the top-level Makefile:
>
> ifdef CONFIG_OF_EARLY_FLATTREE
> all: dtbs
> endif
>
> For architectures that support the embedded boot dtb, arch/*/boot/dts/
> is visited also during the ordinary directory traversal in order to
> build obj-y objects that wrap DTBs.
>
> Since these build threads are unaware of each other, they can run
> simultaneously during parallel builds.
>
> This commit introduces a generic build rule to scripts/Makefile.vmlinux
> to support embedded boot DTBs in a race-free way. Architectures that
> want to use this rule need to select CONFIG_GENERIC_BUILTIN_DTB.
>
> After the migration, Makefiles under arch/*/boot/dts/ will be visited
> only once to build only *.dtb files.
>
> This change also aims to unify the CONFIG options used for embedded DTBs
> support. Currently, different architectures use different CONFIG options
> for the same purposes.
>
> The CONFIG options are unified as follows:
>
> - CONFIG_GENERIC_BUILTIN_DTB
>
> This enables the generic rule for embedded boot DTBs. This will be
> renamed to CONFIG_BUILTIN_DTB after all architectures migrate to the
> generic rule.
>
> - CONFIG_BUILTIN_DTB_NAME
>
> This specifies the path to the embedded DTB.
> (relative to arch/*/boot/dts/)
>
> - CONFIG_BUILTIN_DTB_ALL
>
> If this is enabled, all DTB files compiled under arch/*/boot/dts/ are
> embedded into vmlinux. Only used by MIPS.
I started to do this a long time ago, but then decided we didn't want to
encourage this feature. IMO it should only be for legacy bootloaders or
development/debug. And really, appended DTB is more flexible for the
legacy bootloader case.
In hindsight, a common config would have been easier to limit new
arches...
>
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---
>
> Makefile | 7 ++++++-
> drivers/of/Kconfig | 6 ++++++
> scripts/Makefile.vmlinux | 44 ++++++++++++++++++++++++++++++++++++++++
> scripts/link-vmlinux.sh | 4 ++++
> 4 files changed, 60 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index 145112bf281a..1c765c12ab9e 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1417,6 +1417,10 @@ ifdef CONFIG_OF_EARLY_FLATTREE
> all: dtbs
> endif
>
> +ifdef CONFIG_GENERIC_BUILTIN_DTB
> +vmlinux: dtbs
> +endif
> +
> endif
>
> PHONY += scripts_dtc
> @@ -1483,7 +1487,8 @@ endif # CONFIG_MODULES
> CLEAN_FILES += vmlinux.symvers modules-only.symvers \
> modules.builtin modules.builtin.modinfo modules.nsdeps \
> compile_commands.json rust/test \
> - rust-project.json .vmlinux.objs .vmlinux.export.c
> + rust-project.json .vmlinux.objs .vmlinux.export.c \
> + .builtin-dtbs-list .builtin-dtb.S
>
> # Directories & files removed with 'make mrproper'
> MRPROPER_FILES += include/config include/generated \
> diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
> index dd726c7056bf..5142e7d7fef8 100644
> --- a/drivers/of/Kconfig
> +++ b/drivers/of/Kconfig
> @@ -2,6 +2,12 @@
> config DTC
> bool
>
> +config GENERIC_BUILTIN_DTB
> + bool
So that we don't add new architectures to this, I would like something
like:
# Do not add new architectures to this list
depends on MIPS || RISCV || MICROBLAZE ...
Yes, it's kind of odd since the arch selects the option...
For sure, we don't want this option on arm64. For that, I can rely on
Will and Catalin rejecting a select, but on some new arch I can't.
> +
> +config BUILTIN_DTB_ALL
> + bool
Can this be limited to MIPS?
> +
> menuconfig OF
> bool "Device Tree and Open Firmware support"
> help
> diff --git a/scripts/Makefile.vmlinux b/scripts/Makefile.vmlinux
> index 5ceecbed31eb..4626b472da49 100644
> --- a/scripts/Makefile.vmlinux
> +++ b/scripts/Makefile.vmlinux
> @@ -17,6 +17,50 @@ quiet_cmd_cc_o_c = CC $@
> %.o: %.c FORCE
> $(call if_changed_dep,cc_o_c)
>
> +quiet_cmd_as_o_S = AS $@
> + cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
> +
> +%.o: %.S FORCE
> + $(call if_changed_dep,as_o_S)
> +
> +# Built-in dtb
> +# ---------------------------------------------------------------------------
> +
> +quiet_cmd_wrap_dtbs = WRAP $@
> + cmd_wrap_dtbs = { \
> + echo '\#include <asm-generic/vmlinux.lds.h>'; \
> + echo '.section .dtb.init.rodata,"a"'; \
> + while read dtb; do \
> + symbase=__dtb_$$(basename -s .dtb "$${dtb}" | tr - _); \
> + echo '.balign STRUCT_ALIGNMENT'; \
Is this always guaranteed to be at least 8 bytes? That's the required
alignment for dtbs and assumed by libfdt.
> + echo ".global $${symbase}_begin"; \
> + echo "$${symbase}_begin:"; \
> + echo '.incbin "'$$dtb'" '; \
> + echo ".global $${symbase}_end"; \
> + echo "$${symbase}_end:"; \
> + done < $<; \
> + } > $@
WARNING: multiple messages have this Message-ID (diff)
From: Rob Herring <robh@kernel.org>
To: Masahiro Yamada <masahiroy@kernel.org>
Cc: linux-kbuild@vger.kernel.org, linux-arch@vger.kernel.org,
linux-snps-arc@lists.infradead.org, linux-kernel@vger.kernel.org,
Michal Simek <monstr@monstr.eu>,
devicetree@vger.kernel.org, linux-mips@vger.kernel.org,
linux-openrisc@vger.kernel.org, Dinh Nguyen <dinguyen@kernel.org>
Subject: Re: [PATCH 04/15] kbuild: add generic support for built-in boot DTBs
Date: Thu, 5 Sep 2024 09:17:23 -0500 [thread overview]
Message-ID: <20240905141723.GC1517132-robh@kernel.org> (raw)
In-Reply-To: <20240904234803.698424-5-masahiroy@kernel.org>
On Thu, Sep 05, 2024 at 08:47:40AM +0900, Masahiro Yamada wrote:
> Some architectures embed boot DTBs in vmlinux. A potential issue for
> these architectures is a race condition during parallel builds because
> Kbuild descends into arch/*/boot/dts/ twice.
>
> One build thread is initiated by the 'dtbs' target, which is a
> prerequisite of the 'all' target in the top-level Makefile:
>
> ifdef CONFIG_OF_EARLY_FLATTREE
> all: dtbs
> endif
>
> For architectures that support the embedded boot dtb, arch/*/boot/dts/
> is visited also during the ordinary directory traversal in order to
> build obj-y objects that wrap DTBs.
>
> Since these build threads are unaware of each other, they can run
> simultaneously during parallel builds.
>
> This commit introduces a generic build rule to scripts/Makefile.vmlinux
> to support embedded boot DTBs in a race-free way. Architectures that
> want to use this rule need to select CONFIG_GENERIC_BUILTIN_DTB.
>
> After the migration, Makefiles under arch/*/boot/dts/ will be visited
> only once to build only *.dtb files.
>
> This change also aims to unify the CONFIG options used for embedded DTBs
> support. Currently, different architectures use different CONFIG options
> for the same purposes.
>
> The CONFIG options are unified as follows:
>
> - CONFIG_GENERIC_BUILTIN_DTB
>
> This enables the generic rule for embedded boot DTBs. This will be
> renamed to CONFIG_BUILTIN_DTB after all architectures migrate to the
> generic rule.
>
> - CONFIG_BUILTIN_DTB_NAME
>
> This specifies the path to the embedded DTB.
> (relative to arch/*/boot/dts/)
>
> - CONFIG_BUILTIN_DTB_ALL
>
> If this is enabled, all DTB files compiled under arch/*/boot/dts/ are
> embedded into vmlinux. Only used by MIPS.
I started to do this a long time ago, but then decided we didn't want to
encourage this feature. IMO it should only be for legacy bootloaders or
development/debug. And really, appended DTB is more flexible for the
legacy bootloader case.
In hindsight, a common config would have been easier to limit new
arches...
>
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---
>
> Makefile | 7 ++++++-
> drivers/of/Kconfig | 6 ++++++
> scripts/Makefile.vmlinux | 44 ++++++++++++++++++++++++++++++++++++++++
> scripts/link-vmlinux.sh | 4 ++++
> 4 files changed, 60 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index 145112bf281a..1c765c12ab9e 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1417,6 +1417,10 @@ ifdef CONFIG_OF_EARLY_FLATTREE
> all: dtbs
> endif
>
> +ifdef CONFIG_GENERIC_BUILTIN_DTB
> +vmlinux: dtbs
> +endif
> +
> endif
>
> PHONY += scripts_dtc
> @@ -1483,7 +1487,8 @@ endif # CONFIG_MODULES
> CLEAN_FILES += vmlinux.symvers modules-only.symvers \
> modules.builtin modules.builtin.modinfo modules.nsdeps \
> compile_commands.json rust/test \
> - rust-project.json .vmlinux.objs .vmlinux.export.c
> + rust-project.json .vmlinux.objs .vmlinux.export.c \
> + .builtin-dtbs-list .builtin-dtb.S
>
> # Directories & files removed with 'make mrproper'
> MRPROPER_FILES += include/config include/generated \
> diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
> index dd726c7056bf..5142e7d7fef8 100644
> --- a/drivers/of/Kconfig
> +++ b/drivers/of/Kconfig
> @@ -2,6 +2,12 @@
> config DTC
> bool
>
> +config GENERIC_BUILTIN_DTB
> + bool
So that we don't add new architectures to this, I would like something
like:
# Do not add new architectures to this list
depends on MIPS || RISCV || MICROBLAZE ...
Yes, it's kind of odd since the arch selects the option...
For sure, we don't want this option on arm64. For that, I can rely on
Will and Catalin rejecting a select, but on some new arch I can't.
> +
> +config BUILTIN_DTB_ALL
> + bool
Can this be limited to MIPS?
> +
> menuconfig OF
> bool "Device Tree and Open Firmware support"
> help
> diff --git a/scripts/Makefile.vmlinux b/scripts/Makefile.vmlinux
> index 5ceecbed31eb..4626b472da49 100644
> --- a/scripts/Makefile.vmlinux
> +++ b/scripts/Makefile.vmlinux
> @@ -17,6 +17,50 @@ quiet_cmd_cc_o_c = CC $@
> %.o: %.c FORCE
> $(call if_changed_dep,cc_o_c)
>
> +quiet_cmd_as_o_S = AS $@
> + cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
> +
> +%.o: %.S FORCE
> + $(call if_changed_dep,as_o_S)
> +
> +# Built-in dtb
> +# ---------------------------------------------------------------------------
> +
> +quiet_cmd_wrap_dtbs = WRAP $@
> + cmd_wrap_dtbs = { \
> + echo '\#include <asm-generic/vmlinux.lds.h>'; \
> + echo '.section .dtb.init.rodata,"a"'; \
> + while read dtb; do \
> + symbase=__dtb_$$(basename -s .dtb "$${dtb}" | tr - _); \
> + echo '.balign STRUCT_ALIGNMENT'; \
Is this always guaranteed to be at least 8 bytes? That's the required
alignment for dtbs and assumed by libfdt.
> + echo ".global $${symbase}_begin"; \
> + echo "$${symbase}_begin:"; \
> + echo '.incbin "'$$dtb'" '; \
> + echo ".global $${symbase}_end"; \
> + echo "$${symbase}_end:"; \
> + done < $<; \
> + } > $@
_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc
next prev parent reply other threads:[~2024-09-05 14:17 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-04 23:47 [PATCH 00/15] kbuild: refactor DTB build rules, introduce a generic built-in boot DTB support Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 01/15] kbuild: add intermediate targets for Flex/Bison in scripts/Makefile.host Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 02/15] kbuild: split device tree build rules into scripts/Makefile.dtbs Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-05 13:44 ` Rob Herring
2024-09-05 13:44 ` Rob Herring
2024-09-04 23:47 ` [PATCH 03/15] kbuild: move non-boot builtin DTBs to .init.rodata section Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-05 13:47 ` Rob Herring
2024-09-05 13:47 ` Rob Herring
2024-09-04 23:47 ` [PATCH 04/15] kbuild: add generic support for built-in boot DTBs Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-05 14:17 ` Rob Herring [this message]
2024-09-05 14:17 ` Rob Herring
2024-09-06 1:56 ` Masahiro Yamada
2024-09-06 1:56 ` Masahiro Yamada
2024-09-10 9:35 ` Masahiro Yamada
2024-09-10 9:35 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 05/15] MIPS: migrate to generic rule for built-in DTBs Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 06/15] riscv: migrate to the generic rule for built-in DTB Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-09 16:30 ` Conor Dooley
2024-09-09 16:30 ` Conor Dooley
2024-09-04 23:47 ` [PATCH 07/15] LoongArch: " Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 08/15] ARC: " Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 09/15] openrisc: " Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 10/15] xtensa: " Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 11/15] nios2: " Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 12/15] sh: " Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 13/15] microblaze: " Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 14/15] kbuild: rename CONFIG_GENERIC_BUILTIN_DTB to CONFIG_BUILTIN_DTB Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
2024-09-05 14:38 ` Rob Herring
2024-09-05 14:38 ` Rob Herring
2024-09-06 0:27 ` Masahiro Yamada
2024-09-06 0:27 ` Masahiro Yamada
2024-09-04 23:47 ` [PATCH 15/15] kbuild: use .init.rodata section unconditionally for cmd_wrap_S_dtb Masahiro Yamada
2024-09-04 23:47 ` Masahiro Yamada
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240905141723.GC1517132-robh@kernel.org \
--to=robh@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dinguyen@kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=linux-openrisc@vger.kernel.org \
--cc=linux-snps-arc@lists.infradead.org \
--cc=masahiroy@kernel.org \
--cc=monstr@monstr.eu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.