HP Z66 G6 外接显示器无信号排查:amdgpu DCN 3.1 EDID 超时与 HDMI 2.1 FRL 协商问题
问题现象
HP Z66 G6 14 (AMD Ryzen 7 H 255, Fedora 44, kernel 7.0.8) 通过 HDMI 线直连 5K 外接显示器,显示器提示"无信号"。
笔记本内屏 (eDP-1, 3072x1920@120Hz) 正常工作,但 HDMI-A-1 始终显示 disconnected。
诊断过程
1. 检查连接状态
$ cat /sys/class/drm/card1-HDMI-A-1/status disconnected $ xrandr | grep HDMI HDMI-1 disconnected系统层面 HDMI 口确实未检测到显示器。
2. 内核日志分析
$ sudo dmesg | grep -i "hdmi\|EDID" [ 79.746] [drm:dm_helpers_read_local_edid [amdgpu]] *ERROR* EDID err: 2, on connector: HDMI-A-1 [ 79.747] amdgpu 0000:05:00.0: [drm] *ERROR* No EDID read. [ 87.196] [drm:dm_helpers_read_local_edid [amdgpu]] *ERROR* EDID err: 2, on connector: HDMI-A-1 [ 141.047] [drm:dm_helpers_read_local_edid [amdgpu]] *ERROR* EDID err: 2, on connector: HDMI-A-1 [ 148.277] [drm:dm_helpers_read_local_edid [amdgpu]] *ERROR* EDID err: 2, on connector: HDMI-A-1驱动在 79~148 秒之间尝试了 4 次 EDID 读取,全部失败(err: 2)。
3. 关键线索
[ 4.378] amdgpu 0000:05:00.0: [drm] DP-HDMI FRL PCON supportedZ66 的 HDMI 口内部走的是DisplayPort 转 HDMI(PCON = Protocol Converter),5K 显示器需要 HDMI 2.1 的FRL(Fixed Rate Link)高带宽模式。
根因分析
问题链条如下:
- 开机时 HDMI 线已插入,amdgpu 驱动在第 79 秒尝试读取 EDID
- 此时显示器的 HDMI 接收器还未完成 FRL 链路训练(5K 需要 HDMI 2.1 高带宽模式,协商时间更长)
- EDID 读取超时失败,驱动重试 4 次后放弃,标记为 disconnected
- 驱动不会自动重试 – 除非物理拔插触发新的热插拔事件
拔插 HDMI 线后,显示器 FRL 协商已就绪,重新握手成功,5K 输出正常。
热插拔后的 DCN 3.1 compbuf 超时
拔插恢复后,再次出现信号丢失。dmesg 显示:
[drm] REG_WAIT timeout 1us * 100 tries - dcn31_program_compbuf_size line:141 WARNING: drivers/gpu/drm/amd/amdgpu/../display/dc/hubbub/dcn31/dcn31_hubbub.c:151 at dcn31_program_compbuf_size+0xd0/0x220 [amdgpu] Call Trace: dcn20_optimize_bandwidth+0xee/0x250 [amdgpu] dc_commit_state_no_check+0x91c/0xf10 [amdgpu] dc_commit_streams+0x362/0x750 [amdgpu] amdgpu_dm_commit_streams+0x563/0x7c0 [amdgpu] amdgpu_dm_atomic_commit_tail+0xd1/0xd30 [amdgpu]这是 AMD DCN 3.1 显示控制器(HawkPoint Ryzen 7)的已知 bug:热插拔后模式切换时,compbuf 寄存器编程超时(1us * 100 = 100us),导致显示模式提交失败。系统以为在输出,但物理信号已断。
该问题在 kernel 7.0 上被多个发行版报告(Arch、CachyOS、Gentoo),截至 2026-05 尚无上游修复。
解决方案
方案一:内核参数(缓解 compbuf 超时)
sudo grubby --update-kernel=ALL --args="amdgpu.runpm=0 amdgpu.gfx_off=0"amdgpu.runpm=0– 禁用运行时电源管理,防止 DCN 在模式切换时处于低功耗态amdgpu.gfx_off=0– 禁用 GFX 关闭,保持 GPU 始终就绪
方案二:udev + systemd 自动重检测(解决开机 EDID 失败)
udev 规则:
# /etc/udev/rules.d/99-hdmi-retrigger.rules ACTION=="add", SUBSYSTEM=="drm", KERNEL=="card[0-9]-HDMI-A-*", DRIVERS=="amdgpu", TAG+="systemd", ENV{SYSTEMD_WANTS}="hdmi-retrigger@%k.service"systemd 模板服务:
# /etc/systemd/system/hdmi-retrigger@.service [Unit] Description=Re-trigger HDMI hotplug for %i After=graphical.target [Service] Type=oneshot ExecStart=/bin/bash -c 'for i in 1 2 3; do sleep 5; echo detect > /sys/class/drm/%i/status; s=$(cat /sys/class/drm/%i/status); [ "$s" = "connected" ] && exit 0; done'开机后自动重试 HDMI 检测,最多 3 次、每次间隔 5 秒。
方案三:等待上游修复
DCN 3.1 compbuf 超时是 amdgpu 驱动 bug,已有多个社区报告。关注后续内核版本的修复。
注意事项
- DRM card 编号可能在重启后变化(之前观察到 nvme 设备编号交换),udev 规则使用
card[0-9]通配 +DRIVERS=="amdgpu"限定,避免硬编码 DRIVERS在 udev 中遍历父设备链,connector 子设备本身无 driver,但父 PCI 设备有 amdgpu 驱动- 禁用
runpm和gfx_off会轻微增加功耗(笔记本电池续航略受影响)
参考链接
- CachyOS Forum: AMDGPU DCN crash on Linux 7.0 – dcn31_program_compbuf_size
- GitHub: AMD-GPU-DP-Hotplug-Fix (systemd workaround)
- amd-gfx mailing list: amdgpu WARNING when switching to external display
- Gentoo Forums: REG_WAIT timeout on Ryzen iGPU
环境信息
| 机型 | HP Z66 G6 14 (HP ProBook 4 G1ah) |
| CPU | AMD Ryzen 7 H 255 (HawkPoint) |
| GPU | AMD Radeon 780M (HawkPoint1, DCN 3.1) |
| 内核 | 7.0.8-200.fc44.x86_64 |
| 系统 | Fedora 44 Workstation (Wayland) |
| HDMI 接口 | DP-HDMI FRL PCON(内部 DP 转 HDMI 2.1) |
| 音频 Codec | Realtek ALC236 (SSID 0x103c:8df7) |
| 显示器 | 5120x2880 @ 60Hz (HDMI 2.1) |
后续诊断:上游 Bug 定位
根因 Commit
已定位到具体引入回归的 commit:
commit 592c5b80110d5e9e50873b5364818cb6f401e26d "drm/amd/display: Migrate HUBBUB register access from hwseq to hubbub component"该 commit 改变了 HUBBUB 寄存器的初始化顺序,导致dcn31_init_crb()读取 DET_SIZE_CURRENT 寄存器时获得了未就绪的值。后续dcn31_program_compbuf_size()轮询等待寄存器变为期望值,但硬件在 100us 内未响应 – 超时。
超时机制详解
| REG_WAIT 参数 | 1us x 100 = 最多等待 100us |
| 问题 | 双屏 + FRL 链路训练 + deep color 三者叠加时,UMA 内存 Fabric 响应慢于 100us |
| 结果 | 超时 WARNING + 显示模式提交失败 + 黑屏 |
上游 Bug 报告
- CachyOS Issue #810(标记为 upstream):https://github.com/CachyOS/linux-cachyos/issues/810
- lore.kernel.org/amd-gfx 上游上报:https://lore.kernel.org/amd-gfx/20260316094232.6bb6f0bf@schienar/
- 影响范围:kernel 7.0.0 ~ 7.0.3(截至 2026-05-18 未修复)
社区 Workaround Patch(@rgiuse,已验证有效)
将 REG_WAIT 超时从 100us 扩大到 30ms:
--- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn31/dcn31_hubbub.c +++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn31/dcn31_hubbub.c - REG_WAIT(... 1, 100) /* 1us x 100 = 100us */ + REG_WAIT(... 1000, 30) /* 1000us x 30 = 30ms */CachyOS #810 讨论中,社区倾向最终方案为 2-10us x 1000(兼顾响应速度和可靠性)。
处理方案对比
| 方案 | 效果 | 代价 |
| amdgpu.runpm=0 amdgpu.gfx_off=0 | 降低触发频率 | 略增功耗 |
| amdgpu.deep_color=0 | 减少带宽压力 | 降低色深上限 |
| 应用 workaround patch 编译内核 | 彻底消除超时 | 需手动编译 |
| 等待 kernel 7.1 / 7.0.x 后续版本 | 官方修复 | 时间未知 |
显示器带宽问题(并发现)
诊断过程中发现 BenQ EL2870U 为 HDMI 2.0 显示器(Max TMDS 340MHz),而驱动默认 max bpc=16(deep color)。在 4K@60Hz 下 RGB deep color 大幅超出 HDMI 2.0 带宽,加剧了雪花噪点和黑屏。
已加入amdgpu.deep_color=0内核参数缓解。
