diff --git a/configuration.nix b/configuration.nix index b133e63..2a3fac5 100644 --- a/configuration.nix +++ b/configuration.nix @@ -12,9 +12,12 @@ with pkgs; "workqueue.power_efficient=y" "nohibernate" "ipv6.disable=1" + "ahci.mobile_lpm_policy=3" + "pcie_aspm=force" + "nmi_watchdog=0" ]; kernelModules = [ "i915" ]; - blacklistedKernelModules = [ "btusb" ]; + blacklistedKernelModules = [ "btusb" "bluetooth" ]; supportedFilesystems = [ "zfs" ]; zfs = { requestEncryptionCredentials = true; diff --git a/modules/power.nix b/modules/power.nix index b6cdce1..5361b52 100644 --- a/modules/power.nix +++ b/modules/power.nix @@ -12,9 +12,11 @@ }; }; - # Suspend when the battery is critical + # Suspend when the battery is critical and autosuspend USB and PCI services.udev.extraRules = '' SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{model_name}=="01AV405", ATTR{capacity}=="[0-5]", RUN+="${config.systemd.package}/bin/systemctl suspend -i" + ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto" + ACTION=="add", SUBSYSTEM=="pci", TEST=="power/control", ATTR{power/control}="auto" ''; # Undervolt CPU and GPU @@ -26,4 +28,37 @@ # Prevent overheating of the CPU services.thermald.enable = true; + + # Provide power management support to programs + services.upower.enable = true; + + # HACK Enable internal microphone when headphones are plugged in and add workaround for frequent WiFi disconnects + hardware.firmware = [ + (pkgs.writeTextDir "/lib/firmware/hda-jack-retask.fw" '' + [codec] + 0x10ec0293 0x17aa2233 0 + + [pincfg] + 0x12 0x90a60130 + 0x13 0x40000000 + 0x14 0x90170110 + 0x15 0x03211040 + 0x16 0x21211010 + 0x18 0x411111f0 + 0x19 0x21a11010 + 0x1a 0x40f000f0 + 0x1b 0x411111f0 + 0x1d 0x40738105 + 0x1e 0x411111f0 + '') + ]; + + # Power saving features for multiple devices + boot.extraModprobeConfig = '' + options snd-hda-intel patch=hda-jack-retask.fw power_save=1 + options mac80211 beacon_loss_count=500 + options iwlwifi power_save=1 uapsd_disable=0 + options iwlmvm power_scheme=3 + ''; + }