Retract sibling's d328 register names — they addressed wrong sub-block
Previous commit committed sibling claims without verifying against
the TRM bit tables. Verification fails for d328:
Sibling: +0x110 = CAL_RD_VWML0 (from TRM §2.4.3).
Blob: writes 0xF000F000 to that offset.
TRM: CAL_RD_VWML0 is READ-ONLY, bits[9:0]=rd_vwml0 code, [25:16]=rd_vwml1.
Writing is a no-op.
Root cause of sibling's error: conflated 'DDRPHY_OPB + offset' with
d328's 'DDRPHY_OPB + 0x8000 + offset'. The +0x8000 sub-block is NOT
documented in the TRM; offsets 0x110/0x118/0x120/0x154/0x160/0x184
WITHIN that sub-block mean something different from CAL_RD_VWML0 etc.
Kept the TRM-verified names I DID check:
- DDRCTL_DFISTAT @ +0x10514 (site 3)
- DDRCTL_STAT @ +0x10014 (sites 2,4,5,7)
- DDRPHY_SCHD_TRAIN_CON0 @ +0xa24 — bit layout verified directly
Retracted names for d328's +0x8XXX accesses; restoring the PHY_CTL_110
etc. RE-guess labels as the safe fallback. True names remain unknown
until we get hardware-trace data or the Synopsys DWC PUB databook.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -138,3 +138,46 @@ and the six training sub-steps in step 6.
|
|||||||
- CSDN LPDDR5 series (DDR Study blog) turned out to cover JEDEC-layer
|
- CSDN LPDDR5 series (DDR Study blog) turned out to cover JEDEC-layer
|
||||||
protocol only; no register-level help. Useful background for training
|
protocol only; no register-level help. Useful background for training
|
||||||
phase names but not for our RE.
|
phase names but not for our RE.
|
||||||
|
|
||||||
|
## Correction 2026-04-15 late evening — sibling over-trusted
|
||||||
|
|
||||||
|
User pointed out I was applying sibling names without verification
|
||||||
|
("weights from browsing Instagram"). Going back to verify each, found
|
||||||
|
**the d328 register naming was wrong**:
|
||||||
|
|
||||||
|
- Sibling said `+0x110` in d328 = `DDRPHY_CAL_RD_VWML0` (per TRM).
|
||||||
|
- But the blob **writes** `0xF000F000` to that offset, and TRM lists
|
||||||
|
`CAL_RD_VWML0` as **READ-ONLY** with bits[9:0] carrying a
|
||||||
|
training-result code. Writes are no-ops; 0xF000F000 as a legit VWML
|
||||||
|
value makes no physical sense either.
|
||||||
|
- Reason sibling was confused: **d328's effective address is
|
||||||
|
`ctx->b8 + 0x8000 + offset`**, not `DDRPHY_OPB + offset`. TRM's
|
||||||
|
CAL_RD_VWML0 is at `DDRPHY_OPB + 0x0110`, not
|
||||||
|
`DDRPHY_OPB + 0x8110`.
|
||||||
|
- What's at `DDRPHY_OPB + 0x8000..0x8FFF`? TRM does not say. Only
|
||||||
|
chapters elsewhere in the TRM have 0x8xxx-offset registers (DPTX
|
||||||
|
PHY etc. — different peripherals, not DDR).
|
||||||
|
|
||||||
|
**What d328 really does:** we still don't know the semantic register
|
||||||
|
names for its +0x8110, +0x8118, +0x8120, +0x8154, +0x8160, +0x8184
|
||||||
|
accesses. The 0xF000F000 / 0x30003 / 0x30000 values suggest a custom
|
||||||
|
trigger/config/ack protocol of the +0x8000 sub-block, which is likely
|
||||||
|
a per-rank-shadow or per-slice mirror of DDRPHY's Master block —
|
||||||
|
but without docs, naming it would just be re-guessing.
|
||||||
|
|
||||||
|
**Still verified (hold):** the early-cluster + MID-cluster offsets
|
||||||
|
that access `ctx->b8 + 0x10000 + small` (i.e. the DDRCTL register
|
||||||
|
space):
|
||||||
|
|
||||||
|
- Site 3 @ 0x7ca8 → `DDRCTL + 0x10514` = **DDRCTL_DFISTAT** ✓ TRM-verified
|
||||||
|
- Sites 2, 4, 5, 7 → `DDRCTL + 0x10014` = **DDRCTL_STAT.operating_mode** ✓ TRM-verified
|
||||||
|
|
||||||
|
And at DDRPHY OPB + small (NOT the 0x8000 sub-block):
|
||||||
|
|
||||||
|
- `DDRPHY + 0xa24` = `SCHD_TRAIN_CON0` — I verified the full 32-bit
|
||||||
|
layout directly from TRM §2.4.3 before committing, so this one stands.
|
||||||
|
|
||||||
|
**Wrong/unsafe (retracted):** the `+0x8XXX` offsets in d328. Their
|
||||||
|
sibling-proposed names (`CAL_RD_VWML0` etc.) are TRM-registered at
|
||||||
|
`+0x0XXX`, not `+0x8XXX`, and the blob's write access patterns
|
||||||
|
contradict the read-only TRM bit definitions.
|
||||||
|
|||||||
@@ -175,6 +175,15 @@
|
|||||||
(TRM HIGH) */
|
(TRM HIGH) */
|
||||||
|
|
||||||
/* -------------------------------------------------------------------
|
/* -------------------------------------------------------------------
|
||||||
|
* CORRECTION 2026-04-15 LATE EVENING:
|
||||||
|
* The 'CAL_RD_VWML0' etc. names above apply to DDRPHY_OPB + small
|
||||||
|
* offsets. d328's accesses are at DDRPHY_OPB + 0x8000 + small,
|
||||||
|
* which is an UNDOCUMENTED sub-block of the DDRPHY space.
|
||||||
|
* Writing 0xF000F000 to a TRM-documented READ-ONLY register
|
||||||
|
* would be a no-op — contradicting the blob's actual behaviour —
|
||||||
|
* so those names DO NOT apply here. The `PHY_CTL_110` etc.
|
||||||
|
* heuristic labels (in the block above) are the safe fallback.
|
||||||
|
*
|
||||||
* Semantic re-interpretation of FUN_0000d328 (train_phy_block):
|
* Semantic re-interpretation of FUN_0000d328 (train_phy_block):
|
||||||
* Writes 0x30003 to CAL_CON5 (+0x160):
|
* Writes 0x30003 to CAL_CON5 (+0x160):
|
||||||
* bit[0] wrtrn_cyc_mode=1 (low-freq edge mode)
|
* bit[0] wrtrn_cyc_mode=1 (low-freq edge mode)
|
||||||
|
|||||||
Reference in New Issue
Block a user