ValveSoftware / ValveSoftware/SteamOS
Steam Machine: HDMI 2.1 FRL (dcfeaturemask=0x402) works on kernel 7.2 but loses VRR; one-line amdgpu_dm fix missing from linux-neptune-72
Nobody has claimed this yet.
- Dominant language
- No language data
- Stars
- 2.6k
- Forks
- 83
- Avg merge
- 4m
- Merged PRs (30d)
- 3
Description
Your system information
- SteamOS 3.9.0 (BUILD_ID 20260828.100), preview branch
- Kernel 7.2.0-valve1-1-neptune-72-gd39b4282853d (linux-neptune-72 7.2.0.valve1-1); also checked the 7.2.4-valve1 source, same code
- Steam client: current preview
- Hardware: Steam Machine (DMI "Fremont"), Navi 33 dGPU 1002:7481, DCN 3.2.1
- Display: LG OLED83C4 connected directly to the HDMI port (no dock or adapter)
- Opted into Steam client beta?: Yes
- Opted into SteamOS beta?: Yes (preview)
- Have you checked for updates in Settings > System?: Yes
Please describe your issue in as much detail as possible:
Kernel 7.2 brought native HDMI 2.1 FRL to amdgpu. The Steam Machine ships it disabled behind amdgpu.dcfeaturemask bit 0x400 (DC_FRL_MASK, Valve commit c3778921bf0d "drm/amd/display: Disable FRL and add module param to enable it"). Booting with amdgpu.dcfeaturemask=0x402 (FRL plus the default 0x2 bit) works well on the Steam Machine: the LG C4 now gets 3840x2160 at 144 Hz, 4:4:4, 10 bpc, HDR (PQ, BT.2020), where the stock TMDS path is limited to 4K120 4:2:0 8 bpc.
However on the FRL link VRR disappears entirely:
# TMDS (stock): /sys/kernel/debug/dri/0/HDMI-A-1/vrr_range
Min: 40
Max: 144
vrr_capable = 1
# FRL (dcfeaturemask=0x402):
Min: 0
Max: 0
vrr_capable = 0
Root cause (verified in the linux-neptune-72 source package): the Valve tree carries Tomasz Pakula's "drm/amd: VRR fixes, HDMI Gaming Features" series as [FROM-ML] commits, but not his later fix-up "Switch to signal type helper functions from DC" (https://github.com/Lawstorant/linux/commit/21d564d5a1, branch hdmi-7.2). In amdgpu_dm_update_freesync_caps() the HDMI branch is only entered for SIGNAL_TYPE_HDMI_TYPE_A. An FRL sink is SIGNAL_TYPE_HDMI_FRL, so it falls through every branch and freesync_capable stays false.
One-line fix, drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c (~line 14327 in 7.2.0-valve1):
/* HDMI */
- } else if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A) {
+ } else if (dc_is_hdmi_signal(sink->sink_signal)) {
/* Prefer HDMI VRR */
if (hdmi_vrr.supported) {
dc_is_hdmi_signal() already exists in drivers/gpu/drm/amd/display/include/signal_types.h and covers both TMDS and FRL.
Verification: I rebuilt only amdgpu.ko from the 7.2.0-valve1 tag with this change (out-of-tree build against linux-neptune-72-headers, installed under /lib/modules/<ver>/updates/). With FRL enabled the connector now reports vrr_range 40 to 144, vrr_capable=1, passive_vrr_capable=1, allm_capable=1, and gamescope enables VRR on the CRTC (VRR_ENABLED=1) at 3840x2160@143.99. The amdgpu_dm_dtn_log HPO row shows 4:4:4, 10 bpc, 4 lanes, DSC off. Several hours of play so far without link drops.
Patch, build script and install/rollback tooling for other Steam Machine owners: https://github.com/beaglemoo/steam-machine-hdmi21
Request: cherry-pick the one-line change into linux-neptune-72 (it is a strict subset of what Pakula's branch and the 7.4 AMD series do), and consider enabling DC_FRL_MASK by default on the Steam Machine once VRR works, as mainline 7.4 will.
Related: #2698 (4K120 over HDMI), #2740 (VRR on Steam Machine, different cause: TMDS path on 6.18).
Steps for reproducing this issue:
- Steam Machine on SteamOS 3.9.0 connected by HDMI to an HDMI 2.1 TV with VRR (LG C4 here).
- Add
amdgpu.dcfeaturemask=0x402to the kernel command line (/etc/default/grub.d/*.cfg+update-grub), reboot. - Observe 4K144 / 10 bpc modes appear, but
cat /sys/kernel/debug/dri/0/HDMI-A-1/vrr_rangereads 0/0 andmodetest -M amdgpu -cshowsvrr_capable = 0on HDMI-A-1. - Apply the one-line change above to amdgpu, reboot:
vrr_range40-144,vrr_capable = 1, VRR active at 144 Hz.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c at amdgpu_dm_update_freesync_caps(), then inspect dc_is_hdmi_signal() in drivers/gpu/drm/amd/display/include/signal_types.h. Build the amdgpu module and reproduce with amdgpu.dcfeaturemask=0x402, checking vrr_range and vrr_capable on HDMI-A-1. Done means FRL reports the display's VRR range and gamescope enables VRR at 4K144.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c, linux
- Domain
- computer-graphics, operating-systems
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 76/100