nix-files/machines/uninsane/hardware.nix

103 lines
4.0 KiB
Nix
Raw Normal View History

2022-05-17 05:47:43 +00:00
# this file originates from nixos-generate-config
# but has been heavily modified
{ config, lib, pkgs, modulesPath, ... }:
{
# enables non-free firmware
hardware.enableRedistributableFirmware = true;
2022-05-17 05:47:43 +00:00
# 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;
2022-05-17 05:47:43 +00:00
# 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;
2022-05-17 05:47:43 +00:00
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
2022-05-17 05:47:43 +00:00
# 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;
2022-05-17 05:47:43 +00:00
# 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
'';
};
};
}