On Tue, 13 Oct 2026 at 08:07, Finn Zeruhn <[email protected]> wrote: > > When aux->no_zero_sized is set, drm_dp_i2c_xfer() cannot use a bare > address packet to close the transaction, so it clears MOT on the last > data packet instead. The check only looks at the position within the > current i2c_msg, so MOT is cleared at the end of every message and each > one is terminated by an I2C stop. > > This breaks E-DDC reads of EDID blocks 2 and up. Those are read as three > messages: a write of the segment pointer to 0x30, a write of the offset > to 0x50, and the read. The stop after the first message resets the > segment pointer, so the read returns segment 0 again. > > On a Pimax Dream Air (three EDID blocks, native timings in a DisplayID > extension in block 2) connected to an RTX 5070 Ti with nouveau, block 2 > reads back as a copy of block 0. The checksum is valid, so nothing is > reported, and the connector only offers fallback modes. > > Clear MOT only on the last packet of the last message, as the commit > that added the option describes. Trailing messages without data are > skipped when looking for that packet, since nothing is sent for them > and the stop would otherwise be lost. With this, block 2 reads > correctly and the native 7104x3840 modes are listed for the Dream Air. > > The same problem was pointed out by the Sashiko review of the patch that > sets no_zero_sized for all DisplayPort connectors in nouveau. > > Fixes: f0ddbb1eed18 ("drm/dp: add option to disable zero sized address only > transactions.") > Link: https://lore.kernel.org/all/[email protected]/ > Cc: [email protected] > Assisted-by: Claude:claude-opus-5-5 > Signed-off-by: Finn Zeruhn <[email protected]>
I've applied this to drm-misc-fixes. Dave.
