nix-files/uninsane/hardware.nix

103 lines
4.0 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# this file originates from nixos-generate-config
# but has been heavily modified
{ config, lib, pkgs, modulesPath, ... }:
{
# enables non-free firmware
hardware.enableRedistributableFirmware = true;
# XXX colin: these four statements were autogenerated and placed here: why?
# boot.initrd.availableKernelModules = [ "xhci_pci" "usbhid" "usb_storage" ];
# boot.initrd.kernelModules = [ ];
# boot.kernelModules = [ ];
# boot.extraModulePackages = [ ];
# default nixos-21.11 kernel of 5.10 doesn't have the rpi-400 device tree blob.
# turns out 5.15, 5.16, 5.17 are all unable to boot the pi from usb (they fail to "direct load" certain broadcom firmware).
# linuxPackages_rpi4 uses 5.10, but supplies the pi-400 dtb & boots fine.
# boot.kernelPackages = pkgs.linuxPackages_latest;
# boot.kernelPackages = pkgs.linuxPackages_5_15;
# boot.kernelPackages = pkgs.linuxPackages_5_16;
boot.kernelPackages = pkgs.linuxPackages_rpi4;
# NixOS defaults to grub: we don't want that.
boot.loader.grub.enable = false;
# raspberryPi boot loader creates extlinux.conf.
# otherwise, enable the generic-extlinux-compatible loader below.
# note: THESE ARE MUTUALLY EXCLUSIVE. generic-extlinux-compatible causes uboot to not be built
# boot.loader.generic-extlinux-compatible.enable = true;
boot.loader.raspberryPiColin.enable = true;
boot.loader.raspberryPiColin.uboot.enable = true;
boot.loader.raspberryPiColin.version = 4;
boot.initrd.availableKernelModules = [
"bcm2711_thermal"
"bcm_phy_lib"
"brcmfmac"
"brcmutil"
"broadcom"
"clk_raspberrypi"
"drm" # Direct Render Manager
"enclosure" # SCSI ?
"fuse"
"mdio_bcm_unimac"
"pcie_brcmstb"
"raspberrypi_cpufreq"
"raspberrypi_hwmon"
"ses" # SCSI Enclosure Services
"uas" # USB attached storage
"uio" # userspace IO
"uio_pdrv_genirq"
"xhci_pci"
"xhci_pci_renesas"
];
# boot.initrd.compressor = "gzip"; # defaults to zstd
# hack in the `boot.shell_on_fail` arg since it doesn't seem to work otherwise
boot.initrd.preFailCommands = "allowShell=1";
# default: 4 (warn). 7 is debug
boot.consoleLogLevel = 7;
# boot.kernelParams = [
# "boot.shell_on_fail"
# # "boot.trace"
# # "systemd.log_level=debug"
# # "systemd.log_target=console"
# ];
# ondemand power scaling keeps the cpu at low frequency when idle, and sets to max frequency
# when load is detected. (v.s. the "performance" default, which always uses the max frequency)
powerManagement.cpuFreqGovernor = "ondemand";
# XXX colin: this allows one to `systemctl halt` and then not remove power until the HDD has spun down.
# however, it doesn't work with reboot because systemd will spin the drive up again to read its reboot bin.
# a better solution would be to put the drive behind a powered USB hub (or get a SSD).
systemd.services.diskguard = {
description = "Safely power off spinning media";
before = [ "shutdown.target" ];
wantedBy = [ "sysinit.target" ];
# old (creates dep loop, but works)
# before = [ "systemd-remount-fs.service" "shutdown.target" ];
# wantedBy = [ "systemd-remount-fs.service" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
ExecStart = "${pkgs.coreutils}/bin/true";
ExecStop = with pkgs; writeScript "diskguard" ''
#!${bash}/bin/bash
if ${procps}/bin/pgrep nixos-rebuild ;
then
exit 0 # don't halt drives unless we're actually shutting down. maybe better way to do this (check script args?)
fi
# ${coreutils}/bin/sync
# ${util-linux}/bin/mount -o remount,ro /nix/store
# ${util-linux}/bin/mount -o remount,ro /
# -S 1 retracts the spindle after 5 seconds of idle
# -B 1 spins down the drive after <vendor specific duration>
${hdparm}/sbin/hdparm -S 1 -B 1 /dev/sda
# TODO: monitor smartmonctl until disk is idle? or try hdparm -Y
# ${coreutils}/bin/sleep 20
# exec ${util-linux}/bin/umount --all -t ext4,vfat,ext2
'';
};
};
}