Battery Life: Improve suspend battery life with nvme.noacpi=1 - junaruga/framework-laptop-config GitHub Wiki

My environment

  • Fedora 36

  • CPU: 11th Gen Intel i7-1165G7 (8) @ 4.700GHz

  • GPU: Intel TigerLake-LP GT2 [Iris Xe Graphics]

  • Kernel version

    $ uname -r
    5.17.11-300.fc36.x86_64
    

On the Framework's Fedora 36 guideline, the following step is added.

There is also one optional workaround needed to get the best suspend battery life, which is setting "nvme.noacpi=1" in your kernel parameters. In Fedora, you can do this by running the following command: sudo grubby --update-kernel=ALL --args="nvme.noacpi=1"

According to the Hack News [1], the setting improves the suspend power usage like this.

Following our setup guides for Ubuntu 22.04 and Fedora 36 (https://guides.frame.work/c/Framework_Laptop#Section_How-to) we see around 0.8%/hour on 11th Gen and around 0.4%/hour on 12th Gen Framework Laptops in s0ix.

Change the setting

The current setting is below.

$ sudo grubby --info=ALL
index=0
kernel="/boot/vmlinuz-5.17.11-300.fc36.x86_64"
args="ro rootflags=subvol=root rd.luks.uuid=luks-09538e5a-f802-40a6-bc22-328604dc2312 rhgb quiet mem_sleep_default=deep vconsole.font=LatGrkCyr-12x22"
root="UUID=be430ab5-ebda-4f4f-a01e-427d18fb12f1"
initrd="/boot/initramfs-5.17.11-300.fc36.x86_64.img"
title="Fedora Linux (5.17.11-300.fc36.x86_64) 36 (Workstation Edition)"
id="80e9c3d2b9dc4e93a3ab129c79655481-5.17.11-300.fc36.x86_64"
index=1
kernel="/boot/vmlinuz-5.17.11-200.fc35.x86_64"
args="ro rootflags=subvol=root rd.luks.uuid=luks-09538e5a-f802-40a6-bc22-328604dc2312 rhgb quiet mem_sleep_default=deep vconsole.font=LatGrkCyr-12x22"
root="UUID=be430ab5-ebda-4f4f-a01e-427d18fb12f1"
initrd="/boot/initramfs-5.17.11-200.fc35.x86_64.img"
title="Fedora Linux (5.17.11-200.fc35.x86_64) 35 (Workstation Edition)"
id="80e9c3d2b9dc4e93a3ab129c79655481-5.17.11-200.fc35.x86_64"
index=2
kernel="/boot/vmlinuz-5.16.16-200.fc35.x86_64"
args="ro rootflags=subvol=root rd.luks.uuid=luks-09538e5a-f802-40a6-bc22-328604dc2312 rhgb quiet mem_sleep_default=deep vconsole.font=LatGrkCyr-12x22"
root="UUID=be430ab5-ebda-4f4f-a01e-427d18fb12f1"
initrd="/boot/initramfs-5.16.16-200.fc35.x86_64.img"
title="Fedora Linux (5.16.16-200.fc35.x86_64) 35 (Workstation Edition)"
id="80e9c3d2b9dc4e93a3ab129c79655481-5.16.16-200.fc35.x86_64"
index=3
kernel="/boot/vmlinuz-0-rescue-80e9c3d2b9dc4e93a3ab129c79655481"
args="ro rootflags=subvol=root rd.luks.uuid=luks-09538e5a-f802-40a6-bc22-328604dc2312 rhgb quiet mem_sleep_default=deep vconsole.font=LatGrkCyr-12x22"
root="UUID=be430ab5-ebda-4f4f-a01e-427d18fb12f1"
initrd="/boot/initramfs-0-rescue-80e9c3d2b9dc4e93a3ab129c79655481.img"
title="Fedora Linux (0-rescue-80e9c3d2b9dc4e93a3ab129c79655481) 35 (Workstation Edition)"
id="80e9c3d2b9dc4e93a3ab129c79655481-0-rescue"
$ sudo grubby --update-kernel=ALL --args="nvme.noacpi=1"

You see the kernel parameter nvme.noacpi=1 is added.

$ sudo grubby --info=ALL
index=0
kernel="/boot/vmlinuz-5.17.11-300.fc36.x86_64"
args="ro rootflags=subvol=root rd.luks.uuid=luks-09538e5a-f802-40a6-bc22-328604dc2312 rhgb quiet mem_sleep_default=deep vconsole.font=LatGrkCyr-12x22 nvme.noacpi=1"
root="UUID=be430ab5-ebda-4f4f-a01e-427d18fb12f1"
initrd="/boot/initramfs-5.17.11-300.fc36.x86_64.img"
title="Fedora Linux (5.17.11-300.fc36.x86_64) 36 (Workstation Edition)"
id="80e9c3d2b9dc4e93a3ab129c79655481-5.17.11-300.fc36.x86_64"
index=1
kernel="/boot/vmlinuz-5.17.11-200.fc35.x86_64"
args="ro rootflags=subvol=root rd.luks.uuid=luks-09538e5a-f802-40a6-bc22-328604dc2312 rhgb quiet mem_sleep_default=deep vconsole.font=LatGrkCyr-12x22 nvme.noacpi=1"
root="UUID=be430ab5-ebda-4f4f-a01e-427d18fb12f1"
initrd="/boot/initramfs-5.17.11-200.fc35.x86_64.img"
title="Fedora Linux (5.17.11-200.fc35.x86_64) 35 (Workstation Edition)"
id="80e9c3d2b9dc4e93a3ab129c79655481-5.17.11-200.fc35.x86_64"
index=2
kernel="/boot/vmlinuz-5.16.16-200.fc35.x86_64"
args="ro rootflags=subvol=root rd.luks.uuid=luks-09538e5a-f802-40a6-bc22-328604dc2312 rhgb quiet mem_sleep_default=deep vconsole.font=LatGrkCyr-12x22 nvme.noacpi=1"
root="UUID=be430ab5-ebda-4f4f-a01e-427d18fb12f1"
initrd="/boot/initramfs-5.16.16-200.fc35.x86_64.img"
title="Fedora Linux (5.16.16-200.fc35.x86_64) 35 (Workstation Edition)"
id="80e9c3d2b9dc4e93a3ab129c79655481-5.16.16-200.fc35.x86_64"
index=3
kernel="/boot/vmlinuz-0-rescue-80e9c3d2b9dc4e93a3ab129c79655481"
args="ro rootflags=subvol=root rd.luks.uuid=luks-09538e5a-f802-40a6-bc22-328604dc2312 rhgb quiet mem_sleep_default=deep vconsole.font=LatGrkCyr-12x22 nvme.noacpi=1"
root="UUID=be430ab5-ebda-4f4f-a01e-427d18fb12f1"
initrd="/boot/initramfs-0-rescue-80e9c3d2b9dc4e93a3ab129c79655481.img"
title="Fedora Linux (0-rescue-80e9c3d2b9dc4e93a3ab129c79655481) 35 (Workstation Edition)"
id="80e9c3d2b9dc4e93a3ab129c79655481-0-rescue"

Reboot OS.

$ sudo reboot

Note

According to this thread's 1st comment, this setting is useful for s2idle not deep. As I am using sleep mode: deep, maybe this setting doesn't affect.

Set nvme.noacpi=1 in your grub kernel parameters, which results in s2idle suspend battery life that is similar to “deep” on recent kernels without taking the resume time tradeoff. See here 94 for instructions on changing kernel parameters.

References