HDMI VRR series on DCN 3.2 + Samsung G95SD (5120x1440@240, FRL5+DSC): results across three builds

Samius Maximus <[email protected]>
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <BN0P223MB01669AC50E296D3E2618BB3FC7A32@BN0P223MB0166.NAMP223.PROD.OUTLOOK.COM>
# HDMI VRR series on DCN 3.2 + Samsung Odyssey G95SD (5120x1440@240, FRL+DSC)


Reported by: Sam

## Why this might be useful

A 5120x1440 ultrawide at 240 Hz on DCN 3.2, driven over HDMI 2.1 FRL with DSC,
is a configuration I have not seen reported against this series. Everything
below is from the CachyOS `7.2/hdmi` rebase (27 commits, `dc59e4fea..8f75e000c`)
applied to stock Linux 7.2.0, with `amdgpu.dcfeaturemask=0x402`.

## Hardware / software

| | |
|---|---|
| GPU | RX 7900 XTX, Navi 31, **DCN 3.2**, `1002:744c` |
| Sink | Samsung **Odyssey G95SD**, 5120x1440, HDMI 2.1, FRL5 max, VRRmin 48 / VRRmax 240 |
| Link | active optical HDMI 2.1, direct, no PCON |
| Base | Linux 7.2.0 + CachyOS `7.2/hdmi` (all 27 apply cleanly to 7.2.0) |
| Committed stream | RGB 12-bpc, DSC 12.0 bpp, ODM 2:1, BT.2020 full range, HDR on, FRL rate 4 |

The sink is correctly classified by the series:

```
[CONNECTOR:415:HDMI-A-2] VRRmin: 48, VRRmax: 240, VRR supported: yes
[CONNECTOR:415:HDMI-A-2] FAPA in blanking: no, ALLM support: yes, Fast Vactive support: no
```

## 1. The good news: patches 01-12 fix VRR detection under FRL

Stock 7.2.0-rc5 with `dcfeaturemask=0x402` reports the connector as
**`Vrr: incapable`**. With the series applied but HDMI-VRR classification
disabled (see build C below), the same link on the same cable reports
**`Vrr: Always`** and FreeSync engages.

So the early parsing/refactor patches — "Always try to parse AMD vsdb", "Check
for VRR range in CEA AMD vsdb", "Use bigger VRR range if found in AMD vsdb",
"Separate DP/eDP and PCON paths completely" — repair legacy
FreeSync-over-HDMI detection on an FRL link, which stock 7.2 gets wrong. That
is a clear improvement and is independent of everything below.

## 2. The gradient: three builds, three failure modes

| build | HDMI-VRR (VTEM) path | result |
|---|---|---|
| **A** full series | active, plus `f402ff76a` forcing `freesync_on_desktop` | 5120x1440@240 **refused outright** — sink OSD "Mode Not Supported" |
| **B** minus `f402ff76a` | active | mode comes up, then link **dies permanently** ~0.4 s after `VRR off->on`; sink shows NO SIGNAL; only a monitor power-cycle recovers |
| **C** minus `f402ff76a`, HDMI-VRR classification disabled | not taken; legacy AMD-VSDB path used | link **stays up** at 240 Hz. `Vrr: Always` = steady faint VA-style brightness flicker on motion. `Vrr: Automatic` = ~1 s full black-drop-and-recover on each VRR engage/disengage |

Build C's edit is one token, neutralising `6a58fd84f` for this connector
without reverting it (a mechanical revert conflicts with 21/24/25/26):

```c
/* amdgpu_dm_update_freesync_caps(), HDMI branch */
-           if (hdmi_vrr.supported) {
+           if (0 && hdmi_vrr.supported) {
                  amdgpu_dm_connector->as_type = ADAPTIVE_SYNC_TYPE_HDMI;
```

**Reading:** the common factor is a **VRR state change on this sink over
FRL+DSC**, not VTEM specifically. VTEM signalling makes it fatal; the legacy
FreeSync path makes it a recoverable ~1 s glitch. Steady VRR is survivable;
transitions are not.

## 3. Build A's specific defect: VRR entered on an inactive stream

In build A the CRTC is switched into VRR while the freesync module still
reports VRR off:

```
amdgpu_dm_handle_vrr_transition: crtc=376 VRR off->on: Get vblank ref
update_freesync_state_on_stream: VRR packet update: crtc=376 enabled=0 state=2
```

`state=2` is `VRR_STATE_INACTIVE`, `enabled=0` is
`mod_freesync_get_freesync_enabled()`. The chain:

```c
/* f402ff76a "Force freesync_on_desktop for HDMI" */
if (dc_is_hdmi_signal(new_stream->signal))
        new_stream->freesync_on_desktop = true;      /* unconditional */

/* ddf48d91e "freesync_on_desktop support for HDMI VRR" (v4 22/27) */
if (stream->freesync_on_desktop)
        vrr_active |= vrr->state == VRR_STATE_INACTIVE;
```

`f402ff76a` sets the flag for every HDMI stream with no check on `as_type`, on
sink VRR support, or on whether signalling will be sent; `ddf48d91e` then
promotes `vrr_active` *because* the state is INACTIVE. Removing `f402ff76a`
(build B) makes the transition coherent — `enabled=1 state=3` — and the
incoherence is gone. It did not save the link, but it is a real defect on its
own and `f402ff76a` is not in the v4 posting.

## 4. Robustness issue, independent of root cause: no way out of VRR

**Scope: this is a build-A/B (HDMI-VRR path) observation only.** On build C's
legacy path the transition reverses normally — a 360 s capture shows a clean
`VRR off->on` at t=1163.5 and a matching `VRR on->off: Drop vblank ref` at
t=1508.5. So the stuck state is specific to the HDMI-VRR path, not to VRR in
general.

Across two build-B boots there is exactly **one** `VRR off->on` transition and
never a matching `on->off`, for the remaining ~230 s of uptime. Every later
modeset — including a full `link_set_dpms_off` / retrain cycle that trained
successfully at FRL rate 5, and a connector re-probe via
`echo detect > .../status` — ran with VRR still active. Neither recovered the
display.

On a sink that cannot cope with VRR under FRL+DSC, that turns a recoverable
glitch into "power-cycle the monitor". Some path back to non-VRR on repeated
commit failure, or on a connector re-probe, would help.

## 5. Observability gaps that made this hard to diagnose

Working this out took several instrumented boots, mostly because the
interesting code paths are silent:

- `build_vtem_infopacket()` — no `DC_LOG`/`drm_dbg` at all. "Zero VTEM lines"
  in a trace means nothing.
- `verify_link_capability_non_destructive()` — likewise silent, so the
  "FRL cap clobbered on non-destructive verify" hypothesis
  (`[PATCH 31/34] DC Patches Aug 10 2026`) can be neither confirmed nor
  excluded from logs.
- No FRL or DSC debugfs for HDMI connectors: `connector_debugfs_init()` gives
  `DRM_MODE_CONNECTOR_HDMIA` only `hdcp_sink_capability` and `hdmi_cec_state`;
  the `dsc_*` files are gated on DisplayPort/eDP. There is no way for a user to
  read back the negotiated FRL rate, whether DSC engaged, or at what bpp.

A `DC_LOG_INFOPACKET` in the VTEM builder and an HDMI equivalent of the DP
`dsc_*` debugfs files would each have saved a reboot cycle here.

## 6. Separately: DSC 10-bpc sink capability is discarded

Not part of this series — present in stock 7.2 — but found while chasing the
above, and it touches the same code. Two stacked `if/else if` chains collapse
the HF-VSDB DSC bit-depth mask to a single value, so a sink advertising both
10 and 12 bpc is presented to DC as 12-bpc-only, and a 16-bpc-capable sink ends
up 8-bpc-only. Details in a separate mail.

## 7. The build-C black-drop involves no link event

A 360 s `dmesg --follow` capture at `drm.debug=0x06` (DRIVER|KMS), covering a
witnessed ~1 s black-drop, contains **zero** matches for
`frl|link_set_dpms|link_detect|detect_link|verify_link|training|retrain|hpd|*ERROR*`.
Not one, in 11,361 lines over six minutes.

What it does contain, at the moment of the drop:

```
[1508.490017] amdgpu_dm_handle_vrr_transition: crtc=376 VRR on->off: Drop vblank ref
[1508.490142] update_freesync_state_on_stream: VRR packet update: crtc=376 enabled=0 state=2
```

followed by ~2.3 s of depressed atomic-commit rate and then a catch-up burst:

```
commits per 0.25 s:  t=1508.5 -> 24   1509.0 -> 17   1509.75 -> 17   1510.5 -> 29
                     t=1510.75 -> 330  1511.0 -> 249  1511.25 -> 361
```

So the drop coincides with **VRR disengage**, and the source does not
renegotiate the link across it — no retrain, no DPMS cycle, no re-detect, no
HPD, no error. On this evidence the blanking looks sink-side: the panel bailing
on a refresh-rate excursion rather than the source dropping the link. That also
fits the symptom gradient — steady VRR on `Vrr: Always` produces continuous
VA-style brightness flicker rather than blanking, i.e. the same panel behaviour
at lower amplitude.

The only other activity in the window is idle-power-state churn
(`dc_allow_idle_optimizations_internal`, 55 enter / 54 exit across the capture),
which tracks mouse activity throughout and is not clustered at the drop.
`HardMinUClk_Khz` and `HardMinDramclk_Khz` are 0 for the entire capture, so no
clock-floor reprogramming is involved.

Caveat: `0x06` covers DRIVER and KMS. DC's internal logger and DMUB firmware are
separate and could still hold something. But FRL training, link detect and DPMS
transitions all log under DRIVER — they appear in every other trace we took — so
their absence here is meaningful rather than a gap in coverage.

## Open / not established

- Whether the sink-side reading is right. It is inference from the absence of
  source-side link events plus the flicker/blank symptom gradient, not a
  positive measurement of what the panel did.
- Whether DC-internal or DMUB logging would show anything at the drop.
- Whether the "FRL failed to train, TMDS only until a monitor power-cycle" event
  seen once on stock rc5 shares a mechanism. That boot was untraced; there is no
  signature to compare.
- Whether `[PATCH 31/34] restore FRL cap on non-destructive HDMI link verify`
  (DC Patches Aug 10 2026) is relevant. It applies cleanly to 7.2 and fixes a
  real clobber, but `verify_link_capability_non_destructive()` is silent, so it
  can be neither confirmed nor excluded from logs. The successful FRL rate-5
  retrain during build B's dead-link period argues the cap was intact.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.