xref: /OK3568_Linux_fs/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3328.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2016-2017 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:     GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _ASM_ARCH_SDRAM_RK3328_H
8*4882a593Smuzhiyun #define _ASM_ARCH_SDRAM_RK3328_H
9*4882a593Smuzhiyun #include <asm/arch/sdram_common.h>
10*4882a593Smuzhiyun #include <asm/arch/sdram_pctl_px30.h>
11*4882a593Smuzhiyun #include <asm/arch/sdram_phy_px30.h>
12*4882a593Smuzhiyun #include <asm/arch/sdram_phy_ron_rtt_px30.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define SR_IDLE		93
15*4882a593Smuzhiyun #define PD_IDLE		13
16*4882a593Smuzhiyun #define SDRAM_ADDR	0x00000000
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /* noc registers define */
19*4882a593Smuzhiyun #define DDRCONF				0x8
20*4882a593Smuzhiyun #define DDRTIMING			0xc
21*4882a593Smuzhiyun #define DDRMODE				0x10
22*4882a593Smuzhiyun #define READLATENCY			0x14
23*4882a593Smuzhiyun #define AGING0				0x18
24*4882a593Smuzhiyun #define AGING1				0x1c
25*4882a593Smuzhiyun #define AGING2				0x20
26*4882a593Smuzhiyun #define AGING3				0x24
27*4882a593Smuzhiyun #define AGING4				0x28
28*4882a593Smuzhiyun #define AGING5				0x2c
29*4882a593Smuzhiyun #define ACTIVATE			0x38
30*4882a593Smuzhiyun #define DEVTODEV			0x3c
31*4882a593Smuzhiyun #define DDR4TIMING			0x40
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* DDR GRF */
34*4882a593Smuzhiyun #define DDR_GRF_CON(n)		(0 + (n) * 4)
35*4882a593Smuzhiyun #define DDR_GRF_STATUS_BASE	(0X100)
36*4882a593Smuzhiyun #define DDR_GRF_STATUS(n)	(DDR_GRF_STATUS_BASE + (n) * 4)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* CRU_SOFTRESET_CON5 */
39*4882a593Smuzhiyun #define ddrphy_psrstn_req(n)    (((0x1 << 15) << 16) | ((n) << 15))
40*4882a593Smuzhiyun #define ddrphy_srstn_req(n)     (((0x1 << 14) << 16) | ((n) << 14))
41*4882a593Smuzhiyun #define ddrctrl_psrstn_req(n)	(((0x1 << 13) << 16) | ((n) << 13))
42*4882a593Smuzhiyun #define ddrctrl_srstn_req(n)	(((0x1 << 12) << 16) | ((n) << 12))
43*4882a593Smuzhiyun #define ddrmsch_srstn_req(n)	(((0x1 << 11) << 16) | ((n) << 11))
44*4882a593Smuzhiyun #define msch_srstn_req(n)		(((0x1 << 9) << 16) | ((n) << 9))
45*4882a593Smuzhiyun #define dfimon_srstn_req(n)		(((0x1 << 8) << 16) | ((n) << 8))
46*4882a593Smuzhiyun #define grf_ddr_srstn_req(n)	(((0x1 << 7) << 16) | ((n) << 7))
47*4882a593Smuzhiyun /* CRU_SOFTRESET_CON9 */
48*4882a593Smuzhiyun #define ddrctrl_asrstn_req(n)		(((0x1 << 9) << 16) | ((n) << 9))
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /* CRU register */
51*4882a593Smuzhiyun #define CRU_PLL_CON(pll_id, n)	((pll_id)  * 0x20 + (n) * 4)
52*4882a593Smuzhiyun #define CRU_MODE				(0x80)
53*4882a593Smuzhiyun #define CRU_GLB_CNT_TH			(0x90)
54*4882a593Smuzhiyun #define CRU_CLKSEL_CON_BASE		0x100
55*4882a593Smuzhiyun #define CRU_CLKSELS_CON(i)		(CRU_CLKSEL_CON_BASE + ((i) * 4))
56*4882a593Smuzhiyun #define CRU_CLKGATE_CON_BASE		0x200
57*4882a593Smuzhiyun #define CRU_CLKGATE_CON(i)		(CRU_CLKGATE_CON_BASE + ((i) * 4))
58*4882a593Smuzhiyun #define CRU_CLKSFTRST_CON_BASE	0x300
59*4882a593Smuzhiyun #define CRU_CLKSFTRST_CON(i)	(CRU_CLKSFTRST_CON_BASE + ((i) * 4))
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* CRU_PLL_CON0 */
62*4882a593Smuzhiyun #define PB(n)         ((0x1 << (15 + 16)) | ((n) << 15))
63*4882a593Smuzhiyun #define POSTDIV1(n)   ((0x7 << (12 + 16)) | ((n) << 12))
64*4882a593Smuzhiyun #define FBDIV(n)      ((0xFFF << 16) | (n))
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* CRU_PLL_CON1 */
67*4882a593Smuzhiyun #define RSTMODE(n)    ((0x1 << (15 + 16)) | ((n) << 15))
68*4882a593Smuzhiyun #define RST(n)        ((0x1 << (14 + 16)) | ((n) << 14))
69*4882a593Smuzhiyun #define PD(n)         ((0x1 << (13 + 16)) | ((n) << 13))
70*4882a593Smuzhiyun #define DSMPD(n)      ((0x1 << (12 + 16)) | ((n) << 12))
71*4882a593Smuzhiyun #define LOCK(n)       (((n) >> 10) & 0x1)
72*4882a593Smuzhiyun #define POSTDIV2(n)   ((0x7 << (6 + 16)) | ((n) << 6))
73*4882a593Smuzhiyun #define REFDIV(n)     ((0x3F << 16) | (n))
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun u16 ddr_cfg_2_rbc[] = {
76*4882a593Smuzhiyun 	/*
77*4882a593Smuzhiyun 	 * [5:4]  row(13+n)
78*4882a593Smuzhiyun 	 * [3]    cs(0:0 cs, 1:2 cs)
79*4882a593Smuzhiyun 	 * [2]  bank(0:0bank,1:8bank)
80*4882a593Smuzhiyun 	 * [1:0]    col(11+n)
81*4882a593Smuzhiyun 	 */
82*4882a593Smuzhiyun 	/* row,        cs,       bank,   col */
83*4882a593Smuzhiyun 	((3 << 4) | (0 << 3) | (1 << 2) | 0),
84*4882a593Smuzhiyun 	((3 << 4) | (0 << 3) | (1 << 2) | 1),
85*4882a593Smuzhiyun 	((2 << 4) | (0 << 3) | (1 << 2) | 2),
86*4882a593Smuzhiyun 	((3 << 4) | (0 << 3) | (1 << 2) | 2),
87*4882a593Smuzhiyun 	((2 << 4) | (0 << 3) | (1 << 2) | 3),
88*4882a593Smuzhiyun 	((3 << 4) | (1 << 3) | (1 << 2) | 0),
89*4882a593Smuzhiyun 	((3 << 4) | (1 << 3) | (1 << 2) | 1),
90*4882a593Smuzhiyun 	((2 << 4) | (1 << 3) | (1 << 2) | 2),
91*4882a593Smuzhiyun 	((3 << 4) | (0 << 3) | (0 << 2) | 1),
92*4882a593Smuzhiyun 	((2 << 4) | (0 << 3) | (1 << 2) | 1),
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun u16 ddr4_cfg_2_rbc[] = {
96*4882a593Smuzhiyun 	/***************************
97*4882a593Smuzhiyun 	 * [6]	cs 0:0cs 1:2 cs
98*4882a593Smuzhiyun 	 * [5:3]  row(13+n)
99*4882a593Smuzhiyun 	 * [2]  cs(0:0 cs, 1:2 cs)
100*4882a593Smuzhiyun 	 * [1]  bw    0: 16bit 1:32bit
101*4882a593Smuzhiyun 	 * [0]  diebw 0:8bit 1:16bit
102*4882a593Smuzhiyun 	 ***************************/
103*4882a593Smuzhiyun 	/*  cs,       row,        cs,       bw,   diebw */
104*4882a593Smuzhiyun 	((0 << 6) | (3 << 3) | (0 << 2) | (1 << 1) | 0),
105*4882a593Smuzhiyun 	((1 << 6) | (2 << 3) | (0 << 2) | (1 << 1) | 0),
106*4882a593Smuzhiyun 	((0 << 6) | (4 << 3) | (0 << 2) | (0 << 1) | 0),
107*4882a593Smuzhiyun 	((1 << 6) | (3 << 3) | (0 << 2) | (0 << 1) | 0),
108*4882a593Smuzhiyun 	((0 << 6) | (4 << 3) | (0 << 2) | (1 << 1) | 1),
109*4882a593Smuzhiyun 	((1 << 6) | (3 << 3) | (0 << 2) | (1 << 1) | 1),
110*4882a593Smuzhiyun 	((1 << 6) | (4 << 3) | (0 << 2) | (0 << 1) | 1),
111*4882a593Smuzhiyun 	((0 << 6) | (2 << 3) | (1 << 2) | (1 << 1) | 0),
112*4882a593Smuzhiyun 	((0 << 6) | (3 << 3) | (1 << 2) | (0 << 1) | 0),
113*4882a593Smuzhiyun 	((0 << 6) | (3 << 3) | (1 << 2) | (1 << 1) | 1),
114*4882a593Smuzhiyun 	((0 << 6) | (4 << 3) | (1 << 2) | (0 << 1) | 1),
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun u32 addrmap[21][9] = {
118*4882a593Smuzhiyun 	/* map0  map1  map2  map3  map4  map5  map6  map7  map8 */
119*4882a593Smuzhiyun 	{22, 0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x06060606,
120*4882a593Smuzhiyun 		0x06060606, 0x00000f0f, 0x3f3f},
121*4882a593Smuzhiyun 	{23, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707,
122*4882a593Smuzhiyun 		0x07070707, 0x00000f0f, 0x3f3f},
123*4882a593Smuzhiyun 	{23, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808,
124*4882a593Smuzhiyun 		0x0f080808, 0x00000f0f, 0x3f3f},
125*4882a593Smuzhiyun 	{24, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808,
126*4882a593Smuzhiyun 		0x08080808, 0x00000f0f, 0x3f3f},
127*4882a593Smuzhiyun 	{24, 0x000a0a0a, 0x00000000, 0x00000000, 0x00000000, 0x09090909,
128*4882a593Smuzhiyun 		0x0f090909, 0x00000f0f, 0x3f3f},
129*4882a593Smuzhiyun 	{6, 0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x07070707,
130*4882a593Smuzhiyun 		0x07070707, 0x00000f0f, 0x3f3f},
131*4882a593Smuzhiyun 	{7, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x08080808,
132*4882a593Smuzhiyun 		0x08080808, 0x00000f0f, 0x3f3f},
133*4882a593Smuzhiyun 	{8, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x09090909,
134*4882a593Smuzhiyun 		0x0f090909, 0x00000f0f, 0x3f3f},
135*4882a593Smuzhiyun 	{22, 0x001f0808, 0x00000000, 0x00000000, 0x00001f1f, 0x06060606,
136*4882a593Smuzhiyun 		0x06060606, 0x00000f0f, 0x3f3f},
137*4882a593Smuzhiyun 	{23, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707,
138*4882a593Smuzhiyun 		0x0f070707, 0x00000f0f, 0x3f3f},
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	{24, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
141*4882a593Smuzhiyun 		0x08080808, 0x00000f0f, 0x0801},
142*4882a593Smuzhiyun 	{23, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
143*4882a593Smuzhiyun 		0x0f080808, 0x00000f0f, 0x0801},
144*4882a593Smuzhiyun 	{24, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
145*4882a593Smuzhiyun 		0x07070707, 0x00000f07, 0x0700},
146*4882a593Smuzhiyun 	{23, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
147*4882a593Smuzhiyun 		0x07070707, 0x00000f0f, 0x0700},
148*4882a593Smuzhiyun 	{24, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707,
149*4882a593Smuzhiyun 		0x07070707, 0x00000f07, 0x3f01},
150*4882a593Smuzhiyun 	{23, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707,
151*4882a593Smuzhiyun 		0x07070707, 0x00000f0f, 0x3f01},
152*4882a593Smuzhiyun 	{24, 0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x06060606,
153*4882a593Smuzhiyun 		0x06060606, 0x00000f06, 0x3f00},
154*4882a593Smuzhiyun 	{8, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x09090909,
155*4882a593Smuzhiyun 		0x0f090909, 0x00000f0f, 0x0801},
156*4882a593Smuzhiyun 	{7, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x08080808,
157*4882a593Smuzhiyun 		0x08080808, 0x00000f0f, 0x0700},
158*4882a593Smuzhiyun 	{7, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
159*4882a593Smuzhiyun 		0x08080808, 0x00000f0f, 0x3f01},
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	{6, 0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
162*4882a593Smuzhiyun 		0x07070707, 0x00000f07, 0x3f00}
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun struct rk3328_ddr_grf_regs {
166*4882a593Smuzhiyun 	u32 ddr_grf_con[4];
167*4882a593Smuzhiyun 	u32 reserved[(0x100 - 0x10) / 4];
168*4882a593Smuzhiyun 	u32 ddr_grf_status[11];
169*4882a593Smuzhiyun };
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun union noc_ddrtiming {
172*4882a593Smuzhiyun 	u32 d32;
173*4882a593Smuzhiyun 	struct {
174*4882a593Smuzhiyun 		unsigned acttoact:6;
175*4882a593Smuzhiyun 		unsigned rdtomiss:6;
176*4882a593Smuzhiyun 		unsigned wrtomiss:6;
177*4882a593Smuzhiyun 		unsigned burstlen:3;
178*4882a593Smuzhiyun 		unsigned rdtowr:5;
179*4882a593Smuzhiyun 		unsigned wrtord:5;
180*4882a593Smuzhiyun 		unsigned bwratio:1;
181*4882a593Smuzhiyun 	} b;
182*4882a593Smuzhiyun };
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun union noc_activate {
185*4882a593Smuzhiyun 	u32 d32;
186*4882a593Smuzhiyun 	struct {
187*4882a593Smuzhiyun 		unsigned rrd:4;
188*4882a593Smuzhiyun 		unsigned faw:6;
189*4882a593Smuzhiyun 		unsigned fawbank:1;
190*4882a593Smuzhiyun 		unsigned reserved1:21;
191*4882a593Smuzhiyun 	} b;
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun union noc_devtodev {
195*4882a593Smuzhiyun 	u32 d32;
196*4882a593Smuzhiyun 	struct {
197*4882a593Smuzhiyun 		unsigned busrdtord:2;
198*4882a593Smuzhiyun 		unsigned busrdtowr:2;
199*4882a593Smuzhiyun 		unsigned buswrtord:2;
200*4882a593Smuzhiyun 		unsigned reserved2:26;
201*4882a593Smuzhiyun 	} b;
202*4882a593Smuzhiyun };
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun union noc_ddr4timing {
205*4882a593Smuzhiyun 	u32 d32;
206*4882a593Smuzhiyun 	struct {
207*4882a593Smuzhiyun 		unsigned ccdl:3;
208*4882a593Smuzhiyun 		unsigned wrtordl:5;
209*4882a593Smuzhiyun 		unsigned rrdl:4;
210*4882a593Smuzhiyun 		unsigned reserved2:20;
211*4882a593Smuzhiyun 	} b;
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun union noc_ddrmode {
215*4882a593Smuzhiyun 	u32 d32;
216*4882a593Smuzhiyun 	struct {
217*4882a593Smuzhiyun 		unsigned autoprecharge:1;
218*4882a593Smuzhiyun 		unsigned bwratioextended:1;
219*4882a593Smuzhiyun 		unsigned reserved3:30;
220*4882a593Smuzhiyun 	} b;
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun struct msch_regs {
224*4882a593Smuzhiyun 	u32 coreid;
225*4882a593Smuzhiyun 	u32 revisionid;
226*4882a593Smuzhiyun 	u32 ddrconf;
227*4882a593Smuzhiyun 	u32 ddrtiming;
228*4882a593Smuzhiyun 	u32 ddrmode;
229*4882a593Smuzhiyun 	u32 readlatency;
230*4882a593Smuzhiyun 	u32 aging0;
231*4882a593Smuzhiyun 	u32 aging1;
232*4882a593Smuzhiyun 	u32 aging2;
233*4882a593Smuzhiyun 	u32 aging3;
234*4882a593Smuzhiyun 	u32 aging4;
235*4882a593Smuzhiyun 	u32 aging5;
236*4882a593Smuzhiyun 	u32 reserved[2];
237*4882a593Smuzhiyun 	u32 activate;
238*4882a593Smuzhiyun 	u32 devtodev;
239*4882a593Smuzhiyun 	u32 ddr4_timing;
240*4882a593Smuzhiyun };
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun struct sdram_msch_timings {
243*4882a593Smuzhiyun 	union noc_ddrtiming ddrtiming;
244*4882a593Smuzhiyun 	union noc_ddrmode ddrmode;
245*4882a593Smuzhiyun 	u32 readlatency;
246*4882a593Smuzhiyun 	union noc_activate activate;
247*4882a593Smuzhiyun 	union noc_devtodev devtodev;
248*4882a593Smuzhiyun 	union noc_ddr4timing ddr4timing;
249*4882a593Smuzhiyun 	u32 agingx0;
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun struct rk3328_sdram_channel {
253*4882a593Smuzhiyun 	struct sdram_cap_info cap_info;
254*4882a593Smuzhiyun 	struct sdram_msch_timings noc_timings;
255*4882a593Smuzhiyun };
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun struct rk3328_sdram_params {
258*4882a593Smuzhiyun 	struct rk3328_sdram_channel ch;
259*4882a593Smuzhiyun 	struct sdram_base_params base;
260*4882a593Smuzhiyun 	struct ddr_pctl_regs pctl_regs;
261*4882a593Smuzhiyun 	struct ddr_phy_regs phy_regs;
262*4882a593Smuzhiyun 	struct ddr_phy_skew skew;
263*4882a593Smuzhiyun };
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun #endif
266