nixos-lib/laptop.nix
Antoine Viallon bb6167236a
[Laptop] enable lazy preemption if we are on kernel 6.13+
It reduces power usage by making better use of system resources. It also
improves throughput.
2025-03-09 20:58:49 +01:00

91 lines
2.9 KiB
Nix

{ config, pkgs, lib, ... }:
with lib;
let
cfg = config.aviallon.laptop;
in {
options.aviallon.laptop = {
enable = mkOption {
default = false;
example = true;
type = types.bool;
description = "Enable aviallon's laptop configuration";
};
power-manager = mkOption {
default = "tlp";
example = "power-profiles-daemon";
description = "Change service used to manage power consumption on laptop";
type = types.enum [ "tlp" "power-profiles-daemon" false ];
};
tweaks = {
pcieAspmForce = mkEnableOption "hardcore tweaks to power consumption. Warning: Might be dangerous to use.";
};
};
config = mkIf cfg.enable {
networking.networkmanager.wifi.powersave = mkDefault true;
aviallon.general.unsafeOptimizations = mkOverride 15 true;
hardware.sensor.iio.enable = mkDefault true;
location.provider = "geoclue2";
aviallon.boot.cmdline = {
# Less power consumption vs some performance loss
"workqueue.power_efficient" = "1";
nohz = "on";
# To save power, batch RCU callbacks and flush after delay, memory pressure or callback list growing too big.
"rcutree.enable_rcu_lazy" = "1";
# Enable lazy preempt by default for kernels newer than 6.13
"preempt" = mkIf (config.boot.kernelPackages.kernelAtLeast "6.13") "lazy";
pcie_aspm = mkIf cfg.tweaks.pcieAspmForce "force";
};
boot.kernel.sysctl = {
"vm.laptop_mode" = "5";
# Disable hard-lockup detector
"kernel.nmi_watchdog" = "0";
};
systemd.services.nixos-upgrade = {
unitConfig = {
ConditionACPower = true;
};
};
systemd.services.aspm-force-enable = let
aspm_enable = pkgs.callPackage ./packages/aspm_enable { };
in {
serviceConfig = {
ExecStart = [
"${aspm_enable}/bin/aspm_enable"
];
Type = "simple";
};
wantedBy = [ "multi-user.target" ];
description = "Force-enable PCIe ASPM";
enable = cfg.tweaks.pcieAspmForce;
};
services.tlp.enable = (cfg.power-manager == "tlp");
services.power-profiles-daemon.enable = (cfg.power-manager == "power-profiles-daemon");
powerManagement.powertop.enable = mkDefault true;
systemd.services.powertop = mkIf config.powerManagement.powertop.enable {
serviceConfig.ExecStart = let
script = pkgs.writeShellScriptBin "powertop-auto-tune" ''
${pkgs.powertop}/bin/powertop --auto-tune
# Disable power-saving for HID devices (i.e., keyboard and mouse, as it is makes them frustrating to use)
HIDDEVICES=$(ls /sys/bus/usb/drivers/usbhid | grep -oE '^[0-9]+-[0-9\.]+' | sort -u)
for i in $HIDDEVICES; do
echo -n "Enabling " | cat - /sys/bus/usb/devices/$i/product
echo 'on' > /sys/bus/usb/devices/$i/power/control
done
'';
in mkOverride 10 "${script}/bin/powertop-auto-tune";
};
};
}