Files
rk3588-ddr-analysis/POLL_SITE_MAP.md
T
marfrit be59c91707 POLL_SITE_MAP.md: per-site register identification with TRM cross-reference
Decoded all 16 poll sites against RK3588 TRM Part 2 where possible:
  - 1 site (site 3) polls DDRCTL_DFISTAT (vendor-canonical, TRM-named)
  - 4 sites (2,4,5,7) poll DDRCTL + 0x10014 — likely STAT.operating_mode
    per generic DWC uMCTL2 convention; TRM cross-ref TBD
  - 11 sites are DWC PUB / Innosilicon PHY — still RE-only (TRM does
    not republish the PHY register map)
  - 1 unusual site (site 10) polls absolute 0xff000024 in SRAM_BOOT
    region — possibly a BL2 handoff word, not a PHY poll. Flagged for
    special treatment in the v3fb bisection plan.

Known tensions documented:
  - Site 3's DFISTAT test uses bits[2:1] (mask 0x6), generic uMCTL2 has
    only bit[0] defined there → RK3588 likely extends DFISTAT with
    vendor-specific bits. Need to verify from TRM bit tables.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 08:41:36 +02:00

82 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Poll-site → register map (RK3588 DDR v1.19)
Each of the 16 timeout-less poll sites in the v1.19 stock conservative
blob, decoded against the RK3588 TRM Part 2 (Ch. 2, DMC) where
possible. Sites without TRM coverage are Synopsys DWC PUB registers —
not republished by Rockchip; names ending in `(RE)` are our educated
guesses from the code context.
Site index comes from `patch_timeouts_v3.py` (ascending-offset order
after `find_poll_loops()`).
## Early cluster (sites 07): 0x07b78..0x07f08
| # | branch @ | body | load | addr (symbolic) | register | src |
|---|---------|------|------|-----------------|----------|-----|
| 0 | 0x07b78 | 2 | `ldr w1, [x0+0x114]` on x0=PHY+0x20000 | PHY + 0x20114 | `PHY_TRAIN_INTERLOCK_114` (RE) | — |
| 1 | 0x07ba4 | 2 | `ldr w1, [x26+0xb88]` where x26=PHY+0x10000 | PHY + 0x10b88 | `PHY_SHADOW_BB8` (RE) | — |
| 2 | 0x07c8c | 3 | `ldr w0, [x1+0x14]` where x1=DDRCTL+0x10000 | **DDRCTL + 0x10014** | `DDRCTL_PWRCTL`? (TBD — 0x14 offset in uMCTL2 is typically PWRCTL or STAT) | TRM (partial) |
| 3 | 0x07ca8 | 2 | `ldr w1, [x0+0x514]` where x0=DDRCTL+0x10000 | **DDRCTL + 0x10514** | **DDRCTL_DFISTAT** `dfi_init_complete` | **TRM Part 2 Ch.2** |
| 4 | 0x07cd4 | 3 | `ldr w0, [x1+0x14]` same pattern as site 2 | DDRCTL + 0x10014 | same as #2 | TRM (partial) |
| 5 | 0x07ce8 | 3 | same +0x14 load, different mask | DDRCTL + 0x10014 | same as #2 | TRM (partial) |
| 6 | 0x07d0c | 3 | `ldr w0, [x26+0xb88]` where x26=PHY+0x10000 | PHY + 0x10b88 | `PHY_SHADOW_BB8` (RE) — same reg as site 1, different mask | — |
| 7 | 0x07f08 | 3 | `ldr w1, [x0+0x14]` same DDRCTL family | DDRCTL + 0x10014 | same as #2 | TRM (partial) |
## Mid cluster (sites 810): 0x09124..0x0aaf8
| # | branch @ | body | register | src |
|---|---------|------|----------|-----|
| 8 | 0x09124 | 3 | DDRCTL + (via x27) — needs further context trace | — |
| 9 | 0x0aa84 | 3 | DDRCTL + (via x24) — ditto | — |
| 10 | 0x0aaf8 | 3 | abs `0xff000024` per decoder — **SRAM mirror of a GRF?** non-obvious | — |
**Site 10 is unusual** — absolute `0xff000024` is in the SRAM_BOOT
region, not a controller or PHY block. Possibly a BL2 handoff word
the blob waits on before continuing. Worth its own trace.
## Late cluster (sites 1115): 0x0d154..0x0d378
| # | branch @ | body | register | src |
|---|---------|------|----------|-----|
| 11 | 0x0d154 | 3 | `ldr w5, [x0+0x14]` where x0=PHY+0x10000 → **PHY + 0x10014**, test `&0x7 == 1` | `PHY_STATE_014` (RE) — wait for state 1 | — |
| 12 | 0x0d340 | 2 | `ldr w1, [x0+0x118]` where x0=PHY+0x8000 → PHY + 0x8118 | `PHY_STAT_A_118` (RE) — train_phy_block | — |
| 13 | 0x0d34c | 2 | `ldr w1, [x0+0x120]` → PHY + 0x8120 | `PHY_STAT_B_120` (RE) | — |
| 14 | 0x0d364 | 2 | `ldr w1, [x0+0x184]` → PHY + 0x8184 | `PHY_HANDSHAKE_184` (RE, ack assert) | — |
| 15 | 0x0d378 | 2 | `ldr w1, [x0+0x184]` → PHY + 0x8184 | `PHY_HANDSHAKE_184` (RE, ack deassert) | — |
## Summary by coverage
- **TRM-documented (vendor-canonical names):** 1 site (site 3 — DDRCTL_DFISTAT).
- **TRM-documented family (0x14 offset in uMCTL2 space, exact register TBD):** 4 sites (2, 4, 5, 7).
- **DWC PUB / Innosilicon PHY — undocumented, RE names only:** 11 sites.
## Known tensions
1. **Site 3 tests DFISTAT bits[2:1] (mask 0x6), not bit[0].** Generic
uMCTL2 DFISTAT has only bit[0] defined (`dfi_init_complete`); bits
1+ are reserved. RK3588's blob treating bits[2:1] as meaningful
suggests Rockchip extended the DFISTAT register with vendor-specific
bits. Worth checking TRM bit tables for DFISTAT directly.
2. **Sites 2/4/5/7 all poll DDRCTL + 0x10014** with different bit
masks (&0x7==1, &0x7==3, &0x30==0x20, &0x7==3). At offset +0x14 in
uMCTL2 is `STAT` (Operating Mode Status Register) per generic DWC
docs — `operating_mode[2:0]` field encodes: 0=Init, 1=Normal, 2=Power-down,
3=Self-refresh, 5=Deep-power-down, 6=Deep-power-down init. RK3588
probably follows this convention — these polls wait for the
controller to enter specific operating modes.
3. **Site 10 at absolute `0xff000024`** is suspect. That region is
SRAM_BOOT in our emulator map. Possibly a BL2 handshake word. If
so, patching this site to "bounded retry" is safe — worst case
we skip one BL2 handoff. Should flag this separately.
## Action items
- Extract DFISTAT bit-field description from TRM Part 2 to confirm/deny
the RK3588 vendor extension hypothesis for site 3.
- Extract STAT (+0x14) bit-field description from TRM to confirm/deny
the "operating_mode" mapping for sites 2/4/5/7.
- Special-case site 10 in the bisection plan — it's not a normal PHY
poll and may need different treatment.