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 e731814bd5d4..23b9e232c64d 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 8dd4371f86da..a79484845fb5 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 { };