xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-rockchip/sdram_rk3328.h (revision b8dc613cbc483a8abfcf4203e4fa0e18f60b1d27)
19fb0777eSKever Yang /*
29fb0777eSKever Yang  * Copyright (C) 2016-2017 Rockchip Electronics Co., Ltd
39fb0777eSKever Yang  *
49fb0777eSKever Yang  * SPDX-License-Identifier:     GPL-2.0+
59fb0777eSKever Yang  */
69fb0777eSKever Yang 
79fb0777eSKever Yang #ifndef _ASM_ARCH_SDRAM_RK3328_H
89fb0777eSKever Yang #define _ASM_ARCH_SDRAM_RK3328_H
9*16bd7102SYouMin Chen #include <asm/arch/sdram_common.h>
10*16bd7102SYouMin Chen #include <asm/arch/sdram_pctl_px30.h>
11*16bd7102SYouMin Chen #include <asm/arch/sdram_phy_px30.h>
12*16bd7102SYouMin Chen #include <asm/arch/sdram_phy_ron_rtt_px30.h>
139fb0777eSKever Yang 
149fb0777eSKever Yang #define SR_IDLE		93
159fb0777eSKever Yang #define PD_IDLE		13
169fb0777eSKever Yang #define SDRAM_ADDR	0x00000000
179fb0777eSKever Yang 
189fb0777eSKever Yang /* noc registers define */
199fb0777eSKever Yang #define DDRCONF				0x8
209fb0777eSKever Yang #define DDRTIMING			0xc
219fb0777eSKever Yang #define DDRMODE				0x10
229fb0777eSKever Yang #define READLATENCY			0x14
239fb0777eSKever Yang #define AGING0				0x18
249fb0777eSKever Yang #define AGING1				0x1c
259fb0777eSKever Yang #define AGING2				0x20
269fb0777eSKever Yang #define AGING3				0x24
279fb0777eSKever Yang #define AGING4				0x28
289fb0777eSKever Yang #define AGING5				0x2c
299fb0777eSKever Yang #define ACTIVATE			0x38
309fb0777eSKever Yang #define DEVTODEV			0x3c
319fb0777eSKever Yang #define DDR4TIMING			0x40
329fb0777eSKever Yang 
339fb0777eSKever Yang /* DDR GRF */
349fb0777eSKever Yang #define DDR_GRF_CON(n)		(0 + (n) * 4)
359fb0777eSKever Yang #define DDR_GRF_STATUS_BASE	(0X100)
369fb0777eSKever Yang #define DDR_GRF_STATUS(n)	(DDR_GRF_STATUS_BASE + (n) * 4)
379fb0777eSKever Yang 
389fb0777eSKever Yang /* CRU_SOFTRESET_CON5 */
39*16bd7102SYouMin Chen #define ddrphy_psrstn_req(n)    (((0x1 << 15) << 16) | ((n) << 15))
40*16bd7102SYouMin Chen #define ddrphy_srstn_req(n)     (((0x1 << 14) << 16) | ((n) << 14))
41*16bd7102SYouMin Chen #define ddrctrl_psrstn_req(n)	(((0x1 << 13) << 16) | ((n) << 13))
42*16bd7102SYouMin Chen #define ddrctrl_srstn_req(n)	(((0x1 << 12) << 16) | ((n) << 12))
43*16bd7102SYouMin Chen #define ddrmsch_srstn_req(n)	(((0x1 << 11) << 16) | ((n) << 11))
44*16bd7102SYouMin Chen #define msch_srstn_req(n)		(((0x1 << 9) << 16) | ((n) << 9))
45*16bd7102SYouMin Chen #define dfimon_srstn_req(n)		(((0x1 << 8) << 16) | ((n) << 8))
46*16bd7102SYouMin Chen #define grf_ddr_srstn_req(n)	(((0x1 << 7) << 16) | ((n) << 7))
479fb0777eSKever Yang /* CRU_SOFTRESET_CON9 */
48*16bd7102SYouMin Chen #define ddrctrl_asrstn_req(n)		(((0x1 << 9) << 16) | ((n) << 9))
499fb0777eSKever Yang 
509fb0777eSKever Yang /* CRU register */
519fb0777eSKever Yang #define CRU_PLL_CON(pll_id, n)	((pll_id)  * 0x20 + (n) * 4)
529fb0777eSKever Yang #define CRU_MODE				(0x80)
539fb0777eSKever Yang #define CRU_GLB_CNT_TH			(0x90)
549fb0777eSKever Yang #define CRU_CLKSEL_CON_BASE		0x100
559fb0777eSKever Yang #define CRU_CLKSELS_CON(i)		(CRU_CLKSEL_CON_BASE + ((i) * 4))
569fb0777eSKever Yang #define CRU_CLKGATE_CON_BASE		0x200
579fb0777eSKever Yang #define CRU_CLKGATE_CON(i)		(CRU_CLKGATE_CON_BASE + ((i) * 4))
589fb0777eSKever Yang #define CRU_CLKSFTRST_CON_BASE	0x300
599fb0777eSKever Yang #define CRU_CLKSFTRST_CON(i)	(CRU_CLKSFTRST_CON_BASE + ((i) * 4))
609fb0777eSKever Yang 
619fb0777eSKever Yang /* CRU_PLL_CON0 */
629fb0777eSKever Yang #define PB(n)         ((0x1 << (15 + 16)) | ((n) << 15))
639fb0777eSKever Yang #define POSTDIV1(n)   ((0x7 << (12 + 16)) | ((n) << 12))
649fb0777eSKever Yang #define FBDIV(n)      ((0xFFF << 16) | (n))
659fb0777eSKever Yang 
669fb0777eSKever Yang /* CRU_PLL_CON1 */
679fb0777eSKever Yang #define RSTMODE(n)    ((0x1 << (15 + 16)) | ((n) << 15))
689fb0777eSKever Yang #define RST(n)        ((0x1 << (14 + 16)) | ((n) << 14))
699fb0777eSKever Yang #define PD(n)         ((0x1 << (13 + 16)) | ((n) << 13))
709fb0777eSKever Yang #define DSMPD(n)      ((0x1 << (12 + 16)) | ((n) << 12))
719fb0777eSKever Yang #define LOCK(n)       (((n) >> 10) & 0x1)
729fb0777eSKever Yang #define POSTDIV2(n)   ((0x7 << (6 + 16)) | ((n) << 6))
739fb0777eSKever Yang #define REFDIV(n)     ((0x3F << 16) | (n))
749fb0777eSKever Yang 
759fb0777eSKever Yang u16 ddr_cfg_2_rbc[] = {
76*16bd7102SYouMin Chen 	/*
779fb0777eSKever Yang 	 * [5:4]  row(13+n)
789fb0777eSKever Yang 	 * [3]    cs(0:0 cs, 1:2 cs)
799fb0777eSKever Yang 	 * [2]  bank(0:0bank,1:8bank)
809fb0777eSKever Yang 	 * [1:0]    col(11+n)
81*16bd7102SYouMin Chen 	 */
829fb0777eSKever Yang 	/* row,        cs,       bank,   col */
839fb0777eSKever Yang 	((3 << 4) | (0 << 3) | (1 << 2) | 0),
849fb0777eSKever Yang 	((3 << 4) | (0 << 3) | (1 << 2) | 1),
859fb0777eSKever Yang 	((2 << 4) | (0 << 3) | (1 << 2) | 2),
869fb0777eSKever Yang 	((3 << 4) | (0 << 3) | (1 << 2) | 2),
879fb0777eSKever Yang 	((2 << 4) | (0 << 3) | (1 << 2) | 3),
889fb0777eSKever Yang 	((3 << 4) | (1 << 3) | (1 << 2) | 0),
899fb0777eSKever Yang 	((3 << 4) | (1 << 3) | (1 << 2) | 1),
909fb0777eSKever Yang 	((2 << 4) | (1 << 3) | (1 << 2) | 2),
919fb0777eSKever Yang 	((3 << 4) | (0 << 3) | (0 << 2) | 1),
929fb0777eSKever Yang 	((2 << 4) | (0 << 3) | (1 << 2) | 1),
939fb0777eSKever Yang };
949fb0777eSKever Yang 
959fb0777eSKever Yang u16 ddr4_cfg_2_rbc[] = {
969fb0777eSKever Yang 	/***************************
979fb0777eSKever Yang 	 * [6]	cs 0:0cs 1:2 cs
989fb0777eSKever Yang 	 * [5:3]  row(13+n)
999fb0777eSKever Yang 	 * [2]  cs(0:0 cs, 1:2 cs)
1009fb0777eSKever Yang 	 * [1]  bw    0: 16bit 1:32bit
1019fb0777eSKever Yang 	 * [0]  diebw 0:8bit 1:16bit
1029fb0777eSKever Yang 	 ***************************/
1039fb0777eSKever Yang 	/*  cs,       row,        cs,       bw,   diebw */
1049fb0777eSKever Yang 	((0 << 6) | (3 << 3) | (0 << 2) | (1 << 1) | 0),
1059fb0777eSKever Yang 	((1 << 6) | (2 << 3) | (0 << 2) | (1 << 1) | 0),
1069fb0777eSKever Yang 	((0 << 6) | (4 << 3) | (0 << 2) | (0 << 1) | 0),
1079fb0777eSKever Yang 	((1 << 6) | (3 << 3) | (0 << 2) | (0 << 1) | 0),
1089fb0777eSKever Yang 	((0 << 6) | (4 << 3) | (0 << 2) | (1 << 1) | 1),
1099fb0777eSKever Yang 	((1 << 6) | (3 << 3) | (0 << 2) | (1 << 1) | 1),
1109fb0777eSKever Yang 	((1 << 6) | (4 << 3) | (0 << 2) | (0 << 1) | 1),
1119fb0777eSKever Yang 	((0 << 6) | (2 << 3) | (1 << 2) | (1 << 1) | 0),
1129fb0777eSKever Yang 	((0 << 6) | (3 << 3) | (1 << 2) | (0 << 1) | 0),
1139fb0777eSKever Yang 	((0 << 6) | (3 << 3) | (1 << 2) | (1 << 1) | 1),
1149fb0777eSKever Yang 	((0 << 6) | (4 << 3) | (1 << 2) | (0 << 1) | 1),
1159fb0777eSKever Yang };
1169fb0777eSKever Yang 
1179fb0777eSKever Yang u32 addrmap[21][9] = {
1189fb0777eSKever Yang 	/* map0  map1  map2  map3  map4  map5  map6  map7  map8 */
1199fb0777eSKever Yang 	{22, 0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x06060606,
1209fb0777eSKever Yang 		0x06060606, 0x00000f0f, 0x3f3f},
1219fb0777eSKever Yang 	{23, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707,
1229fb0777eSKever Yang 		0x07070707, 0x00000f0f, 0x3f3f},
1239fb0777eSKever Yang 	{23, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808,
1249fb0777eSKever Yang 		0x0f080808, 0x00000f0f, 0x3f3f},
1259fb0777eSKever Yang 	{24, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808,
1269fb0777eSKever Yang 		0x08080808, 0x00000f0f, 0x3f3f},
1279fb0777eSKever Yang 	{24, 0x000a0a0a, 0x00000000, 0x00000000, 0x00000000, 0x09090909,
1289fb0777eSKever Yang 		0x0f090909, 0x00000f0f, 0x3f3f},
1299fb0777eSKever Yang 	{6, 0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x07070707,
1309fb0777eSKever Yang 		0x07070707, 0x00000f0f, 0x3f3f},
1319fb0777eSKever Yang 	{7, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x08080808,
1329fb0777eSKever Yang 		0x08080808, 0x00000f0f, 0x3f3f},
1339fb0777eSKever Yang 	{8, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x09090909,
1349fb0777eSKever Yang 		0x0f090909, 0x00000f0f, 0x3f3f},
1359fb0777eSKever Yang 	{22, 0x001f0808, 0x00000000, 0x00000000, 0x00001f1f, 0x06060606,
1369fb0777eSKever Yang 		0x06060606, 0x00000f0f, 0x3f3f},
1379fb0777eSKever Yang 	{23, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707,
1389fb0777eSKever Yang 		0x0f070707, 0x00000f0f, 0x3f3f},
1399fb0777eSKever Yang 
1409fb0777eSKever Yang 	{24, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
1419fb0777eSKever Yang 		0x08080808, 0x00000f0f, 0x0801},
1429fb0777eSKever Yang 	{23, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
1439fb0777eSKever Yang 		0x0f080808, 0x00000f0f, 0x0801},
1449fb0777eSKever Yang 	{24, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
1459fb0777eSKever Yang 		0x07070707, 0x00000f07, 0x0700},
1469fb0777eSKever Yang 	{23, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
1479fb0777eSKever Yang 		0x07070707, 0x00000f0f, 0x0700},
1489fb0777eSKever Yang 	{24, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707,
1499fb0777eSKever Yang 		0x07070707, 0x00000f07, 0x3f01},
1509fb0777eSKever Yang 	{23, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707,
1519fb0777eSKever Yang 		0x07070707, 0x00000f0f, 0x3f01},
1529fb0777eSKever Yang 	{24, 0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x06060606,
1539fb0777eSKever Yang 		0x06060606, 0x00000f06, 0x3f00},
1549fb0777eSKever Yang 	{8, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x09090909,
1559fb0777eSKever Yang 		0x0f090909, 0x00000f0f, 0x0801},
1569fb0777eSKever Yang 	{7, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x08080808,
1579fb0777eSKever Yang 		0x08080808, 0x00000f0f, 0x0700},
1589fb0777eSKever Yang 	{7, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
1599fb0777eSKever Yang 		0x08080808, 0x00000f0f, 0x3f01},
1609fb0777eSKever Yang 
1619fb0777eSKever Yang 	{6, 0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
1629fb0777eSKever Yang 		0x07070707, 0x00000f07, 0x3f00}
1639fb0777eSKever Yang };
1649fb0777eSKever Yang 
165*16bd7102SYouMin Chen struct rk3328_ddr_grf_regs {
166*16bd7102SYouMin Chen 	u32 ddr_grf_con[4];
167*16bd7102SYouMin Chen 	u32 reserved[(0x100 - 0x10) / 4];
168*16bd7102SYouMin Chen 	u32 ddr_grf_status[11];
1699fb0777eSKever Yang };
1709fb0777eSKever Yang 
171*16bd7102SYouMin Chen union noc_ddrtiming {
172*16bd7102SYouMin Chen 	u32 d32;
173*16bd7102SYouMin Chen 	struct {
174*16bd7102SYouMin Chen 		unsigned acttoact:6;
175*16bd7102SYouMin Chen 		unsigned rdtomiss:6;
176*16bd7102SYouMin Chen 		unsigned wrtomiss:6;
177*16bd7102SYouMin Chen 		unsigned burstlen:3;
178*16bd7102SYouMin Chen 		unsigned rdtowr:5;
179*16bd7102SYouMin Chen 		unsigned wrtord:5;
180*16bd7102SYouMin Chen 		unsigned bwratio:1;
181*16bd7102SYouMin Chen 	} b;
182*16bd7102SYouMin Chen };
183*16bd7102SYouMin Chen 
184*16bd7102SYouMin Chen union noc_activate {
185*16bd7102SYouMin Chen 	u32 d32;
186*16bd7102SYouMin Chen 	struct {
187*16bd7102SYouMin Chen 		unsigned rrd:4;
188*16bd7102SYouMin Chen 		unsigned faw:6;
189*16bd7102SYouMin Chen 		unsigned fawbank:1;
190*16bd7102SYouMin Chen 		unsigned reserved1:21;
191*16bd7102SYouMin Chen 	} b;
192*16bd7102SYouMin Chen };
193*16bd7102SYouMin Chen 
194*16bd7102SYouMin Chen union noc_devtodev {
195*16bd7102SYouMin Chen 	u32 d32;
196*16bd7102SYouMin Chen 	struct {
197*16bd7102SYouMin Chen 		unsigned busrdtord:2;
198*16bd7102SYouMin Chen 		unsigned busrdtowr:2;
199*16bd7102SYouMin Chen 		unsigned buswrtord:2;
200*16bd7102SYouMin Chen 		unsigned reserved2:26;
201*16bd7102SYouMin Chen 	} b;
202*16bd7102SYouMin Chen };
203*16bd7102SYouMin Chen 
204*16bd7102SYouMin Chen union noc_ddr4timing {
205*16bd7102SYouMin Chen 	u32 d32;
206*16bd7102SYouMin Chen 	struct {
207*16bd7102SYouMin Chen 		unsigned ccdl:3;
208*16bd7102SYouMin Chen 		unsigned wrtordl:5;
209*16bd7102SYouMin Chen 		unsigned rrdl:4;
210*16bd7102SYouMin Chen 		unsigned reserved2:20;
211*16bd7102SYouMin Chen 	} b;
212*16bd7102SYouMin Chen };
213*16bd7102SYouMin Chen 
214*16bd7102SYouMin Chen union noc_ddrmode {
215*16bd7102SYouMin Chen 	u32 d32;
216*16bd7102SYouMin Chen 	struct {
217*16bd7102SYouMin Chen 		unsigned autoprecharge:1;
218*16bd7102SYouMin Chen 		unsigned bwratioextended:1;
219*16bd7102SYouMin Chen 		unsigned reserved3:30;
220*16bd7102SYouMin Chen 	} b;
221*16bd7102SYouMin Chen };
222*16bd7102SYouMin Chen 
223*16bd7102SYouMin Chen struct msch_regs {
2249fb0777eSKever Yang 	u32 coreid;
2259fb0777eSKever Yang 	u32 revisionid;
2269fb0777eSKever Yang 	u32 ddrconf;
2279fb0777eSKever Yang 	u32 ddrtiming;
2289fb0777eSKever Yang 	u32 ddrmode;
2299fb0777eSKever Yang 	u32 readlatency;
2309fb0777eSKever Yang 	u32 aging0;
2319fb0777eSKever Yang 	u32 aging1;
2329fb0777eSKever Yang 	u32 aging2;
2339fb0777eSKever Yang 	u32 aging3;
2349fb0777eSKever Yang 	u32 aging4;
2359fb0777eSKever Yang 	u32 aging5;
2369fb0777eSKever Yang 	u32 reserved[2];
2379fb0777eSKever Yang 	u32 activate;
2389fb0777eSKever Yang 	u32 devtodev;
2399fb0777eSKever Yang 	u32 ddr4_timing;
2409fb0777eSKever Yang };
2419fb0777eSKever Yang 
242*16bd7102SYouMin Chen struct sdram_msch_timings {
243*16bd7102SYouMin Chen 	union noc_ddrtiming ddrtiming;
244*16bd7102SYouMin Chen 	union noc_ddrmode ddrmode;
245*16bd7102SYouMin Chen 	u32 readlatency;
246*16bd7102SYouMin Chen 	union noc_activate activate;
247*16bd7102SYouMin Chen 	union noc_devtodev devtodev;
248*16bd7102SYouMin Chen 	union noc_ddr4timing ddr4timing;
249*16bd7102SYouMin Chen 	u32 agingx0;
2509fb0777eSKever Yang };
2519fb0777eSKever Yang 
2529fb0777eSKever Yang struct rk3328_sdram_channel {
253*16bd7102SYouMin Chen 	struct sdram_cap_info cap_info;
254*16bd7102SYouMin Chen 	struct sdram_msch_timings noc_timings;
2559fb0777eSKever Yang };
2569fb0777eSKever Yang 
2579fb0777eSKever Yang struct rk3328_sdram_params {
2589fb0777eSKever Yang 	struct rk3328_sdram_channel ch;
259*16bd7102SYouMin Chen 	struct sdram_base_params base;
260*16bd7102SYouMin Chen 	struct ddr_pctl_regs pctl_regs;
261*16bd7102SYouMin Chen 	struct ddr_phy_regs phy_regs;
262*16bd7102SYouMin Chen 	struct ddr_phy_skew skew;
2639fb0777eSKever Yang };
2649fb0777eSKever Yang 
2659fb0777eSKever Yang #endif
266