{ 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."; }