You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.7 KiB

Asus Zephyrus G14 GPU powersaving

In order to get the best battery life, the dedicated GPU must be disabled.

Simply unloading the driver or enabling powersaving feaures isn't enough.

In the future, the nvidia driver may allow for entering D3 (full power off) on it's own, but for now, there's another solution: acpi calls. This requires the acpi_call kernel module, on Arch this can be installed with the acpi_call or acpi_call-dkms package.

Thanks to /u/FailSpai on reddit for finding the correct ACPI call. The GPU can be powered off and on with the call "\_SB.PCI0.GPP0.PG00". For example, to turn off the GPU completely, run sudo sh -c 'echo "\\_SB.PCI0.GPP0.PG00._OFF" > /proc/acpi/call'. Similarly, to turn it back on, sudo sh -c 'echo "\\_SB.PCI0.GPP0.PG00._ON" > /proc/acpi/call'. You can verify the state of the GPU by running sudo sh -c 'echo "\\_SB.PCI0.GPP0.PEGP.SGST" > /proc/acpi/call', then running sudo cat /proc/acpi/call. 0x0 means off, and anything above 0 means on. Alternatively, just look at the power draw, cat /sys/class/power_supply/BAT0/power_now and if it's under 10-11w then it's off.

This allows for the same, or better, idle power draw than Windows, as long as you have done other tweaks (disable boost, change CPU governor, etc).

If the GPU is powered off during suspend, the system will hang. This can be solved by using a systemd hook to turn the GPU back on before suspend, then turning it back off after. For example, place this script in an executable file in /usr/lib/systemd/system-sleep/:

#!/bin/bash

if [ "${1}" == "pre" ]; then
    sudo sh -c 'echo "\\_SB.PCI0.GPP0.PG00._ON" > /proc/acpi/call'
    sleep 2 # The GPU needs a bit of time to ensure that it's on before suspend
elif [ "${1}" == "post" ]; then
    if xrandr --listproviders | grep NVIDIA; then
        echo "GPU is in use for PRIME, keeping on"
    else
        sudo sh -c 'echo "\\_SB.PCI0.GPP0.PG00._OFF" > /proc/acpi/call'
        echo "GPU powered off"
    fi  
fi

As the script suggests, you can't power off the GPU while it's in use. I would recommend using optimus-manager-amd (available on the AUR as optimus-manager-amd-git) to automatically handle switching Xorg sessions and automatically depowering the GPU when it's not used. You can see my config files for optimus-manager-amd here. When in amd mode, I only draw 5.5-6w on idle, and it bounces around up to 10w when using firefox with the second half of the cores disabled.

Again, thanks to /u/FailSpai for digging through the ACPI tables to find the right call, you can find his comment about it here.