1 /*
2  * (C) Copyright 2015 Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6 #ifndef _ASM_ARCH_SDRAM_RK3036_H
7 #define _ASM_ARCH_SDRAM_RK3036_H
8 
9 #include <common.h>
10 
11 struct rk3036_ddr_pctl {
12 	u32 scfg;
13 	u32 sctl;
14 	u32 stat;
15 	u32 intrstat;
16 	u32 reserved0[12];
17 	u32 mcmd;
18 	u32 powctl;
19 	u32 powstat;
20 	u32 cmdtstat;
21 	u32 cmdtstaten;
22 	u32 reserved1[3];
23 	u32 mrrcfg0;
24 	u32 mrrstat0;
25 	u32 mrrstat1;
26 	u32 reserved2[4];
27 	u32 mcfg1;
28 	u32 mcfg;
29 	u32 ppcfg;
30 	u32 mstat;
31 	u32 lpddr2zqcfg;
32 	u32 reserved3;
33 	u32 dtupdes;
34 	u32 dtuna;
35 	u32 dtune;
36 	u32 dtuprd0;
37 	u32 dtuprd1;
38 	u32 dtuprd2;
39 	u32 dtuprd3;
40 	u32 dtuawdt;
41 	u32 reserved4[3];
42 	u32 togcnt1u;
43 	u32 tinit;
44 	u32 trsth;
45 	u32 togcnt100n;
46 	u32 trefi;
47 	u32 tmrd;
48 	u32 trfc;
49 	u32 trp;
50 	u32 trtw;
51 	u32 tal;
52 	u32 tcl;
53 	u32 tcwl;
54 	u32 tras;
55 	u32 trc;
56 	u32 trcd;
57 	u32 trrd;
58 	u32 trtp;
59 	u32 twr;
60 	u32 twtr;
61 	u32 texsr;
62 	u32 txp;
63 	u32 txpdll;
64 	u32 tzqcs;
65 	u32 tzqcsi;
66 	u32 tdqs;
67 	u32 tcksre;
68 	u32 tcksrx;
69 	u32 tcke;
70 	u32 tmod;
71 	u32 trstl;
72 	u32 tzqcl;
73 	u32 tmrr;
74 	u32 tckesr;
75 	u32 reserved5[47];
76 	u32 dtuwactl;
77 	u32 dturactl;
78 	u32 dtucfg;
79 	u32 dtuectl;
80 	u32 dtuwd0;
81 	u32 dtuwd1;
82 	u32 dtuwd2;
83 	u32 dtuwd3;
84 	u32 dtuwdm;
85 	u32 dturd0;
86 	u32 dturd1;
87 	u32 dturd2;
88 	u32 dturd3;
89 	u32 dtulfsrwd;
90 	u32 dtulfsrrd;
91 	u32 dtueaf;
92 	u32 dfitctrldelay;
93 	u32 dfiodtcfg;
94 	u32 dfiodtcfg1;
95 	u32 dfiodtrankmap;
96 	u32 dfitphywrdata;
97 	u32 dfitphywrlat;
98 	u32 reserved7[2];
99 	u32 dfitrddataen;
100 	u32 dfitphyrdlat;
101 	u32 reserved8[2];
102 	u32 dfitphyupdtype0;
103 	u32 dfitphyupdtype1;
104 	u32 dfitphyupdtype2;
105 	u32 dfitphyupdtype3;
106 	u32 dfitctrlupdmin;
107 	u32 dfitctrlupdmax;
108 	u32 dfitctrlupddly;
109 	u32 reserved9;
110 	u32 dfiupdcfg;
111 	u32 dfitrefmski;
112 	u32 dfitctrlupdi;
113 	u32 reserved10[4];
114 	u32 dfitrcfg0;
115 	u32 dfitrstat0;
116 	u32 dfitrwrlvlen;
117 	u32 dfitrrdlvlen;
118 	u32 dfitrrdlvlgateen;
119 	u32 dfiststat0;
120 	u32 dfistcfg0;
121 	u32 dfistcfg1;
122 	u32 reserved11;
123 	u32 dfitdramclken;
124 	u32 dfitdramclkdis;
125 	u32 dfistcfg2;
126 	u32 dfistparclr;
127 	u32 dfistparlog;
128 	u32 reserved12[3];
129 	u32 dfilpcfg0;
130 	u32 reserved13[3];
131 	u32 dfitrwrlvlresp0;
132 	u32 dfitrwrlvlresp1;
133 	u32 dfitrwrlvlresp2;
134 	u32 dfitrrdlvlresp0;
135 	u32 dfitrrdlvlresp1;
136 	u32 dfitrrdlvlresp2;
137 	u32 dfitrwrlvldelay0;
138 	u32 dfitrwrlvldelay1;
139 	u32 dfitrwrlvldelay2;
140 	u32 dfitrrdlvldelay0;
141 	u32 dfitrrdlvldelay1;
142 	u32 dfitrrdlvldelay2;
143 	u32 dfitrrdlvlgatedelay0;
144 	u32 dfitrrdlvlgatedelay1;
145 	u32 dfitrrdlvlgatedelay2;
146 	u32 dfitrcmd;
147 	u32 reserved14[46];
148 	u32 ipvr;
149 	u32 iptr;
150 };
151 check_member(rk3036_ddr_pctl, iptr, 0x03fc);
152 
153 struct rk3036_ddr_phy {
154 	u32 ddrphy_reg1;
155 	u32 ddrphy_reg3;
156 	u32 ddrphy_reg2;
157 	u32 reserve[11];
158 	u32 ddrphy_reg4a;
159 	u32 ddrphy_reg4b;
160 	u32 reserve1[5];
161 	u32 ddrphy_reg16;
162 	u32 reserve2;
163 	u32 ddrphy_reg18;
164 	u32 ddrphy_reg19;
165 	u32 reserve3;
166 	u32 ddrphy_reg21;
167 	u32 reserve4;
168 	u32 ddrphy_reg22;
169 	u32 reserve5[3];
170 	u32 ddrphy_reg25;
171 	u32 ddrphy_reg26;
172 	u32 ddrphy_reg27;
173 	u32 ddrphy_reg28;
174 	u32 reserve6[17];
175 	u32 ddrphy_reg6;
176 	u32 ddrphy_reg7;
177 	u32 reserve7;
178 	u32 ddrphy_reg8;
179 	u32 ddrphy_reg0e4;
180 	u32 reserve8[11];
181 	u32 ddrphy_reg9;
182 	u32 ddrphy_reg10;
183 	u32 reserve9;
184 	u32 ddrphy_reg11;
185 	u32 ddrphy_reg124;
186 	u32 reserve10[38];
187 	u32 ddrphy_reg29;
188 	u32 reserve11[40];
189 	u32 ddrphy_reg264;
190 	u32 reserve12[18];
191 	u32 ddrphy_reg2a;
192 	u32 reserve13[4];
193 	u32 ddrphy_reg30;
194 	u32 ddrphy_reg31;
195 	u32 ddrphy_reg32;
196 	u32 ddrphy_reg33;
197 	u32 ddrphy_reg34;
198 	u32 ddrphy_reg35;
199 	u32 ddrphy_reg36;
200 	u32 ddrphy_reg37;
201 	u32 ddrphy_reg38;
202 	u32 ddrphy_reg39;
203 	u32 ddrphy_reg40;
204 	u32 ddrphy_reg41;
205 	u32 ddrphy_reg42;
206 	u32 ddrphy_reg43;
207 	u32 ddrphy_reg44;
208 	u32 ddrphy_reg45;
209 	u32 ddrphy_reg46;
210 	u32 ddrphy_reg47;
211 	u32 ddrphy_reg48;
212 	u32 ddrphy_reg49;
213 	u32 ddrphy_reg50;
214 	u32 ddrphy_reg51;
215 	u32 ddrphy_reg52;
216 	u32 ddrphy_reg53;
217 	u32 reserve14;
218 	u32 ddrphy_reg54;
219 	u32 ddrphy_reg55;
220 	u32 ddrphy_reg56;
221 	u32 ddrphy_reg57;
222 	u32 ddrphy_reg58;
223 	u32 ddrphy_reg59;
224 	u32 ddrphy_reg5a;
225 	u32 ddrphy_reg5b;
226 	u32 ddrphy_reg5c;
227 	u32 ddrphy_reg5d;
228 	u32 ddrphy_reg5e;
229 	u32 reserve15[28];
230 	u32 ddrphy_reg5f;
231 	u32 reserve16[6];
232 	u32 ddrphy_reg60;
233 	u32 ddrphy_reg61;
234 	u32 ddrphy_reg62;
235 };
236 check_member(rk3036_ddr_phy, ddrphy_reg62, 0x03e8);
237 
238 struct rk3036_pctl_timing {
239 	u32 togcnt1u;
240 	u32 tinit;
241 	u32 trsth;
242 	u32 togcnt100n;
243 	u32 trefi;
244 	u32 tmrd;
245 	u32 trfc;
246 	u32 trp;
247 	u32 trtw;
248 	u32 tal;
249 	u32 tcl;
250 	u32 tcwl;
251 	u32 tras;
252 	u32 trc;
253 	u32 trcd;
254 	u32 trrd;
255 	u32 trtp;
256 	u32 twr;
257 	u32 twtr;
258 	u32 texsr;
259 	u32 txp;
260 	u32 txpdll;
261 	u32 tzqcs;
262 	u32 tzqcsi;
263 	u32 tdqs;
264 	u32 tcksre;
265 	u32 tcksrx;
266 	u32 tcke;
267 	u32 tmod;
268 	u32 trstl;
269 	u32 tzqcl;
270 	u32 tmrr;
271 	u32 tckesr;
272 	u32 tdpd;
273 };
274 
275 struct rk3036_phy_timing {
276 	u32 mr[4];
277 	u32 bl;
278 	u32 cl_al;
279 };
280 
281 typedef union {
282 	u32 noc_timing;
283 	struct {
284 		u32 acttoact:6;
285 		u32 rdtomiss:6;
286 		u32 wrtomiss:6;
287 		u32 burstlen:3;
288 		u32 rdtowr:5;
289 		u32 wrtord:5;
290 		u32 bwratio:1;
291 	};
292 } rk3036_noc_timing;
293 
294 struct rk3036_ddr_timing {
295 	u32 freq;
296 	struct rk3036_pctl_timing pctl_timing;
297 	struct rk3036_phy_timing phy_timing;
298 	rk3036_noc_timing noc_timing;
299 };
300 
301 struct rk3036_service_sys {
302 	u32 id_coreid;
303 	u32 id_revisionid;
304 	u32 ddrconf;
305 	u32 ddrtiming;
306 	u32 ddrmode;
307 	u32 readlatency;
308 };
309 
310 struct rk3036_ddr_config {
311 	/*
312 	 * 000: lpddr
313 	 * 001: ddr
314 	 * 010: ddr2
315 	 * 011: ddr3
316 	 * 100: lpddr2-s2
317 	 * 101: lpddr2-s4
318 	 * 110: lpddr3
319 	 */
320 	u32 ddr_type;
321 	u32 rank;
322 	u32 cs0_row;
323 	u32 cs1_row;
324 
325 	/* 2: 4bank, 3: 8bank */
326 	u32 bank;
327 	u32 col;
328 
329 	/* bw(0: 8bit, 1: 16bit, 2: 32bit) */
330 	u32 bw;
331 };
332 
333 /* rk3036 sdram initial */
334 void sdram_init(void);
335 
336 /* get ddr die config, implement in specific board */
337 void get_ddr_config(struct rk3036_ddr_config *config);
338 
339 /* get ddr size on board */
340 size_t sdram_size(void);
341 #endif
342