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

Bug#1019412: initramfs-tools: Please support compressed firmware (new in Linux 5.19)



Source: initramfs-tools
Version: 0.142
Severity: wishlist
Tags: patch

Dear Maintainer,

Resubmitting MR 61
  https://salsa.debian.org/kernel-team/initramfs-tools/-/merge_requests/61
to debbugs after 4 months.

The patches, in order, do the following:
  1. /sys/module/firmware_class/parameters/path, if any, is added before
     anything else in the module loading path:
     https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/base/firmware_loader/main.c?h=v5.17#n406
  2. When configured with FW_LOADER_COMPRESS, Linux additionally
     searches firmware with an .xz suffix and decompresses it in-kernel:
     https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/base/firmware_loader/main.c?h=v5.17#n754
  3. In 5.19, when configured with FW_LOADER_COMPRESS_ZSTD, Linux will
     additionally support ZSTD-compression with a .zst suffix:
     https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git/commit/?h=driver-core-next&id=23cfbc6ec44e5e80d5522976ff45ffcdcddfb230

The end-goal of this is that I'd like the firmware for which this is a
gain to be installed compressed in Debian
(firmware-amd-graphics firmware-iwlwifi firmware-linux-free,
 a common setup, is 19M of .deb, 159M on-disk,
 but just 51M when subjected to
   find fw.xz/ -type f -exec xz {} \;
 (61M zstd default, 55M zstd -19);
 on one machine with that + 283M of xilinx firmware
 the gain is 464M -> 87M (116M, 94M)).

Best,
наб

-- System Information:
Debian Release: 11.4
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500, 'stable-debug'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.10.0-17-amd64 (SMP w/24 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_FIRMWARE_WORKAROUND, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
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
From 5774cc330c144f31a5aec00e016395149e810bb7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz>
Date: Tue, 26 Apr 2022 15:41:59 +0200
Subject: [PATCH 1/3] Respect fw_path_para in add_firmware()
X-Mutt-PGP: OS

/sys/module/firmware_class/parameters/path, if any, is added before
anything else in the module loading path:
  https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/base/firmware_loader/main.c?h=v5.17#n406
---
 hook-functions | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/hook-functions b/hook-functions
index 95bd584..e9f09c0 100644
--- a/hook-functions
+++ b/hook-functions
@@ -28,7 +28,7 @@ force_load()
 }
 
 # Takes a file containing a list of modules to be added as an
-# argument, figures out dependancies, and adds them.
+# argument, figures out dependencies, and adds them.
 #
 # Input file syntax:
 #
@@ -57,18 +57,23 @@ add_modules_from_file()
 # whether a warning should be printed in that case.)
 add_firmware()
 {
-	local firmware fwloc
+	local firmware fwloc fw_path_para path_firmware
 
 	firmware="${1}"
 
-	if [ -e "${DESTDIR}/lib/firmware/updates/${version?}/${firmware}" ] \
+	read -r fw_path_para < /sys/module/firmware_class/parameters/path
+
+	if { [ -n "$fw_path_para" ] && [ -e "${DESTDIR}/${fw_path_para}/${firmware}" ]; } \
+	|| [ -e "${DESTDIR}/lib/firmware/updates/${version?}/${firmware}" ] \
 	|| [ -e "${DESTDIR}/lib/firmware/updates/${firmware}" ] \
 	|| [ -e "${DESTDIR}/lib/firmware/${version}/${firmware}" ] \
 	|| [ -e "${DESTDIR}/lib/firmware/${firmware}" ]; then
 		return 0
 	fi
 
-	for fwloc in "/lib/firmware/updates/${version}/${firmware}" \
+	[ -n "$fw_path_para" ] && path_firmware="${fw_path_para}/${firmware}" || path_firmware=
+	for fwloc in "$path_firmware" \
+		"/lib/firmware/updates/${version}/${firmware}" \
 		"/lib/firmware/updates/${firmware}" \
 		"/lib/firmware/${version}/${firmware}" \
 		"/lib/firmware/${firmware}"; do
-- 
2.30.2

From c9fa06411d3116cf851b68c319669c0f3649fd46 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz>
Date: Tue, 26 Apr 2022 15:49:45 +0200
Subject: [PATCH 2/3] Handle compressed firmware in add_firmware()
X-Mutt-PGP: OS

With CONFIG_FW_LOADER_COMPRESS, Linux additionally tries the normal
search path but suffixed with .xz, and decompresses it in-kernel, cf.
  https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/base/firmware_loader/main.c?h=v5.17#n754
---
 hook-functions | 38 +++++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 17 deletions(-)

diff --git a/hook-functions b/hook-functions
index e9f09c0..3790343 100644
--- a/hook-functions
+++ b/hook-functions
@@ -57,32 +57,36 @@ add_modules_from_file()
 # whether a warning should be printed in that case.)
 add_firmware()
 {
-	local firmware fwloc fw_path_para path_firmware
+	local firmware suffix fwloc fw_path_para path_firmware
 
 	firmware="${1}"
 
 	read -r fw_path_para < /sys/module/firmware_class/parameters/path
 
-	if { [ -n "$fw_path_para" ] && [ -e "${DESTDIR}/${fw_path_para}/${firmware}" ]; } \
-	|| [ -e "${DESTDIR}/lib/firmware/updates/${version?}/${firmware}" ] \
-	|| [ -e "${DESTDIR}/lib/firmware/updates/${firmware}" ] \
-	|| [ -e "${DESTDIR}/lib/firmware/${version}/${firmware}" ] \
-	|| [ -e "${DESTDIR}/lib/firmware/${firmware}" ]; then
-		return 0
-	fi
-
-	[ -n "$fw_path_para" ] && path_firmware="${fw_path_para}/${firmware}" || path_firmware=
-	for fwloc in "$path_firmware" \
-		"/lib/firmware/updates/${version}/${firmware}" \
-		"/lib/firmware/updates/${firmware}" \
-		"/lib/firmware/${version}/${firmware}" \
-		"/lib/firmware/${firmware}"; do
-		if [ -e "$fwloc" ]; then
-			copy_file firmware "$fwloc"
+	for suffix in "" ".xz"; do
+		if { [ -n "$fw_path_para" ] && [ -e "${DESTDIR}/${fw_path_para}/${firmware}${suffix}" ]; } \
+		|| [ -e "${DESTDIR}/lib/firmware/updates/${version?}/${firmware}${suffix}" ] \
+		|| [ -e "${DESTDIR}/lib/firmware/updates/${firmware}${suffix}" ] \
+		|| [ -e "${DESTDIR}/lib/firmware/${version}/${firmware}${suffix}" ] \
+		|| [ -e "${DESTDIR}/lib/firmware/${firmware}${suffix}" ]; then
 			return 0
 		fi
 	done
 
+	for suffix in "" ".xz"; do
+		[ -n "$fw_path_para" ] && path_firmware="${fw_path_para}/${firmware}${suffix}" || path_firmware=
+		for fwloc in "$path_firmware" \
+			"/lib/firmware/updates/${version}/${firmware}${suffix}" \
+			"/lib/firmware/updates/${firmware}${suffix}" \
+			"/lib/firmware/${version}/${firmware}${suffix}" \
+			"/lib/firmware/${firmware}${suffix}"; do
+			if [ -e "$fwloc" ]; then
+				copy_file firmware "$fwloc"
+				return 0
+			fi
+		done
+	done
+
 	# We can't figure out where to get that firmware from.
 	return 1
 }
-- 
2.30.2

From 1aa61184f923336823028e9565a8e8ff98dec39d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz>
Date: Tue, 26 Apr 2022 16:13:20 +0200
Subject: [PATCH 3/3] Support ZSTD-compressed firmware in add_firmware()
X-Mutt-PGP: OS

Since 5.19, .zst-suffixed firmware is be supported with precedence over
.xz, cf:
  https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git/commit/?h=driver-core-next&id=23cfbc6ec44e5e80d5522976ff45ffcdcddfb230
---
 hook-functions | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hook-functions b/hook-functions
index 3790343..6e4bde3 100644
--- a/hook-functions
+++ b/hook-functions
@@ -63,7 +63,7 @@ add_firmware()
 
 	read -r fw_path_para < /sys/module/firmware_class/parameters/path
 
-	for suffix in "" ".xz"; do
+	for suffix in "" ".zst" ".xz"; do
 		if { [ -n "$fw_path_para" ] && [ -e "${DESTDIR}/${fw_path_para}/${firmware}${suffix}" ]; } \
 		|| [ -e "${DESTDIR}/lib/firmware/updates/${version?}/${firmware}${suffix}" ] \
 		|| [ -e "${DESTDIR}/lib/firmware/updates/${firmware}${suffix}" ] \
@@ -73,7 +73,7 @@ add_firmware()
 		fi
 	done
 
-	for suffix in "" ".xz"; do
+	for suffix in "" ".zst" ".xz"; do
 		[ -n "$fw_path_para" ] && path_firmware="${fw_path_para}/${firmware}${suffix}" || path_firmware=
 		for fwloc in "$path_firmware" \
 			"/lib/firmware/updates/${version}/${firmware}${suffix}" \
-- 
2.30.2

Attachment: signature.asc
Description: PGP signature


Reply to: