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

Open
#2,809 0 comments 2 reactions 0 assignees View on GitHub

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:
  1. Steam Machine on SteamOS 3.9.0 connected by HDMI to an HDMI 2.1 TV with VRR (LG C4 here).
  2. Add amdgpu.dcfeaturemask=0x402 to the kernel command line (/etc/default/grub.d/*.cfg + update-grub), reboot.
  3. Observe 4K144 / 10 bpc modes appear, but cat /sys/kernel/debug/dri/0/HDMI-A-1/vrr_range reads 0/0 and modetest -M amdgpu -c shows vrr_capable = 0 on HDMI-A-1.
  4. Apply the one-line change above to amdgpu, reboot: vrr_range 40-144, vrr_capable = 1, VRR active at 144 Hz.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.