Add sdram_phy_rk3576.h with the full register layout for the Synopsys
LPDDR4/4X/5 combo PHY on RK3576.  This is a different PHY generation
from RK3568 and cannot share sdram_phy_px30.h.

Covers ~123 defines across:
  - GNR (general): ctrl_ddr_mode, WDQS OEN mode
  - CAL: offset-R/W/D/C/O, gate training, WR-levelling, CA deskew
  - LP: scheduler enable, WCK enable, DQS drive-off (LPDDR5)
  - MDLL: dll_on, start, force, clkm_cg_en_sw, locked status
  - ZQ: zq_clk_div_en, zq_manual_str, zq_done (TRM pp.860-862)
  - DVFS / CBT / SCHD_TRAIN FSM and command registers
  - WCK2CKSYNC: wck_mode_mask for LPDDR5 WCK policy
  - CLKMODE: phy_mode (LP4 1:2:2 / LP5 1:1:4), phy_clk_2x

All bit positions verified against TRM Part 2 §7.4.6 (pp.808-980).
No firmware required: training uses the built-in hardware engine
(SCHD_TRAIN_CON0[0]=phy_train_en, [1]=phy_train_done).

Signed-off-by: Johan Axelsson <[email protected]>
---
 .../asm/arch-rockchip/sdram_phy_rk3576.h      | 363 ++++++++++++++++++
 1 file changed, 363 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-rockchip/sdram_phy_rk3576.h

