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:
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.
MacBookPro15,1 (2018/2019 15") — Suspend/Resume Crashes Due to AMD dGPU + Ghost Display Blocking Lid Sleep
Device Info
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
Logs from failed resume (
journalctl -b -1)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 doneandbce_vhci: resume doneboth 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.
journalctlshowedLid closedevents but noPM: suspend entry.Root cause
systemd-inhibit --listrevealed:The
simpledrmframebuffer driver was creating a phantom display connector (card0-Unknown-1) that appeared asconnectedin/sys/class/drm/*/status. GNOME'sgsd-powersaw this as an external monitor being attached and held ahandle-lid-switchinhibitor, 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:2. Force Intel iGPU as primary via apple-gmux
/etc/modprobe.d/apple-gmux.conf:3. Kernel parameters
In
/etc/default/grub:GRUB_CMDLINE_LINUX:GRUB_CMDLINE_LINUX_DEFAULT:4. Enable lid switch handling in logind
In
/etc/systemd/logind.conf, uncomment:5. Rebuild initramfs
sudo update-initramfs -u && sudo rebootVerification
After rebooting, close the lid and reopen. Check:
Expected output:
Also verify:
Drawbacks
DRI_PRIME=1will 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/controlvia systemd-sleep hook — amdgpu still tried to resumeoptions amdgpu runpm=1— no effect on resume crashoptions amdgpu runpm=0— no effect on resume crashrmmod -f apple-bcebefore sleep — service failed withstatus=203/EXECandapple_bce(C)showed module could not be unloadedsystemd-sleephook script to unload BCE/WiFi — apple-bce could not be force-unloaded at suspend time despiteCONFIG_MODULE_FORCE_UNLOAD=ySuggested 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.