Acer Predator G5910: Linux won't power off (screen goes black, PC stays on)

Tested on Ubuntu 24.04, kernel 6.8, 2026-10-28. Board: Acer Predator G5910, Intel P67, BIOS P01-A4.

Short version: the BIOS's ACPI _PTS method turns on an "SMI on sleep" trap, so Linux's final power-off write hands control to a BIOS routine that never finishes. Writing the S5 "sleep" command straight into the chipset register without running _PTS (what GRUB's halt does) works. The quick fix is a 5-line systemd-shutdown hook. The better fix is the small s5direct kernel module, which also keeps Wake-on-LAN working.

Symptoms

Hardware / firmware

SystemAcer Predator G5910 (desktop)
ChipsetIntel P67 (6-series / Cougar Point), Sandy Bridge CPU
BIOSAMI, version P01-A4, dated 2011-12-22, UEFI boot
OSUbuntu 24.04 LTS, kernel 6.8.0 (also older 6.8 kernels)
ACPI valuesPM1a control block at I/O port 0x404 (PMBASE 0x400), no PM1b, _S5 SLP_TYP = 7

The key test: GRUB can power it off

From the GRUB menu, press c and type halt: the machine turns off completely. So the motherboard and PSU are fine, and the failure is in the way Linux does it. On x86, GRUB's halt reads _S5 from the DSDT and writes SLP_TYP | SLP_EN directly into PM1a_CNT. It doesn't run the BIOS's _PTS method or anything else from ACPI.

What did not help

Root cause: _PTS enables an SMI trap

Before power-off, Linux runs the DSDT's _PTS (Prepare To Sleep) method. On this board it calls \_SB.PCI0.SBRG.SPTS, which sets PS1E, a field mapped to bit 4 of the PCH's SMI_EN register at PMBASE + 0x30 (port 0x430). That bit is SLP_SMI_EN: while it's set, writing SLP_EN doesn't put the chipset into S5. It raises an SMI, and the BIOS's SMI handler is supposed to finish the power-off. Under Linux that handler never does. Windows presumably meets whatever the handler expects.

Method (SPTS, 1, NotSerialized)
{
    PS1S = One      // SMI_STS bit 4: clear SLP_SMI_STS
    PS1E = One      // SMI_EN  bit 4: SLP_SMI_EN, trap SLP_EN into SMI
    SLPS = One
}

GRUB's halt and the shell hook below never run _PTS, so their write goes straight to the hardware and works. The kernel module clears SLP_SMI_EN just before its own write. That's how I confirmed this cause: without that line the module failed exactly like stock Linux, and with it the board powered off.

Better fix: the s5direct kernel module (works)

github.com/jy-roda/acer-predator-g5910-linux-poweroff-wol is a small public-domain module, installed with DKMS. It hooks into the kernel's power-off sequence after all drivers have shut down, clears SLP_SMI_EN, and does the same raw S5 write. Compared with the shell hook:

git clone https://github.com/jy-roda/acer-predator-g5910-linux-poweroff-wol.git
cd acer-predator-g5910-linux-poweroff-wol
sudo sh install.sh

Quick fix: a systemd-shutdown hook (works)

Create a systemd-shutdown hook. Executables in /usr/lib/systemd/system-shutdown/ run at the very end of shutdown, after all filesystems are unmounted or read-only, with the argument poweroff, reboot, halt or kexec.

sudo tee /usr/lib/systemd/system-shutdown/s5-direct.shutdown > /dev/null <<'EOF'
#!/bin/sh
# Acer Predator G5910: Linux's ACPI power-off leaves the board on, but GRUB's halt works.
# Do what GRUB does: write SLP_TYP=7 (from _S5) | SLP_EN into PM1a_CNT (port 0x404, from the FADT).
[ "$1" = poweroff ] || exit 0
sync
sleep 1
printf '\000\074' | dd of=/dev/port bs=1 seek=1028 count=2 2>/dev/null
EOF
sudo chmod 755 /usr/lib/systemd/system-shutdown/s5-direct.shutdown

Then test with sudo poweroff or one short press of the power button. Reboot is not affected. To undo, delete the file. The hook runs before the kernel's driver shutdown, so wake-on-LAN won't work with it. Use the module for that.

What the bytes mean

Using this on another board

Don't copy the numbers blindly. Writing to the wrong I/O port can do anything. Read your own values first:

sudo apt install acpica-tools
sudo acpidump -o acpi.dat && acpixtract -a acpi.dat
iasl -d facp.dat dsdt.dat
grep -E "PM1A Control Block Address|PM1B Control Block Address" facp.dsl
grep -A6 "Name (_S5" dsdt.dsl

Fallback if you can't write to /dev/port

Since GRUB's halt works, turn a power-off into a reboot into GRUB's power-off:

  1. Add a GRUB entry in /etc/grub.d/40_custom: menuentry "Power off" --id poweroff { halt }, then run update-grub.
  2. Add a service with WantedBy=poweroff.target and DefaultDependencies=no that runs grub-reboot poweroff.
  3. Add a system-shutdown hook that, for poweroff, runs systemctl reboot --force --force if grub-editenv list shows next_entry=poweroff.

It works, but every power-off then takes an extra boot through GRUB. Note that update-grub runs every executable file in /etc/grub.d/, so don't leave backup copies there.