Re: [PATCH i-g-t v2] tests/kms_plane: Remove redundant CRC frame sequence check

Jason-JH Lin (林睿祥) <[email protected]>
Newsgroups org.freedesktop.lists.igt-dev
Message-ID <[email protected]>
On Fri, 2026-08-14 at 13:57 +0300, Juha-Pekka Heikkilä wrote:
> 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
> 
> 
> Hi Jason-JH,
> 
> On 14/08/2026 05.46, Jason-JH Lin (林睿祥) wrote:
> > On Thu, 2026-08-13 at 14:07 +0300, Juha-Pekka Heikkilä wrote:
> > > 
> > > External email : Please do not click links or open attachments
> > > until
> > > you have verified the sender or the content.
> > > 
> > > 
> > > Hi,
> > > 
> > > On 13/08/2026 06.37, Karthik B S wrote:
> > > > Hi Jason-JH,
> > > > 
> > > > On 8/11/2026 9:44 PM, Jason-JH Lin wrote:
> > > > > The capture_crc() function validated that the CRC frame
> > > > > sequence
> > > > > returned by igt_pipe_crc_get_for_frame() matches the expected
> > > > > value.
> > > > > However, igt_pipe_crc_get_for_frame() already guarantees
> > > > > crc->frame >= expected via its internal loop:
> > > > > 
> > > > >      do {
> > > > >          read_one_crc(pipe_crc, crc);
> > > > >      } while (igt_vblank_before(crc->frame, vblank));
> > > > This isn't fully true IMHO. The capture CRC function actually
> > > > ensured
> > > > the exact match of frame sequence and with this patch we're
> > > > just
> > > > guaranteeing '>='.
> > > 
> > > as Karthik said; the claim it not true. What this change would do
> > > is
> > > relax the sequence check to be open ended .. while current check
> > > is
> > > making exact expectation. In other words, we _expect_ to see
> > > certain
> > > crc
> > > with correct vblank number, with the proposed change if expected
> > > crc
> > > never arrived in correct sequence we would be unaware of it.
> > > 
> > > Let's not do this.
> > 
> > Hi JP,
> > 
> > Thanks for the review. Let me explain the background of this issue.
> > 
> > MediaTek CRC Internal Queue Mechanism:
> > MediaTek's DRM driver uses a per-commit CRC queue rather than
> > continuous frame-by-frame reporting. CRC entries are reported only
> > after the hardware pipeline has stabilized (3 vblanks after
> > commit),
> > and the frame number reflects the vblank count at the time of CRC
> > readout, not the original commit latch time.
> > 
> > For example, consider 4 consecutive flips:
> > 
> > Timeline:
> >    Frame 100: Flip 0 latches → ev.sequence=100
> >    Frame 101: Flip 1 latches → ev.sequence=101
> >    Frame 102: Flip 2 latches → ev.sequence=102
> >    Frame 103: Flip 3 latches → ev.sequence=103 (last flip)
> > 
> > Queue reports CRCs with 3-vblank delay:
> >    Frame 103: Reports flip 0 CRC → frame=103
> >    Frame 104: Reports flip 1 CRC → frame=104
> >    Frame 105: Reports flip 2 CRC → frame=105
> >    Frame 106: Reports flip 3 CRC → frame=106
> > 
> > PlaneTest expected vblanks:
> >    vblank[0] = 101  (flip 1's ev.sequence, for flip 0's CRC)
> >    vblank[1] = 102  (flip 2's ev.sequence, for flip 1's CRC)
> >    vblank[2] = 103  (flip 3's ev.sequence, for flip 2's CRC)
> >    vblank[3] = 103 + 1 = 104  (last frame)
> > 
> > capture_crc checks (== exact match):
> >    flip 0: expected=101, got=103 → 103 != 101 → FAIL
> >    flip 1: expected=102, got=104 → 104 != 102 → FAIL
> >    flip 2: expected=103, got=105 → 105 != 103 → FAIL
> >    flip 3: expected=104, got=106 → 106 != 104 → FAIL
> > 
> > Library behavior:
> >    igt_pipe_crc_get_for_frame(expected=104) → returns CRC with
> > frame=106
> >    Since 106 >= 104, the library considers this valid and returns
> > it.
> > 
> > The CRC value is correct (it corresponds to the right framebuffer
> > content), but the frame number is larger than expected due to the
> > queue processing delay. This is an inherent characteristic of
> > hardware
> > that batches CRC reporting, and does not indicate data corruption
> > or
> > buffer overflow.
> > 
> 
> that's all MediaTek specific behavior. It doesn't change the fact
> that
> this check you are trying to remove is what catches wrong-frame crcs
> for
> every other driver too.
> 

I understand your point that the strict == check is crucial for other
drivers to correctly detect wrong-frame CRCs, and removing it entirely
would break that correctness verification for them.

> > 
> > Consistency with other IGT tests and library contract
> > 
> > Looking at how other tests handle igt_pipe_crc_get_for_frame():
> > 1. kms_rotation_crc also calls igt_pipe_crc_get_for_frame() but
> > does
> > NOT validate that crc.frame == expected. It only compares CRC
> > values
> > between software and hardware rotated frames
> > (igt_assert_crc_equal).
> > 2. kms_pipe_crc_basic (read-crc-frame-sequence subtest) validates
> > that
> > consecutive CRCs have frame + 1 == next_frame (relative increment),
> > but does NOT validate absolute match against an expected vblank
> > count.
> > 3. The library API igt_pipe_crc_get_for_frame() is explicitly
> > designed
> > with >= semantics:
> > do {
> >      read_one_crc(pipe_crc, crc);
> > } while (igt_vblank_before(crc->frame, vblank));
> > Its contract is "return the first CRC at or after the requested
> > frame."
> > No other caller in IGT adds a stricter == check on top of this.
> > 
> > The capture_crc() exact-match check in kms_plane is the only place
> > in
> > the entire IGT codebase that imposes a stricter requirement than
> > the
> > library's own API contract. This makes it incompatible with drivers
> > that use queued CRC reporting, while the actual CRC validation
> > (comparing pixel content) remains correct.
> > 
> > Given that the library's API contract is >=, and no other caller
> > enforces ==, what would be the preferred approach here?
> 
> The "no other test does ==" argument doesn't apply here either. Other
> tests don't reconstruct per-frame crc/vblank mapping the way this
> test
> does, so they don't need it. This one does.
> 
> Disable the check for MediaTek specifically if you don't want to care
> about this check (e.g. is_mtk_device() like other mtk workarounds
> already in this file), don't remove a correctness check that other
> drivers rely on.
> 
> /Juha-Pekka

I agree with your suggestion to make this a MediaTek-specific
skip. We will update the patch to use is_mtk_device()
and only skip the check for MediaTek devices. This preserves the
strict == correctness check for other drivers while allowing our
queued CRC reporting mechanism to pass on MTK hardware.

Thanks,
Jason-JH Lin
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.