nixos/shared/modules/system/power_manager.nix

79 lines
2.2 KiB
Nix

{ config, lib, pkgs, inputs ? null, ... }:
with lib;
let
cfg = config.power_manager;
in
{
options.power_manager = {
enable = mkEnableOption "power management with auto-cpufreq";
useFlake = mkOption {
type = types.bool;
default = true;
description = ''
Whether to use the auto-cpufreq flake input for the latest version.
If false, uses the nixpkgs version (may be outdated).
'';
};
settings = mkOption {
type = types.attrs;
default = {
battery = {
governor = "powersave";
turbo = "never";
};
charger = {
governor = "performance";
turbo = "auto";
};
};
description = "Auto-cpufreq configuration settings";
};
enableThermald = mkOption {
type = types.bool;
default = true;
description = "Enable thermald for Intel CPU thermal management";
};
enableUpower = mkOption {
type = types.bool;
default = true;
description = "Enable UPower for battery monitoring";
};
};
config = mkIf cfg.enable {
# Auto-cpufreq configuration - use flake version if available, otherwise nixpkgs
programs.auto-cpufreq = mkIf (cfg.useFlake && inputs ? auto-cpufreq) {
enable = true;
settings = cfg.settings;
};
services.auto-cpufreq = mkIf (!cfg.useFlake || !(inputs ? auto-cpufreq)) {
enable = true;
settings = cfg.settings;
};
# Supporting services
services.upower.enable = mkIf cfg.enableUpower true;
services.thermald.enable = mkIf cfg.enableThermald true;
powerManagement.enable = mkIf cfg.enable true;
# Disable conflicting power management services
services.tlp.enable = mkForce false;
services.power-profiles-daemon.enable = mkForce false;
powerManagement.powertop.enable = mkForce false;
# Don't set a static CPU governor (let auto-cpufreq handle it)
powerManagement.cpuFreqGovernor = mkForce null;
};
# # Warning if flake input is missing when expected
# warnings = optional (cfg.useFlake && !(inputs ? auto-cpufreq))
# "power_manager: useFlake is enabled but auto-cpufreq flake input not found. Using nixpkgs version instead.";
}