- 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
157 lines
4.5 KiB
Nix
157 lines
4.5 KiB
Nix
{ 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"
|
||
'';
|
||
}
|