[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: