NVIDIA / NVIDIA/open-gpu-kernel-modules
DDC/CI over DisplayPort AUX channel becomes unusable after a single write transaction or after brief inactivity (RTX 3050 / Ampere, open kernel module 610.43.02)
Nobody has claimed this yet.
- Dominant language
- C
- Stars
- 17.4k
- Forks
- 1.9k
- PR merge metrics
- No merged PRs in 30d
Description
NVIDIA Open GPU Kernel Modules Version
Driver: 610.43.02, open kernel module (nvidia-open)
Please confirm this issue does not happen with the proprietary driver (of the same version). This issue tracker is only for bugs specific to the open kernel driver.
- I confirm that this does not happen with the proprietary driver package.
Operating System and Version
CachyOS (Arch-based)
Kernel Release
Linux 7.0.11-1-cachyos
Please confirm you are running a stable release kernel (e.g. not a -rc). We do not accept bug reports for unreleased kernels.
- I am running on a stable kernel release.
Hardware: GPU
NVIDIA GeForce RTX 3050 (Ampere)
Describe the bug
Summary
On an RTX 3050 (Ampere) using the open kernel module 610.43.02, DDC/CI communication over a DisplayPort-connected monitor exhibits two distinct, reproducible failure modes:
- Inactivity timeout — after a successful read, the I2C/DDC channel becomes unresponsive within a few seconds if no further I2C traffic occurs. A periodic read keeps it alive.
- Write kills the channel — a single DDC write (e.g. setting brightness via VCP
0x10) completes successfully (the monitor visibly changes and a follow-up read confirms the new value), but immediately afterward the channel is dead, even if a keep-alive read loop was active.
In both cases the only reliable way to restore the channel is to physically disconnect and reconnect the DisplayPort cable. A normal OS reboot is not sufficient to recover a channel that has entered the dead state.
Reads (EDID, VCP getvcp) on their own do not trigger the failure; only inactivity or a write does.
This is reproduced entirely with ddcutil talking directly to the kernel i2c-dev interface, so it is independent of any out-of-tree DDC driver.
System information
- GPU: NVIDIA GeForce RTX 3050 (Ampere)
- Driver: 610.43.02, open kernel module (
nvidia-open) - Driver userspace: matching
nvidia-utils610.43.02 - Kernels tested (both affected):
6.18.33(LTS)7.0.11
- Distro: CachyOS (Arch-based)
- Desktop / session: GNOME 50 on Wayland (Mutter)
- Connection: DisplayPort (DP-to-DP cable, native DP at both ends)
- Monitor: LG 27GS60F-B (reported as
LG ULTRAGEAR, EDID mfg idGSM), DDC/CI / MCCS 2.1 - CPU: Intel Core i3-9100F (no iGPU — single-GPU desktop, no hybrid/Optimus/PRIME involved)
- Tooling:
ddcutil2.2.7
The I2C adapter exposed by the driver for this connector is reported byddcutilas:
I2C bus: /dev/i2c-2
DRM_connector: card1-DP-1
/sys/bus/i2c/devices/i2c-2/name: NVIDIA i2c adapter 6 at 1:00.0
To Reproduce
Steps to reproduce
Prerequisite: a DisplayPort monitor that supports DDC/CI, ddcutil installed, and the user with read/write access to /dev/i2c-* (member of group i2c). i2c-dev is loaded.
Channel works immediately after a fresh DP connect
$ ddcutil detect
Display 1
I2C bus: /dev/i2c-2
DRM_connector: card1-DP-1
EDID synopsis:
Mfg id: GSM - LG Electronics
Model: LG ULTRAGEAR
VCP version: 2.1
Failure Mode 1 — channel dies after brief inactivity
$ ddcutil detect # succeeds
# wait ~5–10 seconds with no I2C traffic
$ ddcutil detect
No displays found.
A periodic read keeps the channel alive indefinitely:
$ watch -n 2 ddcutil getvcp 10 # channel stays responsive as long as this runs
Failure Mode 2 — a single write kills the channel
Reconnect the DP cable to restore the channel first, then:
$ ddcutil setvcp 10 80 && ddcutil setvcp 10 30 && ddcutil detect
# all three commands succeed; monitor brightness physically changes
Display 1
...
VCP version: 2.1
# immediately afterward:
$ ddcutil detect
No displays found.
Notes on the write behavior:
- Several commands chained back-to-back (
&&, no pause) all complete; the channel only enters the dead state after the sequence settles. - The write genuinely reaches the hardware: the panel brightness visibly changes, and a
getvcp 10issued in the same uninterrupted burst returns the newly written value. - A write kills the channel even when a keep-alive read loop is running, which is what distinguishes Failure Mode 2 from Failure Mode 1.
Recovery
- Physically unplugging and replugging the DisplayPort cable reliably restores a working channel.
- A full OS reboot does not reliably recover a channel that is already in the dead state; the physical re-handshake on the AUX channel appears to be what resets it.
What was investigated / ruled out
- Not an out-of-tree driver issue. The failure reproduces with
ddcutiloveri2c-devalone, with no DDC kernel driver bound to the bus. - Not kernel-version specific. Identical behavior on
6.18.33LTS and7.0.11, with the same driver. - Not hybrid graphics. This is a single-GPU desktop with an "F" CPU (no integrated graphics), so there is no Optimus/PRIME buffer hand-off in play.
RMUseSwI2cdoes not help. The legacy workaround was applied and confirmed active:
$ cat /etc/modprobe.d/nvidia-ddc.conf
options nvidia NVreg_RegistryDwords="RMUseSwI2c=0x01;RMI2cSpeed=100"
$ grep RegistryDwords /proc/driver/nvidia/params
RegistryDwords: "RMUseSwI2c=0x01;RMI2cSpeed=100"
With it set, both failure modes still occur (forcing software I2C and RMI2cSpeed=100 changes nothing observable here).
- Monitor-side quirks are separate. This particular panel returns a bad checksum on the 4th capabilities chunk (offset
0x60) when reading the full MCCS capability string, which is a monitor/firmware issue and orthogonal to the channel-death described here — the channel-death is observed with plaingetvcp/setvcp/detect, not just during capability reads.
Bug Incidence
Always
nvidia-bug-report.log.gz
More Info
Hypotheses (for triage — not confirmed)
The observed pattern is consistent with the DP-AUX I2C channel not being kept in a usable state between transactions:
- Failure Mode 1 looks like the AUX/I2C channel being torn down or going to a low-power state after a short idle period, with no transparent re-establishment on the next access.
- Failure Mode 2 looks like the post-write transaction cleanup leaving the channel in an inconsistent state (the write itself succeeds end-to-end, but the channel is not returned to a state that accepts the next transaction).
Because both can be worked around at the physical layer (cable replug) but not at the OS layer (reboot), the residual state appears to live below the OS — in the driver's AUX/I2C handling and/or GSP firmware.
The relevant I2C handling lives in kernel-open/nvidia/nv-i2c.c. It is worth noting that this file's transaction handler explicitly only supports a narrow set of operations (the code carries a comment to the effect of "we only support basic I2C reads/writes, reject any other commands"), and prior driver-side I2C bugs have been traced to that handler — see "Related" below.
Related
This may share a root area with previously reported NVIDIA I2C transaction-handling problems, even though the symptom is different:
- #41 ("NVIDIA I2C driver issues") — a long-standing driver-side I2C bug where reads worked but certain write transactions were mishandled (block transfers interpreted as word transfers / data read off by one byte). It was eventually fixed driver-side in R565 (565.57.01), then reportedly regressed again on at least one later branch. The pattern there — reads fine, writes mishandled, fix lives in the driver's I2C layer rather than in userspace — is the same shape as what is described here, which is why the I2C transaction path in
nv-i2c.cseems like the right place to look.
The present report is distinct from #41 (it is about the DDC/DisplayPort-AUX channel becoming unusable after a write or after inactivity, not about write payloads being corrupted), but they may stem from the same component.
Additional notes
- Happy to provide
nvidia-bug-report.shoutput on request. - Happy to test against a specific driver build or a proprietary (closed) module of the same version to confirm whether the failure is specific to the open kernel module path.
- Reproduction is 100% consistent on this setup.
- This report has also been sent to
linux-bugs@nvidia.comfor internal triage, as suggested for I2C-related issues in prior threads.
Contributor guide
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
The report identifies kernel-open/nv-i2c.c as the relevant transaction path. Start by reproducing both failure modes with ddcutil detect, getvcp, and setvcp over the listed DisplayPort setup, then inspect how the handler manages inactivity and completed writes. Done means both cases remain usable without a cable reconnect, with the reported read and write behavior validated again.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c, linux
- Domain
- operating-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100