Add sdram_pctl_rk3576.h with the full uMCTL2 register layout for the RK3576 DDR subsystem. The RK3576 uMCTL2 is a newer generation than the PX30/RK3568 variant and cannot share sdram_pctl_px30.h:
- Frequency-banked timing registers at 0x0/0x100000/0x200000/0x300000 - Global control/status at 0x10000+ - Multi-port registers at 0x20000+ - Address-map registers at 0x30000+ Covers ~130 register offset defines (FREQ, global, port, addrmap sections) with TRM reset values in comments. Field macros for MSTR0 (LPDDR4/5 mode, ranks, burst length, bus width), MRCTRL0 (MR write protocol), DFIMISC, RFSHCTL0, and DFISTAT. TRM Part 2 §7.4.3 (pp.585-800). Signed-off-by: Johan Axelsson <[email protected]> --- .../asm/arch-rockchip/sdram_pctl_rk3576.h | 303 ++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 arch/arm/include/asm/arch-rockchip/sdram_pctl_rk3576.h diff --git a/arch/arm/include/asm/arch-rockchip/sdram_pctl_rk3576.h b/arch/arm/include/asm/arch-rockchip/sdram_pctl_rk3576.h new file mode 100644 index 00000000000..cf4e9053bc1 --- /dev/null +++ b/arch/arm/include/asm/arch-rockchip/sdram_pctl_rk3576.h @@ -0,0 +1,303 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * RK3576 uMCTL2 DDRCTL register definitions. + * + * The RK3576 DDRCTL uses a non-standard address layout (TRM Part 2 §7.4.1): + * 0x000000–0x0FFFFF FREQ0 per-frequency timing registers + * 0x100000–0x1FFFFF FREQ1 per-frequency timing registers + * 0x200000–0x2FFFFF FREQ2 per-frequency timing registers + * 0x300000–0x3FFFFF FREQ3 per-frequency timing registers + * 0x010000–0x01FFFF global/static controller registers + * 0x020000–0x024FFF AXI port configuration (5 ports) + * 0x030000–0x037FFF SDRAM address map registers + * + * Operational bases (TRM Part 2 Table 7-1): + * DDRCTL0 0x28000000 + * DDRCTL1 0x29000000 + * + * This layout is incompatible with sdram_pctl_px30.h; do not mix them. + */ + +#ifndef _ASM_ARCH_SDRAM_PCTL_RK3576_H +#define _ASM_ARCH_SDRAM_PCTL_RK3576_H + +#include <asm/arch-rockchip/sdram_common.h> + +#ifndef __ASSEMBLY__ +#include <linux/bitops.h> +#endif + +/* Per-frequency bank base (TRM Part 2 §7.4.1) */ +#define DDRCTL_FREQ_BASE(n) ((u32)(n) * 0x100000) + +/* ----------------------------------------------------------------------- + * FREQ-banked timing registers (offsets relative to DDRCTL_FREQ_BASE(n)) + * TRM Part 2 §7.4.2 "Registers Summary For DDRCTL" + * ----------------------------------------------------------------------- + */ + +/* SDRAM timing set 1 (TRM p.591) */ +#define DDRCTL_DRAMSET1TMG0 0x0000 /* reset: 0x0F101B0F */ +#define DDRCTL_DRAMSET1TMG1 0x0004 /* reset: 0x00080414 */ +#define DDRCTL_DRAMSET1TMG2 0x0008 /* reset: 0x0305060D */ +#define DDRCTL_DRAMSET1TMG3 0x000C /* reset: 0x00040404 */ +#define DDRCTL_DRAMSET1TMG4 0x0010 /* reset: 0x05040405 */ +#define DDRCTL_DRAMSET1TMG5 0x0014 /* reset: 0x05050403 */ +#define DDRCTL_DRAMSET1TMG6 0x0018 /* reset: 0x00000005 */ +#define DDRCTL_DRAMSET1TMG7 0x001C /* reset: 0x00000000 */ +#define DDRCTL_DRAMSET1TMG8 0x0020 /* reset: 0x00004405 */ +#define DDRCTL_DRAMSET1TMG9 0x0024 /* reset: 0x0004040D */ +#define DDRCTL_DRAMSET1TMG12 0x0030 /* reset: 0x00020000 */ +#define DDRCTL_DRAMSET1TMG13 0x0034 /* reset: 0x1C200004 */ +#define DDRCTL_DRAMSET1TMG14 0x0038 /* reset: 0x000800A0 */ +#define DDRCTL_DRAMSET1TMG23 0x005C /* reset: 0x00000000 */ +#define DDRCTL_DRAMSET1TMG24 0x0060 /* reset: 0x000F0F0F */ +#define DDRCTL_DRAMSET1TMG25 0x0064 /* reset: 0x00000000 */ +#define DDRCTL_DRAMSET1TMG30 0x0078 /* reset: 0x00000000 */ + +/* SDRAM initialization MR values for this frequency set (TRM p.592) */ +#define DDRCTL_INITMR0 0x0500 /* reset: 0x00000510 */ +#define DDRCTL_INITMR1 0x0504 /* reset: 0x00000000 */ +#define DDRCTL_INITMR2 0x0508 /* reset: 0x00000000 */ +#define DDRCTL_INITMR3 0x050C /* reset: 0x00000000 */ + +/* DFI timing for this frequency set (TRM p.592) */ +#define DDRCTL_DFITMG0 0x0580 /* reset: 0x07020002 */ +#define DDRCTL_DFITMG1 0x0584 /* reset: 0x00000404 */ +#define DDRCTL_DFITMG2 0x0588 /* reset: 0x00000202 */ +#define DDRCTL_DFITMG4 0x0590 /* reset: 0x00000000 */ +#define DDRCTL_DFITMG5 0x0594 /* reset: 0x00000000 */ +#define DDRCTL_DFILPTMG0 0x05A0 /* reset: 0x00000000 */ +#define DDRCTL_DFILPTMG1 0x05A4 /* reset: 0x00000700 */ +#define DDRCTL_DFIUPDTMG0 0x05A8 /* reset: 0x00400003 */ +#define DDRCTL_DFIUPDTMG1 0x05AC /* reset: 0x00010001 */ +#define DDRCTL_DFIMSGTMG0 0x05B0 /* reset: 0x00000004 */ + +/* Refresh timing for this frequency set (TRM p.592) */ +#define DDRCTL_RFSHSET1TMG0 0x0600 /* reset: 0x02100062 */ +#define DDRCTL_RFSHSET1TMG1 0x0604 /* reset: 0x0000008C */ +#define DDRCTL_RFSHSET1TMG2 0x0608 /* reset: 0x8C8C0000 */ +#define DDRCTL_RFSHSET1TMG4 0x0610 /* reset: 0x00000000 */ + +/* ZQ timing for this frequency set (TRM p.592) */ +#define DDRCTL_ZQSET1TMG0 0x0800 /* reset: 0x00400200 */ +#define DDRCTL_ZQSET1TMG1 0x0804 /* reset: 0x02000100 */ + +/* DQS/WCK oscillator control (per-freq) (TRM p.592) */ +#define DDRCTL_DQSOSCCTL0 0x0A80 /* reset: 0x00000070 */ + +/* Temperature derate timing (per-freq) (TRM p.592) */ +#define DDRCTL_DERATEINT 0x0B00 /* reset: 0x00800000 */ +#define DDRCTL_DERATEVAL0 0x0B04 /* reset: 0x050F0504 */ +#define DDRCTL_DERATEVAL1 0x0B08 /* reset: 0x00000014 */ + +/* Hardware low-power timing (per-freq) (TRM p.592) */ +#define DDRCTL_HWLPTMG0 0x0B80 /* reset: 0x00000000 */ + +/* Scheduler timing (per-freq) (TRM p.592) */ +#define DDRCTL_SCHEDTMG0 0x0C00 /* reset: 0x00000000 */ +#define DDRCTL_PERFHPR1 0x0C80 /* reset: 0x0F000001 */ +#define DDRCTL_PERFLPR1 0x0C84 /* reset: 0x0F00007F */ +#define DDRCTL_PERFWR1 0x0C88 /* reset: 0x0F00007F */ +#define DDRCTL_TMGCFG 0x0D00 /* reset: 0x00000000 */ +#define DDRCTL_RANKTMG0 0x0D04 /* reset: 0x00000606 */ +#define DDRCTL_RANKTMG1 0x0D08 /* reset: 0x00000F0F */ +#define DDRCTL_PWRTMG 0x0D0C /* reset: 0x00400010 */ + +/* ----------------------------------------------------------------------- + * Global/static registers (offsets within DDRCTL address space) + * These registers are outside the FREQ banks. Access via: + * readl(base + DDRCTL_MSTR0), etc. + * TRM Part 2 §7.4.2 p.593-594 + * ----------------------------------------------------------------------- + */ + +#define DDRCTL_MSTR0 0x10000 /* reset: 0x03040000 */ +#define DDRCTL_MSTR2 0x10008 /* reset: 0x00000000 */ +#define DDRCTL_MSTR4 0x10010 /* reset: 0x00000000 */ +#define DDRCTL_STAT 0x10014 /* reset: 0x00000000 */ +#define DDRCTL_MRCTRL0 0x10080 /* reset: 0x00000030 */ +#define DDRCTL_MRCTRL1 0x10084 /* reset: 0x00000000 */ +#define DDRCTL_MRSTAT 0x10090 /* reset: 0x00000000 */ +#define DDRCTL_MRRDATA0 0x10094 /* reset: 0x00000000 */ +#define DDRCTL_MRRDATA1 0x10098 /* reset: 0x00000000 */ +#define DDRCTL_DERATECTL0 0x10100 /* reset: 0x00000018 */ +#define DDRCTL_DERATECTL1 0x10104 /* reset: 0x00000000 */ +#define DDRCTL_DERATECTL2 0x10108 /* reset: 0x00000000 */ +#define DDRCTL_DERATECTL5 0x10114 /* reset: 0x00000001 */ +#define DDRCTL_DERATECTL6 0x10118 /* reset: 0x00000000 */ +#define DDRCTL_DERATESTAT0 0x1011C /* reset: 0x00000000 */ +#define DDRCTL_DERATEDBGCTL 0x10124 /* reset: 0x00000000 */ +#define DDRCTL_DERATEDBGSTAT 0x10128 /* reset: 0x00000000 */ +#define DDRCTL_PWRCTL 0x10180 /* reset: 0x00000000 */ +#define DDRCTL_HWLPCTL 0x10184 /* reset: 0x00000003 */ +#define DDRCTL_CLKGATECTL 0x1018C /* reset: 0x0000003F */ +#define DDRCTL_RFSHMOD0 0x10200 /* reset: 0x00000000 */ +#define DDRCTL_RFSHCTL0 0x10208 /* reset: 0x00000000 */ +#define DDRCTL_ZQCTL0 0x10280 /* reset: 0x00000000 */ +#define DDRCTL_ZQCTL1 0x10284 /* reset: 0x00000000 */ +#define DDRCTL_ZQCTL2 0x10288 /* reset: 0x00000000 */ +#define DDRCTL_ZQSTAT 0x1028C /* reset: 0x00000000 */ +#define DDRCTL_DQSOSCRUNTIME 0x10300 /* reset: 0x00400040 */ +#define DDRCTL_DQSOSCSTAT0 0x10304 /* reset: 0x00000000 */ +#define DDRCTL_DQSOSCCFG0 0x10308 /* reset: 0x00000000 */ +#define DDRCTL_SCHED0 0x10380 /* reset: 0x8001201C */ +#define DDRCTL_SCHED1 0x10384 /* reset: 0x00002000 */ +#define DDRCTL_SCHED3 0x1038C /* reset: 0x04040208 */ +#define DDRCTL_SCHED4 0x10390 /* reset: 0x08400810 */ +#define DDRCTL_DFILPCFG0 0x10500 /* reset: 0x00100000 */ +#define DDRCTL_DFIUPD0 0x10508 /* reset: 0x00008000 */ +#define DDRCTL_DFIMISC 0x10510 /* reset: 0x00000001 */ +#define DDRCTL_DFISTAT 0x10514 /* reset: 0x00000000 */ +#define DDRCTL_DFIPHYMSTR 0x10518 /* reset: 0x80000001 */ +#define DDRCTL_DFI0MSGCTL0 0x10520 /* reset: 0x00000000 */ +#define DDRCTL_DFI0MSGSTAT0 0x10524 /* reset: 0x00000000 */ +#define DDRCTL_POISONCFG 0x10580 /* reset: 0x00110011 */ +#define DDRCTL_POISONSTAT 0x10584 /* reset: 0x00000000 */ +#define DDRCTL_OPCTRL0 0x10B80 /* reset: 0x00000000 */ +#define DDRCTL_OPCTRL1 0x10B84 /* reset: 0x00000000 */ +#define DDRCTL_OPCTRLCAM 0x10B88 /* reset: 0x00000000 */ +#define DDRCTL_OPCTRLCMD 0x10B8C /* reset: 0x00000000 */ +#define DDRCTL_OPCTRLSTAT 0x10B90 /* reset: 0x00000000 */ +#define DDRCTL_OPREFCTRL0 0x10B98 /* reset: 0x00000000 */ +#define DDRCTL_OPREFSTAT0 0x10BA0 /* reset: 0x00000000 */ +#define DDRCTL_SWCTL 0x10C80 /* reset: 0x00000001 */ +#define DDRCTL_SWSTAT 0x10C84 /* reset: 0x00000001 */ +#define DDRCTL_RANKCTL 0x10C90 /* reset: 0x0000000F */ +#define DDRCTL_DBICTL 0x10C94 /* reset: 0x00000001 */ +#define DDRCTL_ODTMAP 0x10C9C /* reset: 0x00002211 */ +#define DDRCTL_DATACTL0 0x10CA0 /* reset: 0x00000000 */ +#define DDRCTL_SWCTLSTATIC 0x10CA4 /* reset: 0x00000000 */ +#define DDRCTL_INITTMG0 0x10D00 /* reset: 0x0002004E */ +#define DDRCTL_INITTMG1 0x10D04 /* reset: 0x00000000 */ + +/* ----------------------------------------------------------------------- + * AXI port configuration (5 ports, stride 0x1000) (TRM p.594-595) + * Port n base = DDRCTL_PORT_BASE(n) + * ----------------------------------------------------------------------- + */ + +#define DDRCTL_PORT_BASE(n) (0x20000 + (u32)(n) * 0x1000) +#define DDRCTL_PCCFG_PORT0 0x20000 /* reset: 0x00000000 (port 0 only) */ +#define DDRCTL_PCFGR(n) (DDRCTL_PORT_BASE(n) + 0x004) /* reset: 0x0000501F */ +#define DDRCTL_PCFGW(n) (DDRCTL_PORT_BASE(n) + 0x008) /* reset: 0x0000501F */ +#define DDRCTL_PCTRL(n) (DDRCTL_PORT_BASE(n) + 0x090) /* reset: 0x00000000 */ +#define DDRCTL_PCFGQOS0(n) (DDRCTL_PORT_BASE(n) + 0x094) /* reset: 0x00000000 */ +#define DDRCTL_PCFGQOS1(n) (DDRCTL_PORT_BASE(n) + 0x098) /* reset: 0x00000000 */ +#define DDRCTL_PCFGWQOS0(n) (DDRCTL_PORT_BASE(n) + 0x09C) /* reset: 0x00000E00 */ +#define DDRCTL_PCFGWQOS1(n) (DDRCTL_PORT_BASE(n) + 0x0A0) /* reset: 0x00000000 */ +#define DDRCTL_NPORTS 5 + +/* ----------------------------------------------------------------------- + * Address map registers (TRM p.595) + * ----------------------------------------------------------------------- + */ + +#define DDRCTL_ADDRMAP1 0x30004 /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP3 0x3000C /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP4 0x30010 /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP5 0x30014 /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP6 0x30018 /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP7 0x3001C /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP8 0x30020 /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP9 0x30024 /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP10 0x30028 /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP11 0x3002C /* reset: 0x00000000 */ +#define DDRCTL_ADDRMAP12 0x30030 /* reset: 0x00000000 */ + +/* ----------------------------------------------------------------------- + * Register field macros — only bits needed for TPL init + * TRM Part 2 §7.4.3 + * ----------------------------------------------------------------------- + */ + +/* DDRCTL_MSTR0 */ +#define MSTR0_ACTIVE_RANKS_MASK GENMASK(27, 24) +#define MSTR0_ACTIVE_RANKS_1 (0x1 << 24) +#define MSTR0_ACTIVE_RANKS_2 (0x3 << 24) +#define MSTR0_BURST_RDWR_MASK GENMASK(19, 16) +#define MSTR0_BURST_RDWR_BL16 (0x8 << 16) +#define MSTR0_LPDDR5 BIT(6) +#define MSTR0_LPDDR4 BIT(5) +#define MSTR0_DATA_BUS_WIDTH_MASK GENMASK(13, 12) +#define MSTR0_DATA_BUS_WIDTH_FULL (0x0 << 12) +#define MSTR0_DATA_BUS_WIDTH_HALF (0x1 << 12) + +/* DDRCTL_STAT */ +#define STAT_OPERATING_MODE_MASK GENMASK(2, 0) +#define STAT_OPERATING_MODE_INIT 0 +#define STAT_OPERATING_MODE_NORMAL 1 +#define STAT_OPERATING_MODE_PD 2 +#define STAT_OPERATING_MODE_SR 3 +#define STAT_SELFREF_TYPE_MASK GENMASK(5, 4) +#define STAT_SELFREF_TYPE_SR_NOT_AUTO (2 << 4) + +/* DDRCTL_MRCTRL0 (TRM p.635) */ +#define MRCTRL0_MR_WR BIT(31) +#define MRCTRL0_MR_ADDR_SHIFT 12 +#define MRCTRL0_MR_RANK_SHIFT 4 +/* sw_init_int [3]: allow SW MRS before auto-init (LPDDR5 step 26) */ +#define MRCTRL0_SW_INIT_INT BIT(3) +#define MRCTRL0_MR_TYPE_WR 0 +#define MRCTRL0_MR_TYPE_RD 1 + +/* DDRCTL_MRSTAT */ +#define MRSTAT_MR_WR_BUSY BIT(0) + +/* DDRCTL_PWRCTL */ +#define PWRCTL_SELFREF_SW BIT(5) +#define PWRCTL_SELFREF_EN BIT(0) + +/* DDRCTL_RFSHCTL0 */ +#define RFSHCTL0_DIS_AUTO_REFRESH BIT(0) + +/* DDRCTL_ZQCTL0 */ +#define ZQCTL0_DIS_AUTO_ZQ BIT(31) +#define ZQCTL0_DIS_SRX_ZQCL BIT(30) + +/* DDRCTL_DFILPCFG0 */ +#define DFILPCFG0_DFI_LP_EN_SR BIT(8) + +/* DDRCTL_DFIMISC */ +#define DFIMISC_DFI_INIT_COMPLETE_EN BIT(0) +#define DFIMISC_DFI_INIT_START BIT(5) + +/* DDRCTL_DFISTAT */ +#define DFISTAT_DFI_INIT_COMPLETE BIT(0) + +/* DDRCTL_DFIPHYMSTR */ +#define DFIPHYMSTR_DFI_PHYMSTR_EN BIT(0) + +/* DDRCTL_OPCTRLCAM */ +#define OPCTRLCAM_DBG_WR_Q_EMPTY BIT(26) +#define OPCTRLCAM_DBG_RD_Q_EMPTY BIT(25) + +/* DDRCTL_OPCTRL0 */ +#define OPCTRL0_DIS_HIF BIT(1) + +/* DDRCTL_SWCTL */ +#define SWCTL_SW_DONE BIT(0) + +/* DDRCTL_SWSTAT */ +#define SWSTAT_SW_DONE_ACK BIT(0) + +/* DDRCTL_RANKCTL */ +#define RANKCTL_DIFF_RANK_WR_GAP_MSB BIT(26) +#define RANKCTL_DIFF_RANK_RD_GAP_MSB BIT(24) +#define RANKCTL_DIFF_RANK_WR_GAP_MASK GENMASK(11, 8) +#define RANKCTL_DIFF_RANK_RD_GAP_MASK GENMASK(7, 4) +#define RANKCTL_MAX_RANK_RD_MASK GENMASK(3, 0) + +/* DDRCTL_DBICTL */ +#define DBICTL_DM_EN BIT(2) +#define DBICTL_WR_DBI_EN BIT(1) +#define DBICTL_RD_DBI_EN BIT(0) + +/* DDRCTL_PCTRL */ +#define PCTRL_PORT_EN BIT(0) + +/* DDRCTL_INITTMG0 */ +#define INITTMG0_PRE_CKE_X1024_MASK GENMASK(19, 0) +#define INITTMG0_POST_CKE_X1024_MASK GENMASK(29, 20) + +#endif /* _ASM_ARCH_SDRAM_PCTL_RK3576_H */ -- 2.45.1.windows.1

