Files
c630/overlay/etc/dracut.conf.d/10-c630.conf
rob thijssen fc4d7d7ceb
All checks were successful
build image / build (push) Successful in 39m19s
Stop kernel upgrades writing entries that cannot boot
Simulating an upgrade — running kernel-core's %posttrans command by hand —
turned up two faults that had nothing to do with the full /boot, and would
have broken every future kernel install on their own.

95-c630-devicetree trusted $KERNEL_INSTALL_BOOT_ROOT. `kernel-install inspect`
reports "Layout: other, Boot Root: /boot/efi" here, because the ESP is all it
recognises, while Fedora's 20-grub.install writes BLS entries to
/boot/loader/entries regardless. So the hook looked for the device tree on the
ESP, did not find it, and skipped the patch — leaving an entry with no
devicetree line, which on this machine cannot boot. Paths in a BLS entry are
relative to the filesystem holding the entry, so the only correct boot root is
the one carrying both loader/entries and dtb-<kver>. Search for that instead.

dracut-config-rescue sets dracut_rescue_image=yes, so each install also built
a second ~210 MiB initramfs, which is what refilled /boot straight after it
was cleared. That image cannot boot this machine either: the rescue entry is
<machine-id>-0-rescue.conf, carrying no kernel version, so the devicetree hook
never matches it. Turned off.

Verified by rerunning the simulation: both kernels now have a devicetree line
and a present initrd, no rescue image is generated, snd-soc-wsa881x is rebuilt
automatically, and /boot holds at 72%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011XgGF5wfxLDAybVnNz6eNQ
2026-08-14 16:54:41 +03:00

59 lines
3.1 KiB
Plaintext

# The image is built on a machine that is nothing like a C630, so the initramfs
# must be generic — a host-only initramfs would contain the builder's drivers.
hostonly="no"
hostonly_cmdline="no"
# UFS is the C630's only internal storage and the rootfs lives on it, so the
# controller and PHY drivers have to be in the initramfs, not modules loaded
# later from a filesystem we cannot yet read.
add_drivers+=" ufshcd-core ufshcd-pltfrm ufs-qcom phy-qcom-qmp-ufs "
# Needed before the display comes up, and cheap to include.
add_drivers+=" nvmem_qfprom qcom_scm rtc-pm8xxx "
# msm_dpu probes about six seconds in — while the initramfs is still the root
# filesystem, so anything under /usr/lib/firmware on the real root is not yet
# reachable. It asks for the Adreno 630 firmware, does not find it, and does not
# come back to try again:
#
# msm_dpu ae01000.display-controller: Direct firmware load for
# qcom/a630_sqe.fw failed with error -2
#
# The files are installed — they are simply not visible that early. A few tens
# of kilobytes in the initramfs fixes it. The model-signed zap shader is a
# separate problem; see docs/firmware.md.
install_items+=" /usr/lib/firmware/qcom/a630_sqe.fw.xz /usr/lib/firmware/qcom/a630_gmu.bin.xz /usr/lib/firmware/qcom/sdm845/a630_zap.mbn.xz "
# The DSPs lose the same race, and cannot be fixed the same way. qcom_q6v5_pas
# auto-boots the ADSP, CDSP and SLPI the moment it probes; if that happens in
# the initramfs the per-model firmware on the real root is not there yet:
#
# remoteproc remoteproc0: Direct firmware load for
# qcom/sdm850/LENOVO/81JL/qcadsp850.mbn failed with error -2
#
# and, as with the GPU, nothing retries. The ADSP hosts the whole audio path,
# so the result is a machine with no sound card at all — the sound driver sits
# in deferred probe reporting "error getting cpu dai name", which says nothing
# about firmware and sends you looking in the wrong place.
#
# Putting these blobs in the initramfs is not an option: they are ~20 MiB, and
# unlike the Adreno firmware they are not in any package — they are extracted
# from Windows by c630-firmware, so at build time they may not exist. Keeping
# the driver out of the initramfs instead means it loads after the switch to
# the real root, where the firmware is plainly visible. Nothing needs a DSP to
# get that far.
#
# The modem driver goes too. It is not needed early either, and leaving it out
# keeps it from crash-looping (see docs/firmware.md) before the rmtfs drop-in
# that tames it has had a chance to start.
omit_drivers+=" qcom_q6v5_pas qcom_q6v5_mss "
# No rescue image. dracut-config-rescue sets dracut_rescue_image=yes, so every
# kernel install builds a second ~210 MiB initramfs — on a /boot this size that
# is most of the partition, and it is what refills it after a cleanup. The
# image it produces cannot boot this machine anyway: the rescue entry is
# written as <machine-id>-0-rescue.conf, which does not carry the kernel
# version, so 95-c630-devicetree never matches it and it gets no devicetree
# line. A 210 MiB entry that is guaranteed not to boot is worse than no entry.
dracut_rescue_image="no"