From ea116654aaef4b3a7aaa3c2736f7ec5cf438a8a9 Mon Sep 17 00:00:00 2001 From: Jared Baur Date: Thu, 2 Jan 2025 11:30:45 -0800 Subject: [PATCH] nixos/initrd: add extraFirmwarePaths option (cherry picked from commit 488d4316b9e1510c9b4a2eeb8d7e2cc66839a1fc) --- nixos/modules/system/boot/stage-1.nix | 9 +++++++++ nixos/modules/system/boot/systemd/initrd.nix | 1 + pkgs/build-support/kernel/modules-closure.nix | 2 ++ pkgs/build-support/kernel/modules-closure.sh | 9 +++++++++ pkgs/top-level/all-packages.nix | 4 ++-- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/nixos/modules/system/boot/stage-1.nix b/nixos/modules/system/boot/stage-1.nix index ff7cf4777ddf..1aab9548a595 100644 --- a/nixos/modules/system/boot/stage-1.nix +++ b/nixos/modules/system/boot/stage-1.nix @@ -19,6 +19,7 @@ let kernel = config.system.modulesTree; firmware = config.hardware.firmware; allowMissing = false; + inherit (config.boot.initrd) extraFirmwarePaths; }; @@ -484,6 +485,14 @@ in ''; }; + boot.initrd.extraFirmwarePaths = mkOption { + default = [ ]; + type = types.listOf types.str; + description = '' + Other firmware files (relative to `"''${config.hardware.firmware}/lib/firmware"`) to include in the final initrd we are building. + ''; + }; + boot.initrd.checkJournalingFS = mkOption { default = true; type = types.bool; diff --git a/nixos/modules/system/boot/systemd/initrd.nix b/nixos/modules/system/boot/systemd/initrd.nix index 472c72fb3889..e56fb3702911 100644 --- a/nixos/modules/system/boot/systemd/initrd.nix +++ b/nixos/modules/system/boot/systemd/initrd.nix @@ -105,6 +105,7 @@ let kernel = config.system.modulesTree; firmware = config.hardware.firmware; allowMissing = false; + inherit (config.boot.initrd) extraFirmwarePaths; }; initrdBinEnv = pkgs.buildEnv { diff --git a/pkgs/build-support/kernel/modules-closure.nix b/pkgs/build-support/kernel/modules-closure.nix index a830c97eea9a..611c01abe018 100644 --- a/pkgs/build-support/kernel/modules-closure.nix +++ b/pkgs/build-support/kernel/modules-closure.nix @@ -11,6 +11,7 @@ rootModules, kmod, allowMissing ? false, + extraFirmwarePaths ? [ ], }: stdenvNoCC.mkDerivation { @@ -25,6 +26,7 @@ stdenvNoCC.mkDerivation { firmware rootModules allowMissing + extraFirmwarePaths ; allowedReferences = [ "out" ]; } diff --git a/pkgs/build-support/kernel/modules-closure.sh b/pkgs/build-support/kernel/modules-closure.sh index b53c64e30525..45423d21a570 100644 --- a/pkgs/build-support/kernel/modules-closure.sh +++ b/pkgs/build-support/kernel/modules-closure.sh @@ -87,6 +87,15 @@ for module in $(< ~-/closure); do done || : done +for path in $extraFirmwarePaths; do + mkdir -p $(dirname $out/lib/firmware/$path) + for name in "$path" "$path.xz" "$path.zst" ""; do + if cp -v --parents --no-preserve=mode lib/firmware/$name "$out" 2>/dev/null; then + break + fi + done +done + if test -e lib/firmware/edid ; then echo "lib/firmware/edid found, copying." mkdir -p "$out/lib/firmware" diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index db392a2b84ea..569f3c2af566 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -709,9 +709,9 @@ with pkgs; compressFirmwareZstd = callPackage ../build-support/kernel/compress-firmware.nix { type = "zstd"; }; - makeModulesClosure = { kernel, firmware, rootModules, allowMissing ? false }: + makeModulesClosure = { kernel, firmware, rootModules, allowMissing ? false, extraFirmwarePaths ? [ ] }: callPackage ../build-support/kernel/modules-closure.nix { - inherit kernel firmware rootModules allowMissing; + inherit kernel firmware rootModules allowMissing extraFirmwarePaths; }; mkBinaryCache = callPackage ../build-support/binary-cache { };