dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] drm/msm/dpu: glymur (DPU 12.2) second DSC block at +0x84000?
@ 2026-10-23 18:39 Christian Cortner
  0 siblings, 0 replies; only message in thread
From: Christian Cortner @ 2026-10-23 18:39 UTC (permalink / raw)
  To: dri-devel, linux-arm-msm
  Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
	Sean Paul, Marijn Suijten

Hello,

This is a question about DPU 12.2 (glymur / Snapdragon X2E) rather than a
patch. Short version: on the internal eDP panel, DSC over the DP interface
gets as far as the sink accepting the stream and displaying nothing, and the
vendor's shipping Windows driver suggests the DPU has a DSC register block
that dpu1 does not model. I would like to know whether that block exists,
and if so how it is clocked.

Platform -------- ASUS Zenbook A16 UX3607OA, glymur / X2E, DPU 12.2
(catalog/dpu_12_2_glymur.h). Panel: samsung,atna33xc20, 2880x1800, 10 bpc,
120 Hz, eDP. Link: 4 lanes, HBR3 (810000). DSC 1.2, 2 slices of 1440,
slice_chunk 1440, target 8 bpp. Tree: 7.3-rc based, with a local DP+DSC
implementation (upstream has no DP+DSC path).

What is verified, so it is not the DP layer
-------------------------------------------
  - PPS packed and written to 0x184..0x1fc, byte-identical to what the
  vendor Windows driver writes on the same machine (HB 0x7f1000, per-byte
  ECC parity, 22 PPS words, 7 parity words).
  - COMPRESSION_MODE_CTRL (link block +0x180) written; read-back matches
  the written value, so +0x180 is the right register on this silicon.
  - DTO programmed (count = pclk_per_line; ratios 1/3, 8/30 and 5/12 all
  tried).
  - Data width 480 / 960 / 1440 tried; common mode with and without
  MULTIPLEX.
  - Sink accepts: DPCD 0x160 reads back 0x01 after enable.
  - DPU side reports compression active: 2 DSC blocks, common_mode 0x7,
  bpc 10, bpp 8, CTL_DSC_ACTIVE set.
  - Panel stays dark; the compositor re-prepares DSC 148-264 times per
  boot (12 measured boots, median 169).

What the vendor driver does --------------------------- Target:
qcdxkm8480.sys, PE ARM64, sha256
cc4c7ff9d09bb3aabb46e24937a66a6d927f28d0189e7517d5f53afa9e98afe7 - the
display KMD shipped for this exact machine. Decompiled with Ghidra.

  Its DSC page writes (FUN_1401ce660, called from FUN_1401c2508):

      0x000  read-modify-write, mask 0xffffffc0, 6 bits  -> COMMON_MODE
      0x004  one enable bit                              -> ENC
      0x008  value selected BY LINK RATE                 -> PICTURE
             RBR 162000 -> 0x300, HBR 270000 -> 0x301,
             HBR2 540000 -> 0x202, HBR3 810000 -> 0x103
      0x00C  written                                     -> SLICE
      0x044, 0x074, 0x084                             -> RC thresh / QP

  That is the v1 map in dpu_hw_dsc.c (COMMON_MODE 0x00, ENC 0x04, PICTURE
  0x08, SLICE 0x0C, RC_BUF_THRESH 0x3C.., RANGE_MIN_QP 0x74). The vendor
  driver writes nothing at 0x30/0x34/0x38, which are DSC_MAIN_CONF /
  DSC_PICTURE_SIZE / DSC_SLICE_SIZE in the v1.2 map.

What we measured on our side ----------------------------
  - Our encoder binds dpu_hw_dsc_init_1_2 with the sm8750 sub-block
  layout: enc 0x100 / 0x200, ctl 0xF00 / 0xF80, CMN_MAIN_CNF at 0x000. At
  runtime both DSC blocks sit on MDP+0x80000 with enc sub-blocks 0x100 and
  0x200.
  - Writing 0x004 / 0x008 on that page and reading them back returns
  0x00000000: those offsets are holes on the page we program, so the
  registers the vendor driver writes are not on our DSC page.
  - MDP+0x84000 and +0x85000 are inside the mapped DPU window (mdp:
  0xae01000, size 0x93000) but no catalog entry, for any SoC in the tree,
  describes a block there; the DT declares only "mdp" and "vbif".
  - A read at MDP+0x84000 hangs the machine - no panic, no log, just a bus
  stall - which is the usual symptom of touching a block whose clock/power
  domain is off.
  - Neither our dispcc nor the vendor's dispcc-glymur has a DSC-specific
  clock, so gating would have to go through DISP_CC_MDSS_CORE_GDSC or an
  MDP power domain.

Questions ---------
  1. Does DPU 12.2 in glymur have a second DSC encoder (or a v1-style DSC
  register block) at MDP+0x84000 / +0x85000 that the "dce" blocks do not
  describe?
  2. If yes, what enables it (clock, GDSC, power domain) and what is its
  register layout?
  3. If no, is the v1.2 "dce" block the engine that actually feeds
  INTF_DP, and is there a documented block-to-pingpong pairing for DP that
  we are missing?

I can supply register dumps, the decompiled snippets above, or any logs, and
I am happy to test a patch that models the block if someone can tell me what
it is.

Thanks,
Christian

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-10-24 22:59 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-23 18:39 [RFC] drm/msm/dpu: glymur (DPU 12.2) second DSC block at +0x84000? Christian Cortner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox