The Eluktronics MECH-15 G3 (Ryzen 9 5900HX / RTX 3070) ships with Windows-oriented S0ix "modern standby" as the only sleep mode in its ACPI tables. This is a problem on Linux, because modern standby is not really sleep — it's more like your laptop pretending to be asleep while it slowly drains your battery in its bag. I closed the lid, threw it in my well-insulated laptop bag, and pulled out a scorching hot potato with 40% less battery an hour later. Not ideal.

A quick primer on the sleep states, from worst to best:

S0ix/s2idle ("modern standby") — system stays in S0 but enters low-power idle substates where the SoC powers down components while keeping RAM alive. In theory this gives fast wake and background network activity. In practice, on Linux, it often falls back to plain s2idle (freeze userspace, idle CPU, pray) and drains like the laptop is awake.

S3 ("suspend-to-RAM") — everything powers off except RAM. The classic. 3-5% battery drain overnight. This is what we want.

S4 ("hibernate") — state saved to disk, full power off. Survives pulling the battery. Zero drain.

The 5900HX supports S3 just fine, but the stock DSDT (the ACPI table that tells the OS what the hardware can do) simply doesn't advertise it. The firmware vendor only bothered to declare S0ix because that's all Windows uses on modern laptops. Linux looks at the DSDT, sees no S3, and gives you s2idle. Thanks.

The fix: lie to the kernel. Patch the DSDT to add the S3 declaration that should have been there all along. Rasmus Moorats documented the same technique for the RedmiBook 16 — his writeup covers the full background and an alternative loading method via cpio/initrd for non-GRUB bootloaders like systemd-boot.

The steps below are for GRUB2, which is what I was using at the time.