Skip to content

Commit ba73c8f

Browse files
committed
suspend: switch from deep -> s2idle for s76
- suspend method deep (suspend-to-RAM) is broken on darp11 (arrow-lake) switch to s2idle suspend method to provide some battery saving instead of disabling suspension entirely - re-enable suspenion on all darp11 targets - add suspend.mode option to power cfg Signed-off-by: Kajus Naujokaitis <kajus.naujokaitis@unikie.com>
1 parent 9ef379b commit ba73c8f

File tree

7 files changed

+60
-40
lines changed

7 files changed

+60
-40
lines changed

modules/common/services/power.nix

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,15 @@ let
245245
'';
246246
};
247247

248+
genericSleepConf = ''
249+
AllowHibernation=no
250+
AllowHybridSleep=no
251+
AllowSuspendThenHibernate=no
252+
''
253+
+ optionalString (!cfg.suspend.enable) ''
254+
AllowSuspend=no
255+
'';
256+
248257
in
249258
{
250259
options.ghaf.services.power-manager = {
@@ -280,15 +289,35 @@ in
280289
'';
281290
};
282291

283-
allowSuspend = mkOption {
284-
type = types.bool;
285-
default = true;
286-
description = ''
287-
Whether to enable system suspension.
292+
suspend = {
293+
enable = mkOption {
294+
type = types.bool;
295+
default = true;
296+
description = ''
297+
Whether to enable system suspension.
288298
289-
If disabled, the system will not respond to suspend requests, and all VMs with a power management profile enabled are
290-
prohibited to perform any suspend action.
291-
'';
299+
If disabled, the system will not respond to suspend requests, and all VMs with a
300+
power management profile enabled are prohibited to perform any suspend action.
301+
'';
302+
};
303+
304+
mode = mkOption {
305+
type = types.nullOr (
306+
types.enum [
307+
"s2idle"
308+
"shallow"
309+
"deep"
310+
]
311+
);
312+
default = null;
313+
description = ''
314+
The memory suspend mode to use.
315+
316+
To check which modes are supported, run `cat /sys/power/mem_sleep`.
317+
318+
More info: https://docs.kernel.org/admin-guide/pm/sleep-states.html
319+
'';
320+
};
292321
};
293322

294323
vm = {
@@ -412,15 +441,7 @@ in
412441
}
413442
];
414443

415-
# Prohibited sleep actions for VMs
416-
systemd.sleep.extraConfig = ''
417-
AllowHibernation=no
418-
AllowHybridSleep=no
419-
AllowSuspendThenHibernate=no
420-
''
421-
+ optionalString (!cfg.allowSuspend) ''
422-
AllowSuspend=no
423-
'';
444+
systemd.sleep.extraConfig = genericSleepConf;
424445

425446
powerManagement = optionalAttrs cfg.vm.enable {
426447
powerDownCommands = optionalString cfg.vm.pciSuspend (
@@ -467,6 +488,9 @@ in
467488
powerDownCommands = lib.mkBefore ''
468489
${getExe ghaf-powercontrol} turn-off-displays '*'
469490
'';
491+
powerUpCommands = lib.mkBefore ''
492+
${getExe ghaf-powercontrol} turn-on-displays '*'
493+
'';
470494
};
471495

472496
# Override systemd actions for suspend, poweroff, and reboot
@@ -497,7 +521,7 @@ in
497521
# Logind configuration for desktop
498522
services.logind.settings.Login =
499523
let
500-
lidEvent = if cfg.allowSuspend then "suspend" else "lock";
524+
lidEvent = if cfg.suspend.enable then "suspend" else "lock";
501525
in
502526
mkDefault {
503527
HandleLidSwitch = lidEvent;
@@ -519,16 +543,15 @@ in
519543
(mkIf cfg.host.enable {
520544
services.logind.settings.Login.HandleLidSwitch = mkDefault "ignore";
521545

522-
systemd.sleep.extraConfig = ''
523-
AllowHibernation=no
524-
AllowHybridSleep=no
525-
AllowSuspendThenHibernate=no
526-
''
527-
+ optionalString (!cfg.allowSuspend) ''
528-
AllowSuspend=no
529-
'';
546+
systemd.sleep.extraConfig = genericSleepConf;
547+
548+
# We can accomplish the same via systemd.sleep.extraConfig MemorySleepMode
549+
# but it seems keyboard wakeup stops functioning with that approach
550+
boot.kernelParams = optionals (cfg.suspend.mode != null) [
551+
"mem_sleep_default=${cfg.suspend.mode}"
552+
];
530553

531-
systemd.targets = optionalAttrs cfg.allowSuspend {
554+
systemd.targets = optionalAttrs cfg.suspend.enable {
532555
"pre-sleep-actions" = {
533556
description = "Target for pre-sleep host actions";
534557
unitConfig.StopWhenUnneeded = true;
@@ -552,7 +575,7 @@ in
552575

553576
systemd.services = mkMerge [
554577
# suspend/resume action units
555-
(optionalAttrs cfg.allowSuspend (
578+
(optionalAttrs cfg.suspend.enable (
556579
lib.listToAttrs (
557580
flatten (
558581
map

modules/desktop/graphics/cosmic/default.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ in
7676
If disabled, the default timeouts will be set to 'Never'.
7777
However, users can still manually configure the settings via COSMIC Settings to override this behavior.
7878
79-
If 'config.ghaf.services.power-manager.allowSuspend' is false, suspension will not occur
79+
If 'config.ghaf.services.power-manager.suspend.enable' is false, suspension will not occur
8080
regardless of this setting.
8181
'';
8282
};

modules/profiles/graphics.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ in
3232
3333
Disabling this option is the same as setting all idle timeouts to '0'.
3434
35-
If 'config.ghaf.services.power-manager.allowSuspend' is false, suspension will not occur
35+
If 'config.ghaf.services.power-manager.suspend.enable' is false, suspension will not occur
3636
regardless of this setting.
3737
'';
3838
};

modules/profiles/orin.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ in
3838
};
3939

4040
# Disable suspend by default, not working as intended
41-
services.power-manager.allowSuspend = false;
41+
services.power-manager.suspend.enable = false;
4242

4343
graphics.cosmic = {
4444
# Crucial for Orin devices to use the correct render device

packages/ghaf-powercontrol/package.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ writeShellApplication {
121121
;;
122122
suspend)
123123
${
124-
if ghafConfig.services.power-manager.allowSuspend then
124+
if ghafConfig.services.power-manager.suspend.enable then
125125
''
126126
systemctl suspend
127127
''

packages/pkgs-by-name/ghaf-build-helper/package.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ writeShellApplication {
8989
done
9090
9191
export NIX_SSHOPTS="-o ProxyJump=root@$proxy_jump"
92-
nixos-rebuild --flake "$build_target" --target-host root@ghaf-host --fast "''${args[@]}"
92+
nixos-rebuild --flake "$build_target" --target-host root@ghaf-host --no-reexec "''${args[@]}"
9393
'';
9494
meta = {
9595
description = "Helper script to use nixos-rebuild without persistent changes of the ssh configuration.";

targets/laptop/flake-module.nix

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ let
213213
ghaf = {
214214
reference.profiles.mvp-user-trial.enable = true;
215215
partitioning.disko.enable = true;
216-
services.power-manager.allowSuspend = false; # Suspension is broken (SSRCSP-7016)
216+
services.power-manager.suspend.mode = "s2idle";
217217

218218
# Enable PCI ACS override to split IOMMU groups
219219
# Needed to separate Ethernet (8086:550a) from Audio devices
@@ -245,8 +245,7 @@ let
245245
ghaf = {
246246
reference.profiles.mvp-user-trial.enable = true;
247247
partitioning.disko.enable = true;
248-
profiles.graphics.idleManagement.enable = true;
249-
services.power-manager.allowSuspend = false; # Suspension is broken (SSRCSP-7016)
248+
services.power-manager.suspend.mode = "s2idle";
250249

251250
# Enable storeOnDisk for all VMs
252251
virtualization.microvm.storeOnDisk = true;
@@ -420,8 +419,7 @@ let
420419
ghaf = {
421420
reference.profiles.mvp-user-trial.enable = true;
422421
partitioning.disko.enable = true;
423-
profiles.graphics.idleManagement.enable = true;
424-
services.power-manager.allowSuspend = false; # Suspension is broken (SSRCSP-7016)
422+
services.power-manager.suspend.mode = "s2idle";
425423

426424
# Enable PCI ACS override to split IOMMU groups
427425
# Needed to separate Ethernet (8086:550a) from Audio devices
@@ -453,8 +451,7 @@ let
453451
ghaf = {
454452
reference.profiles.mvp-user-trial.enable = true;
455453
partitioning.disko.enable = true;
456-
profiles.graphics.idleManagement.enable = true;
457-
services.power-manager.allowSuspend = false; # Suspension is broken (SSRCSP-7016)
454+
services.power-manager.suspend.mode = "s2idle";
458455

459456
# Enable storeOnDisk for all VMs
460457
virtualization.microvm.storeOnDisk = true;

0 commit comments

Comments
 (0)