I have Ubuntu 23.10 with hibernation enabled on my Framework 13 but I noticed that it wakes up after a few minutes every time I put it into hibernation. That sort of defeats the purpose of hibernation so I had to investigate a bit.
My first step was checking what is enabled. Fortunately, we can find that information rather easily.
cat /proc/acpi/wakeup | grep enabled
After playing with a few things, I noticed that disabling XHCI actually does the trick most of the time.
echo "XHCI" | sudo tee /proc/acpi/wakeup
While this can be one solution, I wanted to be a bit more granular. So I started with listing all /sys
devices that have a wakeup
enabled.
for FILE in `sudo find /sys/devices -name 'wakeup' -print 2>/dev/null`; do
if [[ -f $FILE ]] && [[ "`cat $FILE`" == "enabled" ]]; then
dirname "`dirname "$FILE"`"
fi
done
For each device found, you can check a few more details.
udevadm info -q all -a /sys/devices/pci0000:00/0000:00:15.3/i2c_designware.2/i2c-2/i2c-PIXA3854:00/
Based on those details, I would create an entry in /etc/udev/rules.d/42-disable-wakeup.rules
for each suspicious device. For example, if I suspected my keyboard driver, I would create an entry like this.
ACTION=="add", SUBSYSTEM=="serio", DRIVER=="atkbd", ATTR{power/wakeup}="disabled"
Once I placed all suspicious entries in, I forced a rule reload using udevadm
and tried hibernation out.
sudo udevadm control --reload-rules && sudo udevadm trigger
sudo systemctl hibernate
While this did solve my issue, it was overly restrictive. So, I removed entries one by one, testing hibernation each time. Once done, I had a list of devices that caused the wakeup isolated. On my Framework 13 with i5-1135G7, the winning combination file can be created using this command:
cat << EOF | sudo tee /etc/udev/rules.d/42-disable-wakeup.rules
ACTION=="add", SUBSYSTEM=="i2c", DRIVER=="i2c_hid_acpi", ATTRS{name}=="PIXA3854:00", ATTR{power/wakeup}="disabled"
ACTION=="add", SUBSYSTEM=="pci", DRIVER=="xhci_hcd", ATTRS{subsystem_device}=="0x0001", ATTRS{subsystem_vendor}=="0xf111", ATTR{power/wakeup}="disabled"
ACTION=="add", SUBSYSTEM=="serio", DRIVER=="atkbd", ATTR{power/wakeup}="disabled"
EOF
Your laptop might have a different list of culprits but the overall procedure should work the same.