Add T490 hardware configuration and docs

- modules/t490.nix: TLP power management, CPU throttling (throttled), S3 sleep,
  remote Nix builders (cluster), fwupd, fprintd, fprintd, Syncthing, Tailscale,
  Intel VA-API, TrackPoint sensitivity, PipeWire defaults
- flake.nix: add nixos-hardware input, import T490 module + nixos-hardware
- docs/T490-HARDWARE.md: WiFi variants, graphics, audio, fingerprint, sleep guide
- docs/T490-BATTERY.md: TLP config, threshold strategy, real-world battery numbers
- docs/T490-OFFLOADING.md: local vs cluster split, remote builder setup
- MIGRATION.md: add T490 post-install steps (fwupd, fprint, remote build key)
- README.md: reflect new module and docs structure
This commit is contained in:
Scott Scoble 2026-05-14 17:40:04 -07:00
parent 6df0a20265
commit 5051dfdc8c
7 changed files with 364 additions and 3 deletions

157
modules/t490.nix Normal file
View file

@ -0,0 +1,157 @@
{ config, pkgs, lib, ... }:
{
# === T490-specific hardware configuration ===
# Requires nixos-hardware flake input: nixos-hardware.nixosModules.lenovo-thinkpad-t490
# The nixos-hardware module provides:
# - services.throttled (CPU throttling fix)
# - PulseAudio profile set (5 simultaneous sinks)
# - common/cpu/intel (VA-API drivers, microcode)
# === Kernel parameters ===
boot.kernelParams = [
"mem_sleep_default=deep" # prefer S3 deep sleep over s2idle
"pcie_aspm=force" # PCIe Active State Power Management
"i915.enable_fbc=1" # frame buffer compression (power saving)
"i915.enable_psr=1" # panel self-refresh (power saving)
"i915.enable_rc6=7" # maximum GPU render power saving
];
boot.kernelModules = [ "thinkpad_acpi" ];
boot.blacklistedKernelModules = [
"iTCO_wdt"
"iTCO_vendor_support"
];
# === Display DPI ===
services.xserver.dpi = 157; # 14" 1920×1080 IPS = 157 DPI
# === Firmware updates ===
services.fwupd.enable = true;
# === Fingerprint reader (Synaptics 06cb:00bd) ===
# Requires firmware update via fwupd first
services.fprintd.enable = true;
# === TLP — ThinkPad power management ===
# nixos-hardware thinkpad module provides base config; tune here
services.tlp = {
enable = true;
settings = {
CPU_SCALING_GOVERNOR_ON_AC = "performance";
CPU_SCALING_GOVERNOR_ON_BAT = "powersave";
CPU_ENERGY_PERF_POLICY_ON_AC = "balance_performance";
CPU_ENERGY_PERF_POLICY_ON_BAT = "power";
CPU_MAX_PERF_ON_AC = 100;
CPU_MAX_PERF_ON_BAT = 40; # cap at ~1.7 GHz on battery
CPU_BOOST_ON_AC = 1;
CPU_BOOST_ON_BAT = 0; # disable turbo on battery
START_CHARGE_THRESH_BAT0 = 40; # battery health: start charging below 40%
STOP_CHARGE_THRESH_BAT0 = 80; # battery health: stop at 80%
WIFI_PWR_ON_AC = "off";
WIFI_PWR_ON_BAT = "on";
RUNTIME_PM_ON_AC = "on";
RUNTIME_PM_ON_BAT = "auto";
USB_AUTOSUSPEND = 1;
INTEL_GPU_MIN_FREQ_ON_AC = 300;
INTEL_GPU_MAX_FREQ_ON_AC = 1100;
INTEL_GPU_MIN_FREQ_ON_BAT = 300;
INTEL_GPU_MAX_FREQ_ON_BAT = 600;
};
};
# === powertop ===
powerManagement.powertop.enable = true;
# Skip thermald — conflicts with throttled (enabled by nixos-hardware)
services.thermald.enable = false;
# === zram swap (faster + saves NVMe writes) ===
zramSwap = {
enable = true;
memoryPercent = 50;
};
# === Intel GPU — hardware video acceleration ===
hardware.graphics = {
enable = true;
extraPackages = with pkgs; [
intel-media-driver # modern VA-API (iHD)
intel-vaapi-driver # legacy VA-API (i965)
libvdpau-va-gl # VDPAU → VA-API bridge
];
};
environment.sessionVariables = {
LIBVA_DRIVER_NAME = "iHD";
MOZ_ENABLE_WAYLAND = "1";
};
# === Suspend/resume: reload WiFi after wake ===
powerManagement.powerUpCommands = ''
${pkgs.kmod}/bin/modprobe -r iwlmvm iwlwifi || true
${pkgs.kmod}/bin/modprobe iwlwifi || true
'';
# === Remote Nix builders (k3s cluster) ===
nix.distributedBuilds = true;
nix.buildMachines = [
{
hostName = "n97-mini";
system = "x86_64-linux";
maxJobs = 4;
supportedFeatures = [
"nixos-test"
"benchmark"
"big-parallel"
"kvm"
];
sshUser = "root";
sshKey = "/root/.ssh/remote-build";
}
{
hostName = "n97";
system = "x86_64-linux";
maxJobs = 4;
supportedFeatures = [
"nixos-test"
"benchmark"
"big-parallel"
"kvm"
];
sshUser = "root";
sshKey = "/root/.ssh/remote-build";
}
];
# === Syncthing (Obsidian vault sync) ===
services.syncthing = {
enable = true;
user = "sscoble";
dataDir = "/home/sscoble/.syncthing";
configDir = "/home/sscoble/.syncthing/config";
};
# === Tailscale (consistent cluster access from any network) ===
services.tailscale.enable = true;
# === NVMe tools ===
environment.systemPackages = with pkgs; [ nvme-cli ];
# === Touchpad & TrackPoint ===
services.xserver.libinput = {
enable = true;
touchpad = {
tapping = true;
naturalScrolling = true;
accelSpeed = "0.3";
disableWhileTyping = true;
};
};
# TrackPoint sensitivity
services.udev.extraRules = ''
ACTION=="add", SUBSYSTEM=="input", ATTR{name}=="*TrackPoint*", \
ATTR{device/sensitivity}="200", ATTR{device/speed}="150"
'';
}