Support 'make image.fit FIT_MODULES=1' to put all the modules into a
ramdisk image within the FIT.
Add image.fit as a target which requires modules, so that modules will
built automatically when using FIT_MODULES is not empty.
Signed-off-by: Simon Glass <sjg@chromium.org>
Suggested-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Suggested-by: Reviewed-by: Nicolas Schier <nsc@kernel.org>
Acked-by: Nathan Chancellor <nathan@kernel.org>
---
Changes in v6:
- Mention that FIT_MODULES just needs to be non-empty
- Make use of modules.order instead of using 'find'
Changes in v5:
- Build modules automatically if needed (fix from Nicolas Schier)
Changes in v4:
- Rename the Makefile variable from 'EXTRA' to 'MAKE_FIT_FLAGS'
- Use an empty FIT_MODULES to disable the feature, instead of '0'
- Make use of the 'modules' dependency to ensure modules are built
- Pass the list of modules to the script
Makefile | 1 +
arch/arm64/Makefile | 1 +
scripts/Makefile.lib | 6 +++++-
3 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index 8cd46222fc48..4eccaef95826 100644
--- a/Makefile
+++ b/Makefile
@@ -773,6 +773,7 @@ endif
# Just "make" or "make all" shall build modules as well
modules-targets := all
+modules-targets += $(if $(FIT_MODULES),image.fit)
modules-targets += modules
modules-targets += nsdeps
modules-targets += compile_commands.json
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 73a10f65ce8b..7036f251ab40 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -174,6 +174,7 @@ endif
all: $(notdir $(KBUILD_IMAGE))
image.fit: dtbs
+image.fit: $(if $(FIT_MODULES),modules)
vmlinuz.efi image.fit: Image
$(BOOT_TARGETS): vmlinux
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 1d581ba5df66..28e0cc0865b1 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -398,11 +398,15 @@ MAKE_FIT := $(srctree)/scripts/make_fit.py
# Use this to override the compression algorithm
FIT_COMPRESSION ?= gzip
+# Set this to non-empty to include an initrd with all the kernel modules
+FIT_MODULES ?=
+
quiet_cmd_fit = FIT $@
cmd_fit = $(MAKE_FIT) -o $@ --arch $(UIMAGE_ARCH) --os linux \
- --name '$(UIMAGE_NAME)' \
+ --name '$(UIMAGE_NAME)' $(MAKE_FIT_FLAGS) \
$(if $(findstring 1,$(KBUILD_VERBOSE)),-v) \
$(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \
+ $(if $(FIT_MODULES),--modules @$(objtree)/modules.order) \
--compress $(FIT_COMPRESSION) -k $< @$(word 2,$^)
# XZ
--
2.43.0
On Wed, Nov 19, 2025 at 11:13:27AM -0700, Simon Glass wrote: > Support 'make image.fit FIT_MODULES=1' to put all the modules into a > ramdisk image within the FIT. > > Add image.fit as a target which requires modules, so that modules will > built automatically when using FIT_MODULES is not empty. > > Signed-off-by: Simon Glass <sjg@chromium.org> > Suggested-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > Suggested-by: Reviewed-by: Nicolas Schier <nsc@kernel.org> I think the Reviewed-by: Nicolas Schier <nsc@kernel.org> is enough :) Thanks. > Acked-by: Nathan Chancellor <nathan@kernel.org> > --- > > Changes in v6: > - Mention that FIT_MODULES just needs to be non-empty > - Make use of modules.order instead of using 'find' > > Changes in v5: > - Build modules automatically if needed (fix from Nicolas Schier) > > Changes in v4: > - Rename the Makefile variable from 'EXTRA' to 'MAKE_FIT_FLAGS' > - Use an empty FIT_MODULES to disable the feature, instead of '0' > - Make use of the 'modules' dependency to ensure modules are built > - Pass the list of modules to the script > > Makefile | 1 + > arch/arm64/Makefile | 1 + > scripts/Makefile.lib | 6 +++++- > 3 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/Makefile b/Makefile > index 8cd46222fc48..4eccaef95826 100644 > --- a/Makefile > +++ b/Makefile > @@ -773,6 +773,7 @@ endif > # Just "make" or "make all" shall build modules as well > > modules-targets := all > +modules-targets += $(if $(FIT_MODULES),image.fit) > modules-targets += modules > modules-targets += nsdeps > modules-targets += compile_commands.json > diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile > index 73a10f65ce8b..7036f251ab40 100644 > --- a/arch/arm64/Makefile > +++ b/arch/arm64/Makefile > @@ -174,6 +174,7 @@ endif > all: $(notdir $(KBUILD_IMAGE)) > > image.fit: dtbs > +image.fit: $(if $(FIT_MODULES),modules) > > vmlinuz.efi image.fit: Image > $(BOOT_TARGETS): vmlinux > diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib > index 1d581ba5df66..28e0cc0865b1 100644 > --- a/scripts/Makefile.lib > +++ b/scripts/Makefile.lib > @@ -398,11 +398,15 @@ MAKE_FIT := $(srctree)/scripts/make_fit.py > # Use this to override the compression algorithm > FIT_COMPRESSION ?= gzip > > +# Set this to non-empty to include an initrd with all the kernel modules > +FIT_MODULES ?= > + > quiet_cmd_fit = FIT $@ > cmd_fit = $(MAKE_FIT) -o $@ --arch $(UIMAGE_ARCH) --os linux \ > - --name '$(UIMAGE_NAME)' \ > + --name '$(UIMAGE_NAME)' $(MAKE_FIT_FLAGS) \ > $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) \ > $(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \ > + $(if $(FIT_MODULES),--modules @$(objtree)/modules.order) \ > --compress $(FIT_COMPRESSION) -k $< @$(word 2,$^) > > # XZ > -- > 2.43.0 > -- Nicolas
On Wed, Nov 19, 2025 at 11:13:27AM -0700, Simon Glass wrote: > Support 'make image.fit FIT_MODULES=1' to put all the modules into a > ramdisk image within the FIT. > > Add image.fit as a target which requires modules, so that modules will > built automatically when using FIT_MODULES is not empty. > > Signed-off-by: Simon Glass <sjg@chromium.org> > Suggested-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > Suggested-by: Reviewed-by: Nicolas Schier <nsc@kernel.org> > Acked-by: Nathan Chancellor <nathan@kernel.org> > --- > > Changes in v6: > - Mention that FIT_MODULES just needs to be non-empty > - Make use of modules.order instead of using 'find' > > Changes in v5: > - Build modules automatically if needed (fix from Nicolas Schier) > > Changes in v4: > - Rename the Makefile variable from 'EXTRA' to 'MAKE_FIT_FLAGS' > - Use an empty FIT_MODULES to disable the feature, instead of '0' > - Make use of the 'modules' dependency to ensure modules are built > - Pass the list of modules to the script > > Makefile | 1 + > arch/arm64/Makefile | 1 + > scripts/Makefile.lib | 6 +++++- > 3 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/Makefile b/Makefile > index 8cd46222fc48..4eccaef95826 100644 > --- a/Makefile > +++ b/Makefile > @@ -773,6 +773,7 @@ endif > # Just "make" or "make all" shall build modules as well > > modules-targets := all > +modules-targets += $(if $(FIT_MODULES),image.fit) > modules-targets += modules > modules-targets += nsdeps > modules-targets += compile_commands.json > diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile > index 73a10f65ce8b..7036f251ab40 100644 > --- a/arch/arm64/Makefile > +++ b/arch/arm64/Makefile > @@ -174,6 +174,7 @@ endif > all: $(notdir $(KBUILD_IMAGE)) > > image.fit: dtbs > +image.fit: $(if $(FIT_MODULES),modules) > > vmlinuz.efi image.fit: Image > $(BOOT_TARGETS): vmlinux > diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib > index 1d581ba5df66..28e0cc0865b1 100644 > --- a/scripts/Makefile.lib > +++ b/scripts/Makefile.lib > @@ -398,11 +398,15 @@ MAKE_FIT := $(srctree)/scripts/make_fit.py > # Use this to override the compression algorithm > FIT_COMPRESSION ?= gzip > > +# Set this to non-empty to include an initrd with all the kernel modules > +FIT_MODULES ?= > + > quiet_cmd_fit = FIT $@ > cmd_fit = $(MAKE_FIT) -o $@ --arch $(UIMAGE_ARCH) --os linux \ > - --name '$(UIMAGE_NAME)' \ > + --name '$(UIMAGE_NAME)' $(MAKE_FIT_FLAGS) \ Remnant of a previous revision? > $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) \ > $(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \ > + $(if $(FIT_MODULES),--modules @$(objtree)/modules.order) \ I am wondering how module dependencies work without the depmod invocation and modules.dep file. > --compress $(FIT_COMPRESSION) -k $< @$(word 2,$^) > > # XZ > -- > 2.43.0 >
Hi Thomas, On Thu, 20 Nov 2025 at 00:49, Thomas Weißschuh <thomas.weissschuh@linutronix.de> wrote: > > On Wed, Nov 19, 2025 at 11:13:27AM -0700, Simon Glass wrote: > > Support 'make image.fit FIT_MODULES=1' to put all the modules into a > > ramdisk image within the FIT. > > > > Add image.fit as a target which requires modules, so that modules will > > built automatically when using FIT_MODULES is not empty. > > > > Signed-off-by: Simon Glass <sjg@chromium.org> > > Suggested-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > > Suggested-by: Reviewed-by: Nicolas Schier <nsc@kernel.org> > > Acked-by: Nathan Chancellor <nathan@kernel.org> > > --- > > > > Changes in v6: > > - Mention that FIT_MODULES just needs to be non-empty > > - Make use of modules.order instead of using 'find' > > > > Changes in v5: > > - Build modules automatically if needed (fix from Nicolas Schier) > > > > Changes in v4: > > - Rename the Makefile variable from 'EXTRA' to 'MAKE_FIT_FLAGS' > > - Use an empty FIT_MODULES to disable the feature, instead of '0' > > - Make use of the 'modules' dependency to ensure modules are built > > - Pass the list of modules to the script > > > > Makefile | 1 + > > arch/arm64/Makefile | 1 + > > scripts/Makefile.lib | 6 +++++- > > 3 files changed, 7 insertions(+), 1 deletion(-) > > > > diff --git a/Makefile b/Makefile > > index 8cd46222fc48..4eccaef95826 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -773,6 +773,7 @@ endif > > # Just "make" or "make all" shall build modules as well > > > > modules-targets := all > > +modules-targets += $(if $(FIT_MODULES),image.fit) > > modules-targets += modules > > modules-targets += nsdeps > > modules-targets += compile_commands.json > > diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile > > index 73a10f65ce8b..7036f251ab40 100644 > > --- a/arch/arm64/Makefile > > +++ b/arch/arm64/Makefile > > @@ -174,6 +174,7 @@ endif > > all: $(notdir $(KBUILD_IMAGE)) > > > > image.fit: dtbs > > +image.fit: $(if $(FIT_MODULES),modules) > > > > vmlinuz.efi image.fit: Image > > $(BOOT_TARGETS): vmlinux > > diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib > > index 1d581ba5df66..28e0cc0865b1 100644 > > --- a/scripts/Makefile.lib > > +++ b/scripts/Makefile.lib > > @@ -398,11 +398,15 @@ MAKE_FIT := $(srctree)/scripts/make_fit.py > > # Use this to override the compression algorithm > > FIT_COMPRESSION ?= gzip > > > > +# Set this to non-empty to include an initrd with all the kernel modules > > +FIT_MODULES ?= > > + > > quiet_cmd_fit = FIT $@ > > cmd_fit = $(MAKE_FIT) -o $@ --arch $(UIMAGE_ARCH) --os linux \ > > - --name '$(UIMAGE_NAME)' \ > > + --name '$(UIMAGE_NAME)' $(MAKE_FIT_FLAGS) \ > > Remnant of a previous revision? The flags are there to allow extra options to be passed if needed. > > > $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) \ > > $(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \ > > + $(if $(FIT_MODULES),--modules @$(objtree)/modules.order) \ > > I am wondering how module dependencies work without the depmod invocation > and modules.dep file. We have a mechanism to place a pre-build initrd with the filesystem, etc. into the FIT. But for this particular feature (suggested by Ahmad Fatoum) we are just providing the raw modules. Presumably another initrd would be needed to provide the startup files? > > > --compress $(FIT_COMPRESSION) -k $< @$(word 2,$^) > > > > # XZ > > -- > > 2.43.0 > > Regards, Simon
On Tue, Nov 25, 2025 at 02:58:12PM -0700, Simon Glass wrote: > On Thu, 20 Nov 2025 at 00:49, Thomas Weißschuh > <thomas.weissschuh@linutronix.de> wrote: > > > > On Wed, Nov 19, 2025 at 11:13:27AM -0700, Simon Glass wrote: (...) > > > quiet_cmd_fit = FIT $@ > > > cmd_fit = $(MAKE_FIT) -o $@ --arch $(UIMAGE_ARCH) --os linux \ > > > - --name '$(UIMAGE_NAME)' \ > > > + --name '$(UIMAGE_NAME)' $(MAKE_FIT_FLAGS) \ > > > > Remnant of a previous revision? > > The flags are there to allow extra options to be passed if needed. Are they necessary for the module functionality added here? If not I'd put them into a dedicated commit. > > > > > $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) \ > > > $(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \ > > > + $(if $(FIT_MODULES),--modules @$(objtree)/modules.order) \ > > > > I am wondering how module dependencies work without the depmod invocation > > and modules.dep file. > > We have a mechanism to place a pre-build initrd with the filesystem, > etc. into the FIT. But for this particular feature (suggested by Ahmad > Fatoum) we are just providing the raw modules. Presumably another > initrd would be needed to provide the startup files? modules.dep is more than optional and generic startup files but an integral part of a module tree. Without it, any module depending on another module's symbols will fail to load. Also the modules will be unsigned, potentially making them unloadable. Ahmad's patch does produce a complete and fully functional module tree by means of 'make headers_install'. > > > --compress $(FIT_COMPRESSION) -k $< @$(word 2,$^) > > > > > > # XZ > > > -- > > > 2.43.0
Hi, On 11/26/25 8:16 AM, Thomas Weißschuh wrote: > On Tue, Nov 25, 2025 at 02:58:12PM -0700, Simon Glass wrote: >> On Thu, 20 Nov 2025 at 00:49, Thomas Weißschuh >> <thomas.weissschuh@linutronix.de> wrote: >>> >>> On Wed, Nov 19, 2025 at 11:13:27AM -0700, Simon Glass wrote: > > (...) > >>>> quiet_cmd_fit = FIT $@ >>>> cmd_fit = $(MAKE_FIT) -o $@ --arch $(UIMAGE_ARCH) --os linux \ >>>> - --name '$(UIMAGE_NAME)' \ >>>> + --name '$(UIMAGE_NAME)' $(MAKE_FIT_FLAGS) \ >>> >>> Remnant of a previous revision? >> >> The flags are there to allow extra options to be passed if needed. > > Are they necessary for the module functionality added here? > If not I'd put them into a dedicated commit. > >>> >>>> $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) \ >>>> $(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \ >>>> + $(if $(FIT_MODULES),--modules @$(objtree)/modules.order) \ >>> >>> I am wondering how module dependencies work without the depmod invocation >>> and modules.dep file. >> >> We have a mechanism to place a pre-build initrd with the filesystem, >> etc. into the FIT. But for this particular feature (suggested by Ahmad >> Fatoum) we are just providing the raw modules. Presumably another >> initrd would be needed to provide the startup files? > > modules.dep is more than optional and generic startup files but an integral > part of a module tree. Without it, any module depending on another module's > symbols will fail to load. Also the modules will be unsigned, potentially > making them unloadable. I'll use the occasion to elaborate a bit on why I thought adding modules is a good idea. - You have a system boot from FIT and maybe even a r/o rootfs - You want to boot a different kernel without any userspace changes, e.g. to bisect - Fortunately, you have a build target that generates you a FIT with kernel, enabled device trees and all modules (including deps and such) - In the bootloader[1], you specify that a CPIO with a minimal init[2] that bindmounts /lib/modules in the initramfs over the rootfs modules before pivot_root and that's it, you are running your new kernel with the old rootfs unchanged. I believe this would be really handy, which is why I suggested it. > Ahmad's patch does produce a complete and fully > functional module tree by means of 'make headers_install'. I originally thought that we could generate the CPIO normally as part of the kernel build and then we can readily depend on it in the rule that invokes make_fit.py. If this proves to be too cumbersome, I think it's already an improvement if the user can manually run make modules-cpio-pkg and then make image.fit with the initrd specified. A single target would be neater of course, but I didn't intend for this to stall the series. It can always follow later. [1]: For my particular usage, I intend to extend the barebox boot override mechanism. Currently, it's possible to do: barebox$ boot -o bootm.initrd=/mnt/tftp/my-ramdisk.cpio /mnt/tftp/my-fit and I want to extend it to allow appending any number of CPIOs: barebox$ boot -o bootm.initrd=":/mnt/tftp/my-init.cpio" /mnt/tftp/my-fit [2]: The bind mount logic for the initramfs init will probably go into https://github.com/pengutronix/rsinit, which I can compile once per architecture, put into my TFTP srv path and then not have to worry about it. Cheers, Ahmad > >>>> --compress $(FIT_COMPRESSION) -k $< @$(word 2,$^) >>>> >>>> # XZ >>>> -- >>>> 2.43.0 > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
On Thu, Nov 20, 2025 at 08:49:14AM +0100, Thomas Weißschuh wrote: > On Wed, Nov 19, 2025 at 11:13:27AM -0700, Simon Glass wrote: > > Support 'make image.fit FIT_MODULES=1' to put all the modules into a > > ramdisk image within the FIT. > > > > Add image.fit as a target which requires modules, so that modules will > > built automatically when using FIT_MODULES is not empty. > > > > Signed-off-by: Simon Glass <sjg@chromium.org> > > Suggested-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > > Suggested-by: Reviewed-by: Nicolas Schier <nsc@kernel.org> > > Acked-by: Nathan Chancellor <nathan@kernel.org> > > --- > > > > Changes in v6: > > - Mention that FIT_MODULES just needs to be non-empty > > - Make use of modules.order instead of using 'find' > > > > Changes in v5: > > - Build modules automatically if needed (fix from Nicolas Schier) > > > > Changes in v4: > > - Rename the Makefile variable from 'EXTRA' to 'MAKE_FIT_FLAGS' > > - Use an empty FIT_MODULES to disable the feature, instead of '0' > > - Make use of the 'modules' dependency to ensure modules are built > > - Pass the list of modules to the script > > > > Makefile | 1 + > > arch/arm64/Makefile | 1 + > > scripts/Makefile.lib | 6 +++++- > > 3 files changed, 7 insertions(+), 1 deletion(-) > > > > diff --git a/Makefile b/Makefile > > index 8cd46222fc48..4eccaef95826 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -773,6 +773,7 @@ endif > > # Just "make" or "make all" shall build modules as well > > > > modules-targets := all > > +modules-targets += $(if $(FIT_MODULES),image.fit) > > modules-targets += modules > > modules-targets += nsdeps > > modules-targets += compile_commands.json > > diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile > > index 73a10f65ce8b..7036f251ab40 100644 > > --- a/arch/arm64/Makefile > > +++ b/arch/arm64/Makefile > > @@ -174,6 +174,7 @@ endif > > all: $(notdir $(KBUILD_IMAGE)) > > > > image.fit: dtbs > > +image.fit: $(if $(FIT_MODULES),modules) > > > > vmlinuz.efi image.fit: Image > > $(BOOT_TARGETS): vmlinux > > diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib > > index 1d581ba5df66..28e0cc0865b1 100644 > > --- a/scripts/Makefile.lib > > +++ b/scripts/Makefile.lib > > @@ -398,11 +398,15 @@ MAKE_FIT := $(srctree)/scripts/make_fit.py > > # Use this to override the compression algorithm > > FIT_COMPRESSION ?= gzip > > > > +# Set this to non-empty to include an initrd with all the kernel modules > > +FIT_MODULES ?= > > + > > quiet_cmd_fit = FIT $@ > > cmd_fit = $(MAKE_FIT) -o $@ --arch $(UIMAGE_ARCH) --os linux \ > > - --name '$(UIMAGE_NAME)' \ > > + --name '$(UIMAGE_NAME)' $(MAKE_FIT_FLAGS) \ > > Remnant of a previous revision? > > > $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) \ > > $(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \ > > + $(if $(FIT_MODULES),--modules @$(objtree)/modules.order) \ > > I am wondering how module dependencies work without the depmod invocation > and modules.dep file. oh, good point. Stripping and signing and module compression is also done during 'modules_install'. -- Nicolas
© 2016 - 2025 Red Hat, Inc.