diff --git a/arch/arm/include/asm/arch-rockchip/sdram_phy_rk3576.h 
b/arch/arm/include/asm/arch-rockchip/sdram_phy_rk3576.h
new file mode 100644
index 00000000000..f6221a5434f
--- /dev/null
+++ b/arch/arm/include/asm/arch-rockchip/sdram_phy_rk3576.h
@@ -0,0 +1,363 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * RK3576 LPDDR4/4X/5 combo PHY register definitions.
+ *
+ * The RK3576 uses a Synopsys DesignWare LPDDR4/4X/5 combo PHY.
+ * This PHY is a different generation from the px30/rk3568 PHY and
+ * has a hardware training engine — no Synopsys training firmware needed.
+ * (TRM Part 2 §7.6.x confirmed firmware-free training via phy_train_en.)
+ *
+ * Operational bases (TRM Part 2 §7.4.4):
+ *   DDRPHY0  0x2A020000
+ *   DDRPHY1  0x2A030000
+ *
+ * All offsets are relative to the DDRPHY operational base.
+ * TRM Part 2 §7.4.5 "Registers Summary For DDRPHY" (pp.790-810).
+ */
+
+#ifndef _ASM_ARCH_SDRAM_PHY_RK3576_H
+#define _ASM_ARCH_SDRAM_PHY_RK3576_H
+
+#ifndef __ASSEMBLY__
+#include <linux/bitops.h>
+#endif
+
+/* -----------------------------------------------------------------------
+ * Core calibration and control registers (TRM p.790)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_GNR_CON0                        0x0000  /* reset: 0x44005011 */
+#define DDRPHY_CAL_CON0                        0x0004  /* reset: 0x789606C0 */
+#define DDRPHY_CAL_CON1                        0x0008  /* reset: 0x20142001 */
+#define DDRPHY_CAL_CON2                        0x000C  /* reset: 0x42001300 */
+#define DDRPHY_CAL_CON3                        0x0010  /* reset: 0xFC7F9000 */
+#define DDRPHY_CAL_CON4                        0x0014  /* reset: 0x0083806F */
+#define DDRPHY_LP_CON0                 0x0018  /* reset: 0x000C4403 */
+#define DDRPHY_GATE_CON0               0x001C  /* reset: 0x03003003 */
+
+/* -----------------------------------------------------------------------
+ * Read/write DQ and gate offset/shift registers (TRM p.790)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_OFFSETR_CON0            0x0020  /* reset: 0x00000000 */
+#define DDRPHY_OFFSETW_CON0            0x0030  /* reset: 0x00000000 */
+#define DDRPHY_OFFSET_DQ_CON0          0x003C  /* reset: 0x00000000 */
+#define DDRPHY_OFFSETC_CON0            0x0040  /* reset: 0x00000000 */
+#define DDRPHY_SHIFTC_CON0             0x004C  /* reset: 0x00000000 */
+#define DDRPHY_OFFSETD_CON0            0x0050  /* reset: 0x00000000 */
+#define DDRPHY_OFFSETO_CON0            0x0058  /* reset: 0x00000000 */
+
+/* -----------------------------------------------------------------------
+ * Write levelling (TRM p.790)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_WR_LVL_CON0             0x006C  /* reset: 0x00000000 */
+#define DDRPHY_WR_LVL_CON1             0x0070  /* reset: 0x01E80473 */
+#define DDRPHY_WR_LVL_CON2             0x0074  /* reset: 0x40465580 */
+#define DDRPHY_WR_LVL_CON3             0x0078  /* reset: 0x00000B00 */
+
+/* -----------------------------------------------------------------------
+ * CA de-skew (TRM p.790)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_CA_DESKEW_CON0          0x007C  /* reset: 0x00000000 */
+#define DDRPHY_CA_DESKEW_CON1          0x0080  /* reset: 0x00000000 */
+#define DDRPHY_CA_DESKEW_CON2          0x0084  /* reset: 0x00000000 */
+#define DDRPHY_CA_DESKEW_CON3          0x0088  /* reset: 0x00000000 */
+#define DDRPHY_CA_DESKEW_CON4          0x008C  /* reset: 0x00000000 */
+#define DDRPHY_CA_DESKEW_CON5          0x0090  /* reset: 0x00000000 */
+#define DDRPHY_CA_DESKEW_CON6          0x0094  /* reset: 0x00000000 */
+
+/* -----------------------------------------------------------------------
+ * Write/read calibration pattern registers (TRM p.790-791)
+ * CAL_WR_PATTERN_CON0-4:  BL1-BL8 / DM pattern (BL16 burst)
+ * CAL_WR_PATTERN_CON5-19: BL9-BL16 / DM pattern continuation
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_CAL_WR_PATTERN_CON0     0x0098  /* reset: 0x00FF00FF */
+#define DDRPHY_CAL_WR_PATTERN_CON1     0x009C  /* reset: 0x00FF00FF */
+#define DDRPHY_CAL_WR_PATTERN_CON2     0x00A0  /* reset: 0x00FF00FF */
+#define DDRPHY_CAL_WR_PATTERN_CON3     0x00A4  /* reset: 0x00FF00FF */
+#define DDRPHY_CAL_WR_PATTERN_CON4     0x00A8  /* reset: 0x00005555 */
+#define DDRPHY_CAL_RD_PATTERN_CON0     0x00AC  /* reset: 0x55555A3C */
+
+/* Extended write pattern: BL9-BL16 (starting offset extracted from TRM p.800) 
*/
+#define DDRPHY_CAL_WR_PATTERN_CON5     0x093C
+#define DDRPHY_CAL_WR_PATTERN_CON6     0x0940
+#define DDRPHY_CAL_WR_PATTERN_CON7     0x0944
+#define DDRPHY_CAL_WR_PATTERN_CON8     0x0948
+#define DDRPHY_CAL_WR_PATTERN_CON9     0x094C
+#define DDRPHY_CAL_WR_PATTERN_CON10    0x0950
+#define DDRPHY_CAL_WR_PATTERN_CON11    0x0954
+#define DDRPHY_CAL_WR_PATTERN_CON12    0x0958
+#define DDRPHY_CAL_WR_PATTERN_CON13    0x095C
+#define DDRPHY_CAL_WR_PATTERN_CON14    0x0960
+#define DDRPHY_CAL_WR_PATTERN_CON15    0x0964
+#define DDRPHY_CAL_WR_PATTERN_CON16    0x0968
+#define DDRPHY_CAL_WR_PATTERN_CON17    0x096C
+#define DDRPHY_CAL_WR_PATTERN_CON18    0x0970
+#define DDRPHY_CAL_WR_PATTERN_CON19    0x0974
+
+/* -----------------------------------------------------------------------
+ * MDLL control (TRM p.791)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_MDLL_CON0               0x00B0  /* reset: 0x2000017E */
+#define DDRPHY_MDLL_CON1               0x00B4  /* reset: 0x00200100 */
+#define DDRPHY_MDLL_CON2               0x0AFC  /* reset: (see TRM) */
+
+/* -----------------------------------------------------------------------
+ * DVFS control registers (TRM p.791)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_DVFS_CON                        0x00B8  /* reset: 0x00002640 */
+#define DDRPHY_DVFS0_CON0              0x00BC  /* reset: 0x64080C06 */
+#define DDRPHY_DVFS1_CON0              0x00C0  /* reset: 0x64080C06 */
+#define DDRPHY_DVFS0_CON1              0x00C4  /* reset: 0x30800000 */
+#define DDRPHY_DVFS1_CON1              0x00C8  /* reset: 0x30800000 */
+#define DDRPHY_DVFS0_CON2              0x00CC  /* reset: 0x60062001 */
+#define DDRPHY_DVFS1_CON2              0x00D0  /* reset: 0x60062001 */
+#define DDRPHY_DVFS0_CON3              0x00D4  /* reset: 0x0003FFFF */
+#define DDRPHY_DVFS1_CON3              0x00D8  /* reset: 0x0003FFFF */
+#define DDRPHY_DVFS0_CON4              0x00DC  /* reset: 0x00243F3F */
+#define DDRPHY_DVFS1_CON4              0x00E0  /* reset: 0x00243F3F */
+#define DDRPHY_DVFS0_CON5              0x0934
+#define DDRPHY_DVFS1_CON5              0x0938
+#define DDRPHY_DVFS_UPD_CON0           0x0164  /* reset: 0x003F3F3F */
+#define DDRPHY_DVFS_UPD_CON1           0x0168  /* reset: 0x003F3F3F */
+
+/* -----------------------------------------------------------------------
+ * Training status/result registers (TRM p.791)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_CAL_WRLVL_STAT          0x00E4  /* reset: 0x00000000 */
+#define DDRPHY_CAL_FAIL_STAT0          0x00E8  /* reset: 0x00000000 */
+#define DDRPHY_CAL_FAIL_STAT1          0x00EC  /* reset: 0x00000000 */
+#define DDRPHY_CAL_GT_CS0_VWMC0                0x00F0  /* reset: 0x00000000 */
+#define DDRPHY_CAL_GT_CS0_CYC          0x00FC  /* reset: 0x00000000 */
+#define DDRPHY_CAL_RD_VWMC0            0x0100  /* reset: 0x00000000 */
+#define DDRPHY_CAL_RD_VWML0            0x0110  /* reset: 0x00000000 */
+#define DDRPHY_CAL_RD_VWMR0            0x0120  /* reset: 0x00000000 */
+#define DDRPHY_CAL_WR_VWMC0            0x0130  /* reset: 0x00000000 */
+#define DDRPHY_CAL_WR_VWML0            0x0140  /* reset: 0x00000000 */
+#define DDRPHY_CAL_WR_VWMR0            0x0150  /* reset: 0x00000000 */
+#define DDRPHY_CAL_CON5                        0x0160  /* reset: 0x00000000 */
+
+/* -----------------------------------------------------------------------
+ * ZQ calibration (TRM p.792-793)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_ZQ_CON0                 0x03C8  /* reset: 0xFF807404 */
+#define DDRPHY_ZQ_CON1                 0x03CC  /* reset: 0x00140000 */
+#define DDRPHY_ZQ_CON2                 0x03D0  /* reset: 0x001E0002 */
+#define DDRPHY_ZQ_CON3                 0x03D4  /* reset: 0x003F3F3F */
+#define DDRPHY_ZQ_CON5                 0x03DC  /* reset: 0x073F0000 */
+#define DDRPHY_ZQ_CON6                 0x03E0  /* reset: 0x00002121 */
+#define DDRPHY_ZQ_CON9                 0x03EC  /* reset: 0x00001414 */
+#define DDRPHY_ZQ_CON12                        0x03F8  /* reset: 0x00000707 */
+#define DDRPHY_TESTIRCV_CON0           0x0400  /* reset: 0x00080000 */
+
+/* -----------------------------------------------------------------------
+ * CBT (Command-Bus Training) registers (TRM p.793)
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_CBT_CON0                        0x0600
+#define DDRPHY_CBT_CON2                        0x0608
+#define DDRPHY_CBT_CON3                        0x060C
+#define DDRPHY_CBT_CON5                        0x05F4
+#define DDRPHY_CBT_CMD                 0x05FC
+#define DDRPHY_CBT_CAL_STAT0           0x0BC4
+
+/* -----------------------------------------------------------------------
+ * Training scheduler — core init and training control (TRM p.802)
+ * These are the primary registers for TPL hardware-assisted training.
+ * TRM §7.6.x: set phy_train_en=1, poll phy_train_done=1.
+ * -----------------------------------------------------------------------
+ */
+
+#define DDRPHY_SCHD_CON0               0x0A20
+#define DDRPHY_SCHD_TRAIN_CON0         0x0A24
+#define DDRPHY_SCHD_TRAIN_CON1         0x0A28
+#define DDRPHY_SCHD_TIME_CON0          0x0A2C
+#define DDRPHY_SCHD_TIME_CON1          0x0A30
+#define DDRPHY_SCHD_TIME_CON2          0x0A34
+#define DDRPHY_SCHD_TIME_CON3          0x0A38
+
+/* DVFS scheduler timing (runtime DVFS, not needed for TPL init) */
+#define DDRPHY_DVFS0_SCHD_TIME_CON0    0x0A3C
+#define DDRPHY_DVFS0_SCHD_TIME_CON1    0x0A40
+#define DDRPHY_DVFS0_SCHD_TIME_CON2    0x0A44
+#define DDRPHY_DVFS0_SCHD_TIME_CON3    0x0A48
+#define DDRPHY_DVFS1_SCHD_TIME_CON0    0x0A4C
+#define DDRPHY_DVFS1_SCHD_TIME_CON1    0x0A50
+#define DDRPHY_DVFS1_SCHD_TIME_CON2    0x0A54
+#define DDRPHY_DVFS1_SCHD_TIME_CON3    0x0A58
+
+/* Direct command injection */
+#define DDRPHY_SCHD_DIRECT_CMD0                0x0A5C
+#define DDRPHY_SCHD_DIRECT_CMD1                0x0A60
+#define DDRPHY_SCHD_DIRECT_CMD2                0x0A64
+#define DDRPHY_SCHD_DIRECT_CMD3                0x0A68
+#define DDRPHY_SCHD_DIRECT_CMD4                0x0A6C
+#define DDRPHY_SCHD_CMD_CON0           0x0A70
+#define DDRPHY_SCHD_CMD_CON1           0x0A74
+#define DDRPHY_SCHD_CMD_CON2           0x0A78
+#define DDRPHY_OP_CODE_RDC             0x0A7C
+
+/* LPDDR4/5 MR operation buffers */
+#define DDRPHY_LP4_MR_OP0              0x0A80
+#define DDRPHY_LP4_MR_OP1              0x0A84
+#define DDRPHY_LP5_MR_OP0              0x0A88
+#define DDRPHY_LP5_MR_OP1              0x0A8C
+
+/* Training scheduler FSM and clock mode */
+#define DDRPHY_SCHD_FSM                        0x0A90
+#define DDRPHY_CLKMODE_CON             0x0A94
+#define DDRPHY_CASWIZZLE_CON           0x0A98
+
+/* WCK2CK sync control — LPDDR5 only (TRM p.985) */
+#define DDRPHY_WCK2CKSYNC_CON0         0x0ADC  /* reset: 0x00000000 */
+#define DDRPHY_WCK2CKSYNC_CON1         0x0AE0  /* reset: 0x23340758 */
+
+/* -----------------------------------------------------------------------
+ * Register field macros — verified against TRM Part 2 §7.4.6 pp.808-980
+ * -----------------------------------------------------------------------
+ */
+
+/*
+ * DDRPHY_GNR_CON0 (reset 0x44005011)
+ * ctrl_ddr_mode [25:24]: 0=LPDDR4, 2=LPDDR5  (TRM p.808)
+ * wdqs_oen_mode   [19]: LPDDR5 must set; DQS driven only during writes
+ */
+#define GNR_CON0_CTRL_DDR_MODE_MASK    GENMASK(25, 24)
+#define GNR_CON0_DDR_MODE_LPDDR4       (0x0 << 24)
+#define GNR_CON0_DDR_MODE_LPDDR5       (0x2 << 24)
+#define GNR_CON0_WDQS_OEN_MODE         BIT(19)
+
+/*
+ * DDRPHY_LP_CON0 (reset 0x000C4403)
+ * ctrl_scheduler_en [6]: enable PHY scheduler clock (set for LP4 and LP5)
+ * ctrl_dqs_drv_off  [8]: DQS driver off — set for LPDDR5 when no ECC
+ * wck_enable        [9]: WCK enable — LPDDR5 only
+ * (TRM p.821)
+ */
+#define LP_CON0_CTRL_SCHEDULER_EN      BIT(6)
+#define LP_CON0_CTRL_DQS_DRV_OFF       BIT(8)
+#define LP_CON0_WCK_ENABLE             BIT(9)
+
+/*
+ * DDRPHY_MDLL_CON0 (reset 0x2000017E)
+ * ctrl_dll_on   [5]:     high = DLL on (keep high for normal op)
+ * ctrl_start    [6]:     0→1 pulse starts DLL locking
+ * ctrl_force  [18:8]:    force lock value when DLL is off (11-bit)
+ * clkm_cg_en_sw [23]:   freeze DLL lock value during freq change
+ * (TRM p.835)
+ */
+#define MDLL_CON0_CTRL_DLL_ON          BIT(5)
+#define MDLL_CON0_CTRL_START           BIT(6)
+#define MDLL_CON0_CTRL_FORCE_MASK      GENMASK(18, 8)
+#define MDLL_CON0_CTRL_FORCE(x)        ((x) << 8)
+#define MDLL_CON0_CLKM_CG_EN_SW        BIT(23)
+/* ctrl_force value for low-frequency (<100 MHz) LPDDR5 init (TRM §7.6.3 step 
24) */
+#define MDLL_CON0_CTRL_FORCE_LOW_FREQ  MDLL_CON0_CTRL_FORCE(0x2ef)
+
+/*
+ * DDRPHY_MDLL_CON1 (reset 0x00200100)
+ * ctrl_locked [18]: RO, DLL stable lock — poll until set after ctrl_start
+ * (TRM p.835)
+ */
+#define MDLL_CON1_CTRL_LOCKED          BIT(18)
+
+/*
+ * DDRPHY_CLKMODE_CON (reset 0x00000009)
+ * ctrl_phy_clk_2x [3]:   1=PHY 2x clock (always 1 in LP4/5)
+ * ctrl_phy_mode [2:0]:   clock ratio MC:CK:DQS/WCK (TRM p.980)
+ *   1 = LPDDR4 1:2:2
+ *   2 = LPDDR5 1:1:2 (CLK_DFI:CK:WCK)
+ *   4 = LPDDR5 1:1:4 (Flipper One operating mode)
+ */
+#define CLKMODE_CON_PHY_CLK_2X         BIT(3)
+#define CLKMODE_CON_PHY_MODE_MASK      GENMASK(2, 0)
+#define CLKMODE_CON_PHY_MODE_LPDDR4    1
+#define CLKMODE_CON_PHY_MODE_LP5_1_2   2
+#define CLKMODE_CON_PHY_MODE_LP5_1_4   4
+
+/*
+ * DDRPHY_CAL_CON0 (reset 0x789606C0)
+ * cal_vtc_en       [22]: VT compensation — enable after training
+ * dvfs_wr_train_en [26]: after initial training, re-interprets write training
+ * (TRM p.810)
+ */
+#define CAL_CON0_CAL_VTC_EN            BIT(22)
+#define CAL_CON0_DVFS_WR_TRAIN_EN      BIT(26)
+
+/*
+ * DDRPHY_CAL_CON5 (reset 0x00000000, offset 0x0160)
+ * wrtrn_cyc_mode [0]: 0=matched edge codes (>= 1 GHz), 1=unmatched
+ * wrtrn_cyc_en   [1]: cycle-based write training (enable for LPDDR4)
+ * (TRM p.850)
+ */
+#define CAL_CON5_WRTRN_CYC_MODE        BIT(0)
+#define CAL_CON5_WRTRN_CYC_EN          BIT(1)
+
+/*
+ * DDRPHY_OFFSETD_CON0 (reset 0x00000000, offset 0x0050)
+ * ctrl_resync [24]: toggle 0→1→0 to push DLL updates to slave DLLs
+ * upd_mode    [28]: 0=PHY-initiated update (dfi_phyupd_req)
+ * (TRM p.809 and §7.6.x DLL update procedure)
+ */
+#define OFFSETD_CON0_CTRL_RESYNC       BIT(24)
+#define OFFSETD_CON0_UPD_MODE          BIT(28)
+
+/*
+ * DDRPHY_SCHD_TRAIN_CON0 (reset 0x00000000, offset 0x0A24)
+ * phy_train_en   [0]:  RW — set to start hardware training engine
+ * phy_train_done [1]:  RO — poll until set, then clear phy_train_en
+ * phy_wrtrn_en   [5]:  enable write training
+ * phy_gttrn_en   [3]:  enable gate training
+ * (TRM p.965)
+ */
+#define TRAIN_CON0_PHY_TRAIN_EN                BIT(0)
+#define TRAIN_CON0_PHY_TRAIN_DONE      BIT(1)
+#define TRAIN_CON0_PHY_GTTRN_EN        BIT(3)
+#define TRAIN_CON0_PHY_WRTRN_EN        BIT(5)
+#define TRAIN_CON0_DVFS_WRTRN_EN_MASK  GENMASK(19, 18)
+#define TRAIN_CON0_PERIODIC_WRTRN_EN_MASK      GENMASK(23, 22)
+
+/*
+ * DDRPHY_ZQ_CON0 (reset 0xFF807404, offset 0x03C8)
+ * zq_clk_div_en [18]: enable ZQ clock divider before calibration (TRM p.860)
+ * zq_manual_str  [1]: 0→1 pulse starts manual ZQ calibration (TRM p.861)
+ * DDRPHY_ZQ_CON1 (reset 0x00140000, offset 0x03CC)
+ * zq_done        [0]: RO — high when calibration complete (TRM p.862)
+ */
+#define ZQ_CON0_ZQ_CLK_DIV_EN          BIT(18)
+#define ZQ_CON0_ZQ_MANUAL_STR          BIT(1)
+#define ZQ_CON1_ZQ_DONE                        BIT(0)
+
+/*
+ * DDRPHY_WCK2CKSYNC_CON0 (reset 0x00000000, offset 0x0ADC)
+ * ctrl_WCK_MODE_APB [1:0]: WCK driving policy (TRM p.985)
+ *   0b00: PHY/MC normal (WCK always-on disabled), CAS_EN must be 1
+ *   0b01: MC WCK always-on mode, CAS_EN must be 0
+ * DDRPHY_SCHD_CMD_CON0 (reset ~0x1 at bit 0)
+ * CAS_EN_APB [0]: enable WCK2CK SYNC by scheduler (TRM p.976)
+ */
+#define WCK2CKSYNC_CON0_WCK_MODE_MASK  GENMASK(1, 0)
+#define WCK2CKSYNC_CON0_WCK_MODE_ALWAYS_ON     (0x1)
+#define SCHD_CMD_CON0_CAS_EN_APB       BIT(0)
+
+/* DDRPHY_CAL_FAIL_STAT0 — non-zero means training failed */
+#define CAL_FAIL_STAT0_ANY_FAIL                GENMASK(31, 0)
+
+#endif /* _ASM_ARCH_SDRAM_PHY_RK3576_H */
-- 
2.45.1.windows.1


Reply via email to