我的显示器是 SANC DM73u pro,4K@160Hz,用 HDMI 接在 RX 7800 XT 上。显示器支持高刷却用不上,那不就白瞎了这台好显示器?所以 Linux 7.2 合入 amdgpu 的 HDMI 2.1 FRL 支持以后,我就用 amdgpu.dcfeaturemask=0x402 把这个默认关着的功能打开,用上了 160Hz。上个月它还因为睡眠唤醒后刷新率掉回 60Hz 闹过一回(见《Linux 在睡眠唤醒后,刷新率掉回了 60Hz》),这次又出了新问题。
掉线
10 月 28 日晚上,电脑从休眠恢复后,显示器一直在“点亮 → 无信号 → 休眠 → 再点亮”里循环,进不了系统。拔插 HDMI 线、重启显示器都没用,只好强制重启。重启后一切正常,可没过多久,显示器又黑了几秒,同时响了一声硬件断开的提示音。
翻了一下日志:19:55 那次,显卡报告 HDMI 断开,和显示器之间的 DDC 通讯也断了,KWin 丢了唯一的屏幕,HDMI 音频设备跟着消失,那声提示音就是它发出的。之后显卡被唤醒、整块重新初始化,第一次点亮链路还失败了(enabling link 3 failed),又断了两次才稳住。往前翻,最近 6 天里显示器已经掉线又重连了 11 次,大多几秒内就自己恢复了。休眠恢复那次,日志停在恢复后的几秒:HDMI 一开始就是断开的,KWin 报告没有任何输出,之后就再没有日志写进磁盘,系统大概率是在重建 HDMI 链路时卡死了。
半小时后,玩 MC 的时候又断了一次。这次显示器 5 分钟都没有自己回来,只能重新拔插线,内核这边一条错误都没报。回到游戏一看,Distant Horizons 的远景成了一片黑块【存档和 LOD 数据都没事,只是显存里的渲染状态坏了,重进世界就好】。

找原因
去社区搜了一下,有人遇到了几乎一样的情况。amdgpu 官方 GitLab 的 #5789 里,用的也是 7.2 内核加 RX 7800 XT / 9070 XT,HDMI 直连,KDE Plasma Wayland 下黑屏;Omarchy 的 #16214 里,有人同样加了 0x402,用 HDMI FRL 跑 4K@144Hz,频繁黑屏一两秒。
#5789 的评论区里有人说 7.2.4 修好了,细看才知道,他是在 7.2.4 上自己回退了一个提交,而且出问题的两台都是海信电视,和我不是一回事。同一个帖子里,AMD 的开发者 Jerry Zuo 贴了两个补丁,这才是对症的:
- Serialize HDMI FRL status polling against link detect:让 FRL 状态轮询和链路检测排队执行,不再同时跑。
- Skip HDMI FRL status polling while link is down:链路断开时跳过 FRL 状态轮询。
第二个补丁的说明里写的问题是:热插拔 HDMI FRL 显示器时,后台轮询触发的重新训练可能落在一个刚被关掉的 PHY 上,把显示固件卡死,结果显示器点不亮。这和 MC 那次断开后自己回不来的情况对得上。
问题是这两个补丁都只进了 7.4 的分支,也没有 Cc: stable 标记,不会回移植。7.2.4 到 7.2.13 的更新日志里没有它们,主线 7.3 的源码里也还是旧逻辑。好在 Linus 的主线已经合进去了,7.4-rc1 一定会带上。本来想直接编一个 linux-next 来用,但 linux-next 是每天合并一次的集成测试树,出问题的概率比 rc 版高得多,VMware 的 DKMS 模块也不一定编得过,而 rc1 再过几天就出了,最后决定等 rc1 出来再装。
装上 7.4
11 月 11 日晚上,休眠又出了问题:点了休眠以后,最后只能强制关机。再开机时,交换分区里没有完整的休眠镜像,说明卡在了写完镜像之前。每次休眠时,amdgpu 都要给显卡做一次整卡复位、关闭 HDMI 链路,和 10 月 28 日那次卡死是同一段流程。
这时 Manjaro 的 testing 分支已经有了 linux74 7.4.0rc2(主线 rc2 是 11 月 9 日发布的,已经包含那两个补丁),遂直接用 pacman -U 装上了 linux74 和 linux74-headers。VMware 的模块由 DKMS 自动编译成功,7.2 留在 GRUB 的高级选项里当退路。
显示器炸了
重启进了桌面以后,问题来了:屏幕每隔几十秒闪一次,闪的时候还会瞬间出现紫色的撕裂,这在 7.2 下从来没有过。打开 DRM 的调试日志录了一分钟,一共 6.9 万行,8353 次画面提交里没有一次模式重设,也没有链路重新训练、热插拔或报错,驱动认为一切正常。唯一的变化是,7.4 的驱动认为这台显示器支持 HDMI FreeSync(fs_capable=1),而 7.2 下 KDE 显示的是“不支持 VRR”。即使 VRR 没开,驱动也会持续给显示器发送相关的信息包。
降到 4K@120Hz,照样在闪,160Hz 带宽不够的可能性被排除了。在 KDE 的显示设置里打开“自适应同步”试了一下,整个画面完全撕裂、到处乱抖,基本没有能看清的地方,好在 15 秒没确认后 KDE 自动撤回了设置。7.4 的 amdgpu 没有单独关闭 HDMI VRR 的参数,最后在显示器菜单里关掉了 FreeSync。显示器上报的 EDID 里不再有 48~160Hz 的可变刷新率范围,驱动也就不走这套新代码了。改回 4K@160Hz,不闪了。
FreeSync 是什么普通显示器以固定频率刷新,显卡出帧的节奏和它对不上时,画面就会撕裂或者卡顿。VRR(可变刷新率)让显示器跟着显卡出帧的节奏刷新,主要用在游戏里。FreeSync 是 AMD 对它的叫法,Adaptive-Sync 是 VESA 标准里的叫法,HDMI VRR 是 HDMI 2.1 里的版本,这台显示器三种都支持,菜单里的开关同时控制它们。
7.2 及以前,Linux 的 amdgpu 只在 DP 上支持 FreeSync,HDMI 上根本不用,所以这个开关一直是摆设。7.4 才给 HDMI 加上了 FreeSync/VRR 支持,这台显示器加上这套新代码,就出了问题。具体是驱动的锅还是显示器固件的锅,驱动日志里看不出来。
顺带发现,7.4 里 FRL 已经默认开启,0x402 这个参数可以不要了。7.4 还新增了一个参数 amdgpu.hdmi_hpd_debounce_delay_ms,作用是 HDMI 断开后等一段时间再处理,正好对应短暂掉线的老问题,之后可以试试。
后记
现在跑的是 7.4-rc2 加 4K@160Hz,显示器的 FreeSync 关着。装 7.4 本来是为了修好掉线和休眠卡死,这两个问题修没修好,还要再观察几天。
本以为 A 卡对 Linux 的支持很好,结果都 2026 年底了,HDMI 跑 4K 高刷还只是勉强能用,这水平真是…… 
等 7.4 正式版出来,再把 FreeSync 打开试试吧。
参考资料
- amdgpu GitLab #5789
- amdgpu GitLab #5760
- omacom/omarchy#16214:HDMI 2.1 FRL 4K@144Hz blackouts
- agd5f/linux 提交 3e6272b40c8f:Serialize HDMI FRL status polling against link detect
- agd5f/linux 提交 c396c883a9a8:Skip HDMI FRL status polling while link is down
- Phoronix:AMDGPU HDMI 2.1 FRL To Be Initially Disabled-By-Default
- Phoronix:AMD Sends Out New Linux Patches Further Enhancing HDMI 2.1 Reliability
