Merge pull request #172820 from alyssais/compressed-firmware

Compressed firmware
This commit is contained in:
adisbladis 2022-05-14 02:38:48 +08:00 committed by GitHub
commit fb222e0086
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 34 additions and 9 deletions

View File

@ -83,7 +83,6 @@ in {
broadcom-bt-firmware broadcom-bt-firmware
b43Firmware_5_1_138 b43Firmware_5_1_138
b43Firmware_6_30_163_46 b43Firmware_6_30_163_46
b43FirmwareCutter
xow_dongle-firmware xow_dongle-firmware
] ++ optionals pkgs.stdenv.hostPlatform.isx86 [ ] ++ optionals pkgs.stdenv.hostPlatform.isx86 [
facetimehd-calibration facetimehd-calibration

View File

@ -171,6 +171,11 @@ let
mv etc/udev/hwdb.bin $out mv etc/udev/hwdb.bin $out
''; '';
compressFirmware = if config.boot.kernelPackages.kernelAtLeast "5.3" then
pkgs.compressFirmwareXz
else
id;
# Udev has a 512-character limit for ENV{PATH}, so create a symlink # Udev has a 512-character limit for ENV{PATH}, so create a symlink
# tree to work around this. # tree to work around this.
udevPath = pkgs.buildEnv { udevPath = pkgs.buildEnv {
@ -267,7 +272,7 @@ in
''; '';
apply = list: pkgs.buildEnv { apply = list: pkgs.buildEnv {
name = "firmware"; name = "firmware";
paths = list; paths = map compressFirmware list;
pathsToLink = [ "/lib/firmware" ]; pathsToLink = [ "/lib/firmware" ];
ignoreCollisions = true; ignoreCollisions = true;
}; };

View File

@ -273,9 +273,6 @@ in
boot.kernelModules = [ "loop" "atkbd" ]; boot.kernelModules = [ "loop" "atkbd" ];
# The Linux kernel >= 2.6.27 provides firmware.
hardware.firmware = [ kernel ];
# Create /etc/modules-load.d/nixos.conf, which is read by # Create /etc/modules-load.d/nixos.conf, which is read by
# systemd-modules-load.service to load required kernel modules. # systemd-modules-load.service to load required kernel modules.
environment.etc = environment.etc =

View File

@ -0,0 +1,16 @@
{ runCommand }:
firmware:
runCommand "${firmware.name}-xz" {} ''
mkdir -p $out/lib
(cd ${firmware} && find lib/firmware -type d -print0) |
(cd $out && xargs -0 mkdir -v --)
(cd ${firmware} && find lib/firmware -type f -print0) |
(cd $out && xargs -0tP "$NIX_BUILD_CORES" -n1 \
sh -c 'xz -9c -T1 -C crc32 --lzma2=dict=2MiB "${firmware}/$1" > "$1.xz"' --)
(cd ${firmware} && find lib/firmware -type l) | while read link; do
target="$(readlink "${firmware}/$link")"
ln -vs -- "''${target/^${firmware}/$out}.xz" "$out/$link.xz"
done
''

View File

@ -81,8 +81,12 @@ for module in $(cat closure); do
for i in $(modinfo -b $kernel --set-version "$version" -F firmware $module | grep -v '^name:'); do for i in $(modinfo -b $kernel --set-version "$version" -F firmware $module | grep -v '^name:'); do
mkdir -p "$out/lib/firmware/$(dirname "$i")" mkdir -p "$out/lib/firmware/$(dirname "$i")"
echo "firmware for $module: $i" echo "firmware for $module: $i"
cp "$firmware/lib/firmware/$i" "$out/lib/firmware/$i" 2>/dev/null \ for name in "$i" "$i.xz" ""; do
|| echo "WARNING: missing firmware $i for module $module" [ -z "$name" ] && echo "WARNING: missing firmware $i for module $module"
if cp "$firmware/lib/firmware/$name" "$out/lib/firmware/$name" 2>/dev/null; then
break
fi
done
done done
done done

View File

@ -14,8 +14,8 @@ stdenv.mkDerivation rec {
sourceRoot = "."; sourceRoot = ".";
installPhase = '' installPhase = ''
mkdir $out mkdir -p $out/lib/firmware
b43-fwcutter -w $out *.wl_apsta.o b43-fwcutter -w $out/lib/firmware *.wl_apsta.o
''; '';
meta = with lib; { meta = with lib; {

View File

@ -883,6 +883,8 @@ let
# Disable the firmware helper fallback, udev doesn't implement it any more # Disable the firmware helper fallback, udev doesn't implement it any more
FW_LOADER_USER_HELPER_FALLBACK = option no; FW_LOADER_USER_HELPER_FALLBACK = option no;
FW_LOADER_COMPRESS = option yes;
HOTPLUG_PCI_ACPI = yes; # PCI hotplug using ACPI HOTPLUG_PCI_ACPI = yes; # PCI hotplug using ACPI
HOTPLUG_PCI_PCIE = yes; # PCI-Expresscard hotplug support HOTPLUG_PCI_PCIE = yes; # PCI-Expresscard hotplug support

View File

@ -808,6 +808,8 @@ with pkgs;
sanitizers = [ ]; sanitizers = [ ];
}; };
compressFirmwareXz = callPackage ../build-support/kernel/compress-firmware-xz.nix { };
makeModulesClosure = { kernel, firmware, rootModules, allowMissing ? false }: makeModulesClosure = { kernel, firmware, rootModules, allowMissing ? false }:
callPackage ../build-support/kernel/modules-closure.nix { callPackage ../build-support/kernel/modules-closure.nix {
inherit kernel firmware rootModules allowMissing; inherit kernel firmware rootModules allowMissing;