Bug#1080340: initramfs-tools does not use include firmware named in the devicetree
Package: initramfs-tools
Version: 0.145
Severity: normal
Tags: patch
X-Debbugs-Cc: debianbugs@redfelineninja.org.uk
Dear Maintainer,
Currently initramfs-tools relies on modinfo to identify firmware that must
be included in the initramfs. This is incomplete on systems where the name
of the firmware to load is provided by the devicetree rather than being
hardcoded and recorded in the MODULE_FIRMWARE() macro.
As a concrete example, recent Windows-on-Snapdragon laptops (Thinkpad X13s for
example) require firmware for the remoteproc drivers. If this firmware is not
available when the driver comes up then significant functionality (battery
status, external display, etc) is disabled. The combination of my MODULES=most
setup (plus encrypted rootfs and a few explicitly named modules) is exactly
that.
I disliked the idea that having a richer initramfs (including the remoteproc
drivers) can kills functionality so rather than try and blocklist things I
instead added an initramfs hook to scan the current devicetree and include any
firmware that might be needed.
~~~
#!/bin/sh -e
# Copyright (C) Linaro Ltd, 2024
# SPDX-License-Identifier: GPL-2.0-or-later
# Add firmware whose names are dictated by the devicetree. Such firmware cannot
# be described in a MODULE_FIRMWARE() meaning modinfo based discovery tools are
# insufficient to handle these cases.
# No prereqs
if [ "$1" = "prereqs" ]; then exit 0; fi
. /usr/share/initramfs-tools/hook-functions
# Only run if this system is booted with a devicetree
if [ ! -d /sys/firmware/devicetree ]; then exit 0; fi
# Scan for appropriately named devicetree nodes and add any firmware
# we discover this way to the initramfs. Sadly we cannot tell the difference
# between boot-critical firmware and any other so we have to be over-zealous.
# However the impact on initramfs size should be acceptable because we only
# scan the devicetree of the booted system.
for node in $(find /sys/firmware/devicetree -name firmware-name); do
firmware="$(cat "${node}")"
if ! add_firmware "${firmware}"; then
echo "W: Possible missing firmware /lib/firmware/${firmware}
found in devicetree" >&2
fi
done
~~~
It occurred to me that adding any devicetree specified firmware is a fairly
sensible default. The above code is harmless on ACPI-based systems and although
it's slightly over-zealous it shouldn't bloat the initramfs since too much
since it only scans the devicetree the system actually uses.
-- Package-specific info:
-- initramfs sizes
-rw-r--r-- 1 root root 35M Jul 30 11:43 /boot/initrd.img-6.10.0-00031-g9382a668c831
-rw-r--r-- 1 root root 38M Aug 20 14:31 /boot/initrd.img-6.10.4-arm64
-rw-r--r-- 1 root root 39M Sep 2 11:08 /boot/initrd.img-6.10.6-arm64
-rw-r--r-- 1 root root 42M Sep 2 13:39 /boot/initrd.img-6.11.0-rc6-g2997053728cd
-rw-r--r-- 1 root root 35M Mar 25 10:55 /boot/initrd.img-6.8.1-00063-ge6cb6f283f11
-rw-r--r-- 1 root root 35M Jun 27 13:26 /boot/initrd.img-6.9.1-00053-gd5fb0639fb27
-- /proc/cmdline
BOOT_IMAGE=/vmlinuz-6.11.0-rc6-g2997053728cd root=/dev/mapper/vg_aspen-rootfs ro clk_ignore_unused pd_ignore_unused arm64.nopauth iommu.passthrough=0 iommu.strict=0 pcie_aspm.policy=powersupersave workqueue.power_efficient=1 numa=fake=4 quiet
-- resume
RESUME=/dev/mapper/vg_aspen-swap
-- /proc/filesystems
ext3
ext2
ext4
vfat
fuseblk
-- lsmod
Module Size Used by
xt_conntrack 12288 1
nft_chain_nat 12288 3
xt_MASQUERADE 16384 1
nf_nat 45056 2 nft_chain_nat,xt_MASQUERADE
nf_conntrack_netlink 49152 0
nf_conntrack 139264 4 xt_conntrack,nf_nat,nf_conntrack_netlink,xt_MASQUERADE
nf_defrag_ipv6 20480 1 nf_conntrack
nf_defrag_ipv4 12288 1 nf_conntrack
xfrm_user 49152 1
xfrm_algo 12288 1 xfrm_user
xt_addrtype 12288 2
nft_compat 16384 4
nf_tables 241664 57 nft_compat,nft_chain_nat
libcrc32c 12288 3 nf_conntrack,nf_nat,nf_tables
br_netfilter 28672 0
bridge 266240 1 br_netfilter
stp 12288 1 bridge
llc 12288 2 bridge,stp
michael_mic 12288 1
rfcomm 73728 6
algif_hash 12288 1
algif_skcipher 12288 1
af_alg 20480 6 algif_hash,algif_skcipher
bnep 28672 2
snd_soc_wsa883x 20480 2
q6prm_clocks 12288 18
q6apm_lpass_dais 12288 1
snd_q6dsp_common 45056 2 q6apm_lpass_dais,q6prm_clocks
q6apm_dai 16384 1
q6prm 12288 1 q6prm_clocks
snd_seq_dummy 12288 0
snd_hrtimer 12288 1
snd_seq 81920 7 snd_seq_dummy
qrtr_mhi 16384 0
overlay 155648 0
binfmt_misc 20480 1
venus_enc 28672 0
venus_dec 32768 0
snd_q6apm 32768 4 q6apm_dai,q6prm,q6apm_lpass_dais
videobuf2_dma_contig 20480 2 venus_dec,venus_enc
qcom_spmi_adc5 40960 0
qcom_spmi_adc_tm5 20480 0
qcom_spmi_temp_alarm 12288 0
qcom_vadc_common 12288 2 qcom_spmi_adc_tm5,qcom_spmi_adc5
qcom_pon 12288 0
industrialio 86016 3 qcom_spmi_temp_alarm,qcom_spmi_adc_tm5,qcom_spmi_adc5
reboot_mode 12288 1 qcom_pon
uvcvideo 110592 0
ov5675 16384 0
videobuf2_vmalloc 16384 1 uvcvideo
uvc 12288 1 uvcvideo
hci_uart 139264 0
qcom_camss 270336 0
btqca 20480 1 hci_uart
v4l2_fwnode 28672 3 qcom_camss,ov5675
snd_soc_hdmi_codec 20480 0
v4l2_async 20480 3 v4l2_fwnode,qcom_camss,ov5675
btrtl 28672 1 hci_uart
videobuf2_dma_sg 16384 1 qcom_camss
snd_soc_sc8280xp 12288 5
venus_core 122880 2 venus_dec,venus_enc
snd_soc_qcom_sdw 12288 1 snd_soc_sc8280xp
btintel 53248 1 hci_uart
btbcm 20480 1 hci_uart
v4l2_mem2mem 28672 3 venus_dec,venus_core,venus_enc
snd_soc_qcom_common 12288 1 snd_soc_sc8280xp
videobuf2_memops 16384 3 videobuf2_vmalloc,videobuf2_dma_contig,videobuf2_dma_sg
bluetooth 720896 34 btrtl,btqca,btintel,hci_uart,btbcm,bnep,rfcomm
snd_usb_audio 327680 2
videobuf2_v4l2 20480 5 qcom_camss,venus_dec,uvcvideo,venus_enc,v4l2_mem2mem
snd_usbmidi_lib 36864 1 snd_usb_audio
pwrseq_core 16384 1 hci_uart
snd_hwdep 16384 1 snd_usb_audio
snd_rawmidi 40960 1 snd_usbmidi_lib
videodev 249856 10 v4l2_async,v4l2_fwnode,qcom_camss,venus_dec,ov5675,videobuf2_v4l2,uvcvideo,venus_core,venus_enc,v4l2_mem2mem
videobuf2_common 53248 11 qcom_camss,videobuf2_vmalloc,videobuf2_dma_contig,venus_dec,videobuf2_v4l2,uvcvideo,venus_core,videobuf2_dma_sg,venus_enc,v4l2_mem2mem,videobuf2_memops
snd_seq_device 12288 2 snd_seq,snd_rawmidi
qcom_stats 12288 0
ath11k_pci 20480 0
mc 57344 9 v4l2_async,videodev,qcom_camss,snd_usb_audio,ov5675,videobuf2_v4l2,uvcvideo,videobuf2_common,v4l2_mem2mem
ath11k 401408 1 ath11k_pci
mac80211 925696 1 ath11k
cdc_acm 36864 0
snd_soc_wcd938x 90112 1
snd_soc_wcd_classh 20480 1 snd_soc_wcd938x
libarc4 12288 1 mac80211
icc_bwmon 16384 0
apr 16384 2 snd_q6apm,q6prm
snd_soc_wcd938x_sdw 16384 1 snd_soc_wcd938x
cfg80211 843776 2 ath11k,mac80211
soundwire_qcom 36864 3
snd_soc_wcd_mbhc 28672 1 snd_soc_wcd938x
snd_soc_lpass_wsa_macro 61440 2
snd_soc_lpass_rx_macro 102400 2
snd_soc_lpass_tx_macro 94208 2
snd_soc_lpass_va_macro 53248 5
slimbus 24576 1 soundwire_qcom
regmap_sdw 12288 2 snd_soc_wcd938x_sdw,snd_soc_wsa883x
rfkill 28672 8 bluetooth,cfg80211
rpmsg_ctrl 12288 0
soundwire_bus 81920 6 regmap_sdw,snd_soc_sc8280xp,snd_soc_wcd938x_sdw,snd_soc_wsa883x,snd_soc_qcom_sdw,soundwire_qcom
snd_soc_lpass_macro_common 12288 4 snd_soc_lpass_wsa_macro,snd_soc_lpass_va_macro,snd_soc_lpass_rx_macro,snd_soc_lpass_tx_macro
mhi 102400 2 ath11k_pci,qrtr_mhi
rpmsg_char 16384 1 rpmsg_ctrl
qrtr_smd 16384 0
qcom_pd_mapper 20480 0
snd_soc_core 241664 15 snd_q6apm,q6apm_dai,snd_soc_sc8280xp,snd_soc_qcom_common,q6apm_lpass_dais,snd_soc_hdmi_codec,snd_soc_lpass_wsa_macro,snd_soc_wsa883x,snd_soc_lpass_va_macro,snd_soc_wcd938x,snd_soc_wcd_mbhc,snd_soc_lpass_rx_macro,soundwire_qcom,snd_soc_lpass_tx_macro,snd_soc_wcd_classh
fastrpc 36864 0
snd_compress 24576 1 snd_soc_core
snd_pcm_dmaengine 12288 1 snd_soc_core
qcom_rng 12288 0
snd_pcm 122880 8 q6apm_dai,q6apm_lpass_dais,snd_usb_audio,snd_soc_hdmi_codec,snd_compress,snd_soc_core,snd_soc_lpass_rx_macro,snd_pcm_dmaengine
rng_core 16384 1 qcom_rng
icc_osm_l3 16384 0
qcom_wdt 12288 0
snd_timer 40960 3 snd_seq,snd_hrtimer,snd_pcm
qcom_battmgr 16384 0
snd 94208 28 snd_seq,snd_seq_device,snd_hwdep,snd_soc_qcom_common,snd_usb_audio,snd_usbmidi_lib,snd_soc_hdmi_codec,snd_timer,snd_compress,snd_soc_core,snd_pcm,snd_rawmidi
soundcore 12288 1 snd
socinfo 20480 0
joydev 28672 0
fuse 147456 5
nvme_fabrics 28672 0
efi_pstore 12288 0
nfnetlink 16384 5 nft_compat,nf_conntrack_netlink,nf_tables
zram 28672 1
zsmalloc 20480 1 zram
ip_tables 24576 0
x_tables 32768 5 xt_conntrack,nft_compat,xt_addrtype,ip_tables,xt_MASQUERADE
hid_logitech_hidpp 49152 0
cdc_ncm 36864 0
cdc_ether 16384 1 cdc_ncm
usbnet 40960 2 cdc_ncm,cdc_ether
hid_logitech_dj 32768 0
r8152 110592 0
mii 16384 2 usbnet,r8152
usbhid 57344 2 hid_logitech_dj,hid_logitech_hidpp
dm_crypt 53248 1
dm_mod 143360 10 dm_crypt
dax 32768 1 dm_mod
hid_multitouch 28672 0
panel_edp 32768 0
qcom_pm8008_regulator 12288 3
hid_generic 12288 0
nvme 45056 3
nvme_core 131072 5 nvme,nvme_fabrics
i2c_hid_of_elan 12288 0
i2c_hid_of 12288 0
qcom_pm8008 12288 0
i2c_hid 36864 2 i2c_hid_of_elan,i2c_hid_of
hid 225280 10 i2c_hid,usbhid,hid_multitouch,hid_generic,hid_logitech_dj,hid_logitech_hidpp
pmic_glink_altmode 16384 0
aux_hpd_bridge 12288 1 pmic_glink_altmode
msm 1089536 17
drm_exec 12288 1 msm
gpu_sched 49152 1 msm
drm_display_helper 135168 2 msm,panel_edp
phy_qcom_qmp_combo 45056 8
drm_dp_aux_bus 12288 2 msm,panel_edp
aux_bridge 12288 1 phy_qcom_qmp_combo
drm_kms_helper 139264 3 msm,aux_bridge,drm_display_helper
leds_qcom_lpg 24576 1
crct10dif_ce 12288 1
polyval_ce 12288 0
polyval_generic 12288 1 polyval_ce
led_class_multicolor 12288 1 leds_qcom_lpg
rtc_pm8xxx 16384 1
nvmem_qcom_spmi_sdam 16384 1
gpio_sbu_mux 12288 4
i2c_qcom_geni 24576 0
pinctrl_sc8280xp_lpass_lpi 12288 0
drm 471040 17 gpu_sched,i2c_hid,drm_kms_helper,msm,drm_exec,panel_edp,aux_bridge,drm_display_helper,aux_hpd_bridge
phy_qcom_edp 16384 1
i2c_qcom_cci 20480 0
videocc_sm8350 20480 0
typec 61440 3 pmic_glink_altmode,gpio_sbu_mux,phy_qcom_qmp_combo
dwc3_qcom 16384 0
pinctrl_lpass_lpi 12288 13 pinctrl_sc8280xp_lpass_lpi
phy_qcom_qmp_usb 32768 4
phy_qcom_snps_femto_v2 16384 12
lpasscc_sc8280xp 12288 3
qcom_q6v5_pas 32768 0
qcom_pil_info 12288 1 qcom_q6v5_pas
qcom_common 12288 1 qcom_q6v5_pas
qcom_glink_smem 12288 1 qcom_common
qcom_q6v5 12288 1 qcom_q6v5_pas
phy_qcom_qmp_pcie 57344 3
qcom_sysmon 20480 2 qcom_q6v5_pas,qcom_q6v5
mdt_loader 12288 3 msm,qcom_q6v5_pas,venus_core
qrtr 36864 24 qrtr_smd,qrtr_mhi
pmic_glink 12288 2 pmic_glink_altmode,qcom_battmgr
pdr_interface 20480 2 apr,pmic_glink
qcom_pdr_msg 12288 2 qcom_pd_mapper,pdr_interface
qmi_helpers 24576 5 qcom_pd_mapper,ath11k,qcom_sysmon,qcom_pdr_msg,pdr_interface
pwm_bl 16384 0
-- /etc/initramfs-tools/modules
leds_qcom_lpg
qrtr
pmic_glink_altmode
gpio_sbu_mux
msm
-- /etc/kernel-img.conf
# Kernel image management overrides
# See kernel-img.conf(5) for details
do_symlinks = yes
do_bootloader = no
do_initrd = yes
link_in_boot = yes
-- /etc/initramfs-tools/initramfs.conf
MODULES=most
BUSYBOX=auto
KEYMAP=n
COMPRESS=zstd
DEVICE=
NFSROOT=auto
RUNSIZE=10%
FSTYPE=auto
-- /etc/initramfs-tools/update-initramfs.conf
update_initramfs=yes
backup_initramfs=no
-- /etc/crypttab
nvme0n1p6_crypt UUID=6f3be1c3-de4a-4faa-81e3-cb857acf5df4 none luks,discard
-- mkinitramfs hooks
/etc/initramfs-tools/hooks/:
devicetree-firmware
/usr/share/initramfs-tools/hooks:
cryptgnupg
cryptgnupg-sc
cryptkeyctl
cryptopensc
cryptpassdev
cryptroot
cryptroot-unlock
dmsetup
fsck
fuse
keymap
klibc-utils
kmod
lvm2
ntfs_3g
resume
thermal
udev
zz-busybox
-- System Information:
Debian Release: trixie/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: arm64 (aarch64)
Foreign Architectures: amd64
Kernel: Linux 6.11.0-rc6-g2997053728cd (SMP w/8 CPU threads)
Kernel taint flags: TAINT_WARN
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=en_GB:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages initramfs-tools depends on:
ii initramfs-tools-core 0.145
ii linux-base 4.10.1
initramfs-tools recommends no packages.
Versions of packages initramfs-tools suggests:
ii bash-completion 1:2.14.0-1
-- no debconf information
Reply to: