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.

Reply via email to