Re: [REGRESSION 7.3] drm/amd/display: single-frame scanout corruption on DCN32 at 120 Hz since a637a140ab86
From: Mikhail Gavrilov
Date: Sat Sep 19 2026 - 16:08:32 EST
Following up on my own correction: the attribution to a637a140ab86 is back,
and this time on a comparison that does not have the flaw the first one had.
In my previous mail I withdrew the 90x figure because the rate turned out to
depend on the machine's recent load and my two runs had not controlled for
it. I have now measured the commit against its immediate parent, in matched
conditions, and the difference is there without that confound.
parent 1d8327353de6 ("drm/amd/display: Fix VABC Init and OLED Support")
commit a637a140ab86 ("drm/amd/display: Allocate DCN32/1 dmub memory to GTT")
Same machine, same display, same 3840x2160@120 mode, same .config, ordinary
desktop use, no game in either run, about eleven hours each:
parent commit
observation 11.0 h 11.6 h
eligible frames 3,019,571 3,632,444
events 7 293
per 1000 eligible 0.0023 0.0807
95% interval 0.0006-0.0040 0.0714-0.0899
That is 35x, with the intervals more than a decade apart.
"Events" counts only frames where all three CRC registers moved, which is
what the artefact does. The single-frame content flicker that moves only
the luma CRC serves as a built-in control, and it did not move with the
kernel: 0.0020 per 1000 on the parent against 0.0008 on the commit.
The load confound does not reach this
-------------------------------------
Both runs began immediately after a reboot, which resets the state, and
neither had any load yet in its first hour:
parent : 0 events in 434,204 eligible frames
commit : 52 events in 349,718 eligible frames (0.149 per 1000)
So the difference is present before anything could have excited it.
The shape differs too, not only the rate. On the parent the worst
five-minute bucket in eleven hours contained 2 events, and no bucket
reached 3. On the commit the worst contained 30, and 28 of 138 buckets
reached 3 or more: the excited state comes and goes by itself there, and
on the parent it never appeared at all.
For completeness: the commit run does contain three windows where almost no
frame was eligible - roughly 14:30-15:25, 21:10-21:25 and 23:45-23:55 -
which is what fullscreen content looks like in this data, and the parent run
has no such window. The first-hour figures above are free of that, and the
rate is normalised per eligible frame throughout, but I would rather point
it out than have it found.
What this does and does not settle
----------------------------------
It restores a637a140ab86 as the point where this starts on DCN3.2. What I
said in the correction about the state machine still holds and is
independent of it: heavy GPU load excites the artefact, a long spell at
60 Hz or a reboot calms it, and DTN snapshots in the excited state are
byte-identical to quiet-state ones. Those were measured on kernels that
already contain the commit; the parent simply never leaves the quiet state.
I still have no mechanism. The commit moves every DMUB FB window out of
VRAM into GTT, and I cannot see how that produces one corrupted scanout
frame while leaving every register in the DTN dump unchanged.
The GitLab issue has been updated with the same numbers:
https://gitlab.freedesktop.org/drm/amd/-/work_items/5714
#regzbot introduced: a637a140ab86
Thanks,
Mikhail Gavrilov