[PATCH v2 00/10] nouveau: assorted display fixes (GB20x, r570 DP_CONFIG_STREAM, HF-EEODB EDIDs)

From: Mohamed Ahmed

Date: Thu Aug 20 2026 - 13:31:00 EST


Several fixes for GSP-driven displays consisting of four independent
groups. These were created as part of ongoing HDMI 2.1 bring up and
display handling clean-up work, so some of them are not issues now
(e.g., the 2.147GHz pixel clock cap) but fixing them is required to get
advanced features such as FRL, DSC, VRR, etc working properly.

The v1 review asked for the RM vs register programming split to be made
explicit instead of growing more per-chip code inside the RM layer, so
patches 1-3 do that first. No functional change, and then each GB20x fix
(patches 4-8) supplies its hook from a new engine/disp/gb202.c.

Changes in v2:
- Rebased onto drm-misc-next.

- New patches 1-3: move the GSP path's direct MMIO helpers to
engine/disp/ and route them through a per-chip nvkm_disp_func.gsp hook
table. GB20x now has its own gb202_disp_new() instead of display-class
checks in rm/r535/disp.c.

- Patch 4 (was 1+2): merged. Dropped a stray .frl_train reference that
broke the build, no longer drops .scdc, and fixed an undefined shift
when packing byte 3 of each infoframe data word.

- Patch 5 (was 3): the GCP subpack write is now a masked write so
SB1_CTRL keeps its hardware-controlled default.

- Patch 6 (was 4): the vcpi hook returns its control status like the
other RM API entries instead of WARN_ONs under the HAL.

- New patch 7: the head-state readback fix is split out. The core channel
state mirror uses a 0x800 per-head stride on GB20x, fixing scanout pos
and timings readback for heads >= 1.

- Patch 8 (was 5): reworked onto the new hook table. The low-latency
vector is exposed as a second DISP interrupt instance by the r570
engine index translation and re-armed after servicing.

- Patch 9 (was 6): the two HI methods are pushed as one method pair, and
the class-header defines stay offset-sorted.

- Patch 10 (was 7): OF EDIDs now go through drm_edid_connector_update(),
and all firmware provided EDIDs (OF, ACPI, VBIOS embedded) are
validated with drm_edid_valid(). ACPI reads are bounded by the length
_DDC actually returned. Fixed a runtime-PM reference leak when the RM
EDID read fails. No raw struct edid is kept anymore and all the old
raw struct edid consumers are converted to the new API (the SPWG
dual-link byte is cached at EDID-set time as there is no new drm API
alternative for it). get_modes() re-syncs the EDID property only when
the probe helper cleared it.

- Commit messages reworded throughout.

Link to v1:
https://lore.kernel.org/all/20260814235705.59132-1-mohamedahmedegypt2001@xxxxxxxxx/


Mohamed Ahmed (10):
drm/nouveau/disp: move GSP head-timing ISR and vblank helpers to
tu102.c
drm/nouveau/disp: move the GSP HDMI GCP AVMute write to engine/disp
drm/nouveau/disp: route GSP-RM display MMIO through nvkm_disp_func
hooks
drm/nouveau/disp: fix HDMI vendor infoframes on GB20x
drm/nouveau/disp: fix HDMI GCP AVMute register offsets on GB20x
drm/nouveau/gsp: use per-version DP_CONFIG_STREAM params on r570
firmware
drm/nouveau/disp: fix head state readback on GB20x
drm/nouveau/gsp: fix vblank interrupts on GB20x
drm/nouveau/dispnv50: program pixel clocks above 2.147GHz on GB20x
drm/nouveau: honor HF-EEODB EDIDs by converting to struct drm_edid

drivers/gpu/drm/nouveau/dispnv04/dfp.c | 5 +-
drivers/gpu/drm/nouveau/dispnv50/disp.c | 4 +-
drivers/gpu/drm/nouveau/dispnv50/headca7d.c | 21 +-
.../drm/nouveau/include/nvhw/class/clca7d.h | 4 +
.../drm/nouveau/include/nvkm/engine/disp.h | 1 +
drivers/gpu/drm/nouveau/nouveau_acpi.c | 21 +-
drivers/gpu/drm/nouveau/nouveau_acpi.h | 10 +-
drivers/gpu/drm/nouveau/nouveau_connector.c | 147 ++++++++++----
drivers/gpu/drm/nouveau/nouveau_connector.h | 12 +-
.../gpu/drm/nouveau/nvkm/engine/device/base.c | 10 +-
.../gpu/drm/nouveau/nvkm/engine/disp/Kbuild | 1 +
.../gpu/drm/nouveau/nvkm/engine/disp/ga102.c | 16 +-
.../gpu/drm/nouveau/nvkm/engine/disp/gb202.c | 192 ++++++++++++++++++
.../gpu/drm/nouveau/nvkm/engine/disp/head.h | 3 +
.../gpu/drm/nouveau/nvkm/engine/disp/ior.h | 1 +
.../gpu/drm/nouveau/nvkm/engine/disp/priv.h | 20 ++
.../gpu/drm/nouveau/nvkm/engine/disp/tu102.c | 81 +++++++-
.../nouveau/nvkm/subdev/gsp/rm/r535/disp.c | 121 ++++++-----
.../nouveau/nvkm/subdev/gsp/rm/r570/disp.c | 64 ++++++
.../drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c | 9 +
.../nvkm/subdev/gsp/rm/r570/nvrm/disp.h | 2 +
.../gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h | 5 +
22 files changed, 637 insertions(+), 113 deletions(-)
create mode 100644 drivers/gpu/drm/nouveau/nvkm/engine/disp/gb202.c

--
2.55.0