Skip to content

Suspend/Resume Crashes Due to AMD dGPU + Ghost Display Blocking Lid Sleep #195

@ShmukaDuk

Description

@ShmukaDuk

MacBookPro15,1 (2018/2019 15") — Suspend/Resume Crashes Due to AMD dGPU + Ghost Display Blocking Lid Sleep

Device Info

Model MacBook Pro 15-inch 2019 (MacBookPro15,1)
OS Ubuntu 24.04 Noble
Kernel 6.19.11-1-t2-noble (AdityaGarg8 t2-ubuntu-repo)
iGPU Intel UHD Graphics 630 (CoffeeLake-H GT2)
dGPU AMD Radeon RX 560X (Baffin, 0x1002:0x67EF)
T2 Bridge Apple Inc. T2 Bridge Controller (rev 01)
Session Type Wayland (GNOME)

Problem 1 — System crashes on resume from suspend

When closing the lid or running systemctl suspend, the system enters sleep but fails to resume. Instead of returning to the desktop, it reboots from scratch (full POST, GRUB, login screen).

Symptoms

  • Screen goes black on open
  • Ubuntu loading screen appears briefly with no input response
  • Hard shutdown required
  • System reboots fully instead of resuming

Logs from failed resume (journalctl -b -1)

kernel: amdgpu 0000:01:00.0: amdgpu: fw load failed
kernel: amdgpu 0000:01:00.0: amdgpu: amdgpu_device_ip_resume failed (-22).
kernel: amdgpu 0000:01:00.0: PM: dpm_run_callback(): pci_pm_resume returns -22
kernel: amdgpu 0000:01:00.0: PM: failed to resume async: error -22
kernel: bce-vhci: Possible desync, cmd cancel timed out
kernel: bce-vhci bce-vhci: HC died; cleaning up
kernel: usb usb7: PM: failed to resume async: error -110

The AMD GPU fails to reload its firmware on resume (fw load failed, error -22). This cascades into the BCE (T2 chip USB controller) dying, which kills the keyboard, trackpad and all T2 devices, making the system completely unresponsive.

Note: BCE itself suspends and resumes correctly in isolation — bce_vhci: suspend done and bce_vhci: resume done both appear in logs. It only fails as a secondary effect of the amdgpu crash.


Problem 2 — Lid close does not trigger suspend

Even after fixing the resume crash, closing the lid only blanked the screen without triggering actual suspend. journalctl showed Lid closed events but no PM: suspend entry.

Root cause

systemd-inhibit --list revealed:

shmuk  gsd-power  handle-lid-switch  External monitor connected

The simpledrm framebuffer driver was creating a phantom display connector (card0-Unknown-1) that appeared as connected in /sys/class/drm/*/status. GNOME's gsd-power saw this as an external monitor being attached and held a handle-lid-switch inhibitor, blocking lid-close from triggering suspend.


Workaround

The following combination of changes resolves both issues. Suspend on lid close works reliably with deep S3 sleep.

1. Blacklist AMD GPU drivers

/etc/modprobe.d/blacklist-amdgpu.conf:

blacklist amdgpu
blacklist amdxcp

2. Force Intel iGPU as primary via apple-gmux

/etc/modprobe.d/apple-gmux.conf:

options apple-gmux force_igd=y

3. Kernel parameters

In /etc/default/grub:

GRUB_CMDLINE_LINUX:

intel_iommu=on iommu=pt pcie_ports=compat

GRUB_CMDLINE_LINUX_DEFAULT:

quiet splash i915.enable_guc=3 mem_sleep_default=deep video=Unknown-1:d

video=Unknown-1:d is the critical fix for Problem 2 — it disables the phantom AMD connector at kernel level before GNOME initialises, preventing the handle-lid-switch inhibitor from being set.

pcie_ports=compat is required — using pcie_ports=native causes issues on this hardware.

4. Enable lid switch handling in logind

In /etc/systemd/logind.conf, uncomment:

HandleLidSwitch=suspend

5. Rebuild initramfs

sudo update-initramfs -u && sudo reboot

Verification

After rebooting, close the lid and reopen. Check:

journalctl -b 0 --no-pager | grep -i -E "suspend entry|suspend exit|lid" | grep -v hibernation

Expected output:

systemd-logind: Lid closed.
kernel: PM: suspend entry (deep)
kernel: PM: suspend exit
systemd-logind: Lid opened.

Also verify:

cat /sys/power/mem_sleep
# Expected: s2idle [deep]

glxinfo | grep "OpenGL renderer"
# Expected: Mesa Intel(R) UHD Graphics 630 (CFL GT2)

Drawbacks

  • The AMD Radeon RX 560X is completely disabled. Only Intel UHD 630 is available.
  • This is a workaround, not a real fix. The underlying issue is that the amdgpu driver fails to reload firmware on resume on this Apple hardware. Until this is fixed upstream in the amdgpu driver, the dGPU cannot coexist with working suspend.
  • DRI_PRIME=1 will not work with amdgpu blacklisted.

Things that did NOT work

For reference, the following approaches were attempted and failed before finding the above solution:

  • echo "off" > /sys/bus/pci/devices/0000:01:00.0/power/control via systemd-sleep hook — amdgpu still tried to resume
  • options amdgpu runpm=1 — no effect on resume crash
  • options amdgpu runpm=0 — no effect on resume crash
  • Systemd service with rmmod -f apple-bce before sleep — service failed with status=203/EXEC and apple_bce(C) showed module could not be unloaded
  • systemd-sleep hook script to unload BCE/WiFi — apple-bce could not be force-unloaded at suspend time despite CONFIG_MODULE_FORCE_UNLOAD=y
  • Disabling the ghost display in GNOME Settings → Displays — caused suspend to break again

Suggested Wiki Addition

This issue and workaround should be documented in the Hybrid Graphics guide under a new section specifically for MacBookPro15,1 and MacBookPro16,1 models with AMD dGPU suspend issues.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions