optionally pin all inputs

This commit is contained in:
Travis Staton 2024-06-16 12:09:08 -04:00
parent 1570501aba
commit d77a2ae4ed

View file

@ -3,14 +3,13 @@
let let
cfg = config.raspberry-pi-nix; cfg = config.raspberry-pi-nix;
kernel-pkgs = if cfg.pin-kernel.enable then pinned else pkgs;
in in
{ {
imports = [ ../sd-image ./config.nix ./i2c.nix ]; imports = [ ../sd-image ./config.nix ./i2c.nix ];
options = with lib; { options = with lib; {
raspberry-pi-nix = { raspberry-pi-nix = {
pin-kernel = { pin-inputs = {
enable = mkOption { enable = mkOption {
default = true; default = true;
type = types.bool; type = types.bool;
@ -98,7 +97,7 @@ in
TARGET_OVERLAYS_DIR="$TARGET_FIRMWARE_DIR/overlays" TARGET_OVERLAYS_DIR="$TARGET_FIRMWARE_DIR/overlays"
TMPFILE="$TARGET_FIRMWARE_DIR/tmp" TMPFILE="$TARGET_FIRMWARE_DIR/tmp"
UBOOT="${pkgs.uboot_rpi_arm64}/u-boot.bin" UBOOT="${pkgs.uboot_rpi_arm64}/u-boot.bin"
KERNEL="${kernel-pkgs.rpi-kernels.latest.kernel}/Image" KERNEL="${pkgs.rpi-kernels.latest.kernel}/Image"
SHOULD_UBOOT=${if cfg.uboot.enable then "1" else "0"} SHOULD_UBOOT=${if cfg.uboot.enable then "1" else "0"}
SRC_FIRMWARE_DIR="${pkgs.raspberrypifw}/share/raspberrypi/boot" SRC_FIRMWARE_DIR="${pkgs.raspberrypifw}/share/raspberrypi/boot"
STARTFILES=("$SRC_FIRMWARE_DIR"/start*.elf) STARTFILES=("$SRC_FIRMWARE_DIR"/start*.elf)
@ -126,7 +125,7 @@ in
cp "$KERNEL" "$TMPFILE" cp "$KERNEL" "$TMPFILE"
mv -T "$TMPFILE" "$TARGET_FIRMWARE_DIR/kernel.img" mv -T "$TMPFILE" "$TARGET_FIRMWARE_DIR/kernel.img"
echo "${ echo "${
builtins.toString kernel-pkgs.rpi-kernels.latest.kernel builtins.toString pkgs.rpi-kernels.latest.kernel
}" > "$STATE_DIRECTORY/kernel-version" }" > "$STATE_DIRECTORY/kernel-version"
rm "$STATE_DIRECTORY/kernel-migration-in-progress" rm "$STATE_DIRECTORY/kernel-migration-in-progress"
} }
@ -182,7 +181,7 @@ in
fi fi
if [[ "$SHOULD_UBOOT" -ne 1 ]] && [[ ! -f "$STATE_DIRECTORY/kernel-version" || $(< "$STATE_DIRECTORY/kernel-version") != ${ if [[ "$SHOULD_UBOOT" -ne 1 ]] && [[ ! -f "$STATE_DIRECTORY/kernel-version" || $(< "$STATE_DIRECTORY/kernel-version") != ${
builtins.toString kernel-pkgs.rpi-kernels.latest.kernel builtins.toString pkgs.rpi-kernels.latest.kernel
} ]]; then } ]]; then
migrate_kernel migrate_kernel
fi fi
@ -271,9 +270,27 @@ in
}; };
nixpkgs = { nixpkgs = {
overlays = [ core-overlay ] overlays =
++ (if config.raspberry-pi-nix.libcamera-overlay.enable let
then [ libcamera-overlay ] else [ ]); rpi-overlays = [ core-overlay ]
++ (if config.raspberry-pi-nix.libcamera-overlay.enable
then [ libcamera-overlay ] else [ ]);
rpi-overlay = lib.composeManyExtensions rpi-overlays;
pin-prev-overlay = overlay: pinned-prev: final: prev:
let
# apply the overlay to pinned-prev and fix that so no references to the actual final
# and prev appear in applied-overlay
applied-overlay =
lib.fix (final: pinned-prev // overlay final pinned-prev);
# We only want to set keys that appear in the overlay, so restrict applied-overlay to
# these keys
restricted-overlay = lib.getAttrs (builtins.attrNames (overlay { } { })) applied-overlay;
in
prev // restricted-overlay;
in
if cfg.pin-inputs.enable
then [ (pin-prev-overlay rpi-overlay pinned) ]
else [ rpi-overlay ];
}; };
boot = { boot = {
initrd.availableKernelModules = [ initrd.availableKernelModules = [
@ -286,7 +303,7 @@ in
# This pin is not necessary, it would be fine to replace it with # This pin is not necessary, it would be fine to replace it with
# `pkgs.rpi-kernels.latest.kernel`. It is helpful to ensure # `pkgs.rpi-kernels.latest.kernel`. It is helpful to ensure
# cache hits for kernel builds though. # cache hits for kernel builds though.
kernelPackages = kernel-pkgs.linuxPackagesFor kernel-pkgs.rpi-kernels.latest.kernel; kernelPackages = pkgs.linuxPackagesFor pkgs.rpi-kernels.latest.kernel;
loader = { loader = {
grub.enable = lib.mkDefault false; grub.enable = lib.mkDefault false;