Your external monitor randomly blinks, the picture jumps back to the laptop screen for a few seconds, then reconnects on its own — but on Windows everything is perfect. Here's exactly why it happens on Linux with an AMD GPU, how to confirm it from the logs, and the one-line fix that solves it for most people.
The symptom
You have an external display plugged into an AMD-powered laptop. From time to time:
- The external screen blinks / goes black for a moment.
- Everything jumps to the laptop's built-in panel only.
- After a few seconds the external monitor reconnects by itself.
- On Windows, with the same cable and monitor, it never happens.
It's intermittent, it's annoying, and because Windows is fine you assume it's not the hardware. Let's prove what it actually is.
Step 1: Read the kernel log
Right after the next blink, open a terminal and run:
journalctl -k -b | grep -iE 'dpcd|link training|retrieve_link_cap|resuming'
If your machine has the same problem, you'll see a line like this:
kernel: [drm:retrieve_link_cap [amdgpu]] *ERROR* retrieve_link_cap: Read receiver caps dpcd data failed.
That single line is the whole story.
Step 2: What that error means
Your monitor is connected over DisplayPort (a native DP port, a USB-C→DP cable, or a dock). When the GPU brings the link up, it must read the monitor's capabilities — called DPCD (DisplayPort Configuration Data) — over a tiny side-channel in the cable known as the AUX channel.
When that AUX read fails, the driver can't negotiate the link, so it drops the external output. The picture falls back to the laptop panel. A moment later it retries, the read succeeds, and the monitor comes back. That is exactly the blink–disconnect–reconnect cycle you see.
Step 3: Why Windows is fine but Linux isn't
This is the part most guides get wrong. If the same cable and monitor work on Windows, the physical link is good enough — so the difference is in how each driver handles a marginal link. The real cause is usually a combination:
- Windows retries silently;
amdgpugives up and logs an error. When a DPCD/AUX read hiccups, the Windows AMD driver does aggressive, invisible retries before you notice. Linux'samdgpuis less forgiving — it logs the failure and tears the output down. Same glitch, different reaction. - Power management — the real Linux-specific trigger.
amdgpuenables an aggressive display power-saving feature called PSR (Panel Self Refresh). Entering and exiting PSR re-touches the display link and disturbs the AUX channel — exactly the channel that's failing. Windows often tunes this very differently or leaves it off. - Driver/firmware maturity. Windows ships the vendor's fully-tuned driver;
amdgpuhas had a steady stream of AUX/link-training fixes across kernel releases.
In short: the link is slightly marginal, Windows hides it, and Linux's PSR power-saving exposes it.
The fix: disable Panel Self Refresh
The highest-yield software fix is to tell amdgpu to keep the display link awake instead of letting it nap. You do that with a kernel boot parameter: amdgpu.dcdebugmask=0x10.
On Ubuntu / Debian-based distros that use GRUB:
# 1. Back up the GRUB config
sudo cp /etc/default/grub /etc/default/grub.bak
# 2. Edit GRUB_CMDLINE_LINUX_DEFAULT, e.g. change:
# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# to:
# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amdgpu.dcdebugmask=0x10"
sudo nano /etc/default/grub
# 3. Regenerate the boot config
sudo update-grub
# 4. Reboot
sudo reboot
After rebooting, confirm it's active:
cat /proc/cmdline
You should see amdgpu.dcdebugmask=0x10 in the output. Done.
What amdgpu.dcdebugmask=0x10 actually does
dcdebugmask is a bit-mask for the amdgpu driver's Display Core. Each bit switches off one display feature. The value 0x10 maps to a single bit: disable PSR
(Panel Self Refresh).
PSR is a power-saving feature: when the on-screen image isn't changing, the GPU stops actively driving the panel and lets the display hold its last frame from its own memory. Great for battery — but the transitions in and out of PSR are what disturb the AUX channel and cause your dropout. Turning it off keeps the link continuously active. The only real cost is slightly higher idle power draw.
Because it's a bitmask, you can combine values by adding them:
| Value | Disables |
|---|---|
0x2 | Memory "stutter" power saving |
0x8 | Clock gating |
0x10 | PSR (Panel Self Refresh) ← the fix |
0x12 | PSR + stutter (0x10 + 0x2) |
Note: exact bit meanings can shift slightly between kernel versions, but PSR = 0x10 is stable on kernel 6.8.
If it still happens
- Stronger mask: use
amdgpu.dcdebugmask=0x12(PSR + stutter). Same edit, swap the value,update-grub, reboot. - Update kernel + firmware for newer AUX/link-training fixes:
sudo apt update && sudo apt full-upgrade - Reduce link stress to confirm the link is genuinely marginal — lower the monitor's refresh rate (e.g. 60→50 Hz) or resolution. If the blinking stops, your cable/port is at its bandwidth limit.
- Then improve the hardware: swap to a known-good, properly-rated DisplayPort / USB-C cable and remove any dock or adapter from the path.
How to undo the change
sudo cp /etc/default/grub.bak /etc/default/grub
sudo update-grub
sudo reboot
Summary
- Symptom: external monitor blinks, drops to the laptop panel, reconnects — only on Linux.
- Log signature:
retrieve_link_cap: Read receiver caps dpcd data failedfromamdgpu. - Cause: a slightly marginal DisplayPort/AUX link that Windows hides with silent retries, while Linux's
amdgpu— especially its PSR power-saving — exposes it. - Fix: boot with
amdgpu.dcdebugmask=0x10to disable Panel Self Refresh.
blocks render as code boxes.
- Suggested title: Fix: AMD External Monitor Blinks & Disconnects on Linux (But Works on Windows)
- Suggested labels: Linux, AMD, amdgpu, DisplayPort, Ubuntu, Troubleshooting, External Monitor
- In Search Description (Settings sidebar of the post), paste: AMD external monitor blinks and disconnects on Linux but works on Windows — caused by amdgpu PSR. Fix it with amdgpu.dcdebugmask=0x10.
The same content is saved in the file amd-external-display-blinking-linux-blogger.html if you'd rather copy from there. Want a version with inline CSS styling (colored code boxes, a highlighted "fix" callout)
so it looks nicer on your Blogger theme?