TL;DR
My ASUS TUF laptop with an NVIDIA GPU never woke from suspend on Ubuntu. It wasn't freezing. It slept fine, but nothing could wake it, because the BIOS's ACPI table doesn't declare the lid as a wake source (LID0 has no _PRW). Without that, Linux never keeps the embedded controller's wake signal (GPE 0x02) armed during s2idle, and the lid, power button and keyboard all go through that signal. An 18-line SSDT overlay loaded tjrough GRUB fixed it. Lid, power button and keyboard wake all work now!
System
- Laptop: ASUS TUF Gaming F15 FX507ZV4, BIOS FX507ZV4.330
- CPU / iGPU: Intel 12th gen (Alder Lake-P), Iris Xe (i915)
- dGPU: NVIDIA RTX 4060 Laptop, nvidia-open 580.178.04,
prime-select on-demand
- OS: Ubuntu 26.04.1 LTS (but same issue for nearly a year on Ubuntu 24.04.), kernel 7.0.0-38-generic
- Storage: 2x NVMe behind Intel VMD (WD SN740 + Predator GM7)
- Sleep Mode: s2idle (firmware default;
deep is also offered)
Symptoms
- Suspend works. The power LED **breathes**, and the fans and keyboard backlight turn off.
- Pressing a key, pressing the power button or opening the lid does nothing at all: no LED change, no fans. The only way out is holding the power button.
- The journal always ends at
PM: suspend entry (s2idle). There's never a suspend exit.
- In two months of logs, a real s2idle suspend never resumed.
deep (S3) resumed only on the first suspend after a boot (twice), and the second deep suspend hung both times.
Because there's an NVIDIA GPU, I assumed (like most threads I found) that it was the NVIDIA driver. It wasn't. With the NVIDIA driver completely blocked from loading (module_blacklist=nvidia,...), it still wouldn't wake.
Root cause
I decompiled the DSDT (sudo cat /sys/firmware/acpi/tables/DSDT > dsdt.dat && iasl -d dsdt.dat). The active lid device _SB.PC00.LPCB.LID0 has no _PRW method, and LID0 didn't appear in /proc/acpi/wakeup at all. The embedded controller's wake events (lid, power button, keyboard) arrive on GPE 0x02 (_L02 → ECLV()). Because no device claims that GPE for wake, Linux doesn't keep it enabled during s2idle, so nothing can wake the machine. Windows presumably handles wake differently, so ASUS never noticed.
The touchpad has a similar problem: its GpioInt is declared Exclusive instead of ExclusiveAndWake. I didn't fix that one, since you don't need the touchpad to wake it.
Credit: I found the same issue on the FX507\*ZI4** (same BIOS 330) in this CachyOS forum post, which pointed me in the right direction:* https://discuss.cachyos.org/t/asus-tuf-gaming-f15-fx507zi4-s2idle-wake-sources-fixed-by-dsdt-override/35463
The fix: SSDT overlay (no full DSDT replacement)
Instead of patching and recompiling the whole 3 MB DSDT, I add a tiny extra table that only inserts the missing `_PRW`. If it's wrong, the kernel just ignores it.
Check your path first! In my DSDT there are two LID0 devices. The one under H_EC returns _STA = 0 (disabled). The active one is _SB.PC00.LPCB.LID0. Your model may differ.
[1.] Install the tools and dump/decompile the DSDT:
$ sudo apt install acpica-tools
$ mkdir ~/acpi-fix && cd ~/acpi-fix
$ sudo cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
iasl -d dsdt.dat
$ grep -n "Device (LID0)" -A12 dsdt.dsl # confirm there's no _PRW, and find the active one
[2.] Create `ssdt-lidwake.asl`:
DefinitionBlock ("", "SSDT", 2, "FIXUP", "LIDWAKE", 0x00000001)
{
External (_SB.PC00.LPCB.LID0, DeviceObj)
Scope (_SB.PC00.LPCB.LID0)
{
Name (_PRW, Package (0x02)
{
0x02,
Zero
})
}
}
[3.] Compile it and package it as an early initrd:
$ iasl -tc ssdt-lidwake.asl
$ mkdir -p cpio/kernel/firmware/acpi
$ cp ssdt-lidwake.aml cpio/kernel/firmware/acpi/
$ (cd cpio && find kernel | cpio -H newc --create --owner=0:0 > ../acpi_override.cpio)
[4.] Have GRUB load it before the normal initrd. This survives kernel updates:
$ sudo cp acpi_override.cpio /boot/
$ echo 'GRUB_EARLY_INITRD_LINUX_CUSTOM="acpi_override.cpio"' | sudo tee -a /etc/default/grub
$ sudo update-grub
[5.] Reboot and verify:
$ journalctl -b -k | grep -i "Table Upgrade"
# ACPI: Table Upgrade: install [SSDT- FIXUP- LIDWAKE]
$ grep LID0 /proc/acpi/wakeup
# LID0 S0 *enabled platform:PNP0C0D:01
After this, the key, power button and lid all wake it, with 3/3 clean resumes so far.
To undo it: remove the GRUB_EARLY_INITRD_LINUX_CUSTOM line, delete /boot/acpi_override.cpio, and run sudo update-grub. If you ever get a broken boot, press e in GRUB and remove /boot/acpi_override.cpio from the initrd line.
Notes / still open
- I also have
options nvidia NVreg_EnableS0ixPowerManagement=1 set (NVIDIA's recommended setting for s2idle laptops). It didn't fix the wake problem on its own. I left it on, but I don't know whether it's needed.
- After resume,
/sys/power/suspend_stats/last_hw_sleep is still 0, so the CPU isn't reaching its deepest S0ix state yet. That means more battery drain while asleep, which is a separate problem I'm still looking into.
- If you have this laptop, please report it to ASUS too ("LID0 missing _PRW, GPE 0x02 not armed in s2idle, BIOS 330"). The more reports they get, the more likely a BIOS fix becomes!
I've put a detailed write-up of everything I tried that *didn't* work, and why, here:
[LINK]
Hope this saves someone else a few evenings. If you have another FX507/FX707 model, I'd be curious whether yours has the same DSDT.