xref: /rk3399_ARM-atf/plat/rockchip/rk3399/drivers/dram/dram_spec_timing.h (revision 4bd8c929b4bc6e1731c2892b38d4a8c43e8e89dc)
1fe877779SCaesar Wang /*
2fe877779SCaesar Wang  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3fe877779SCaesar Wang  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5fe877779SCaesar Wang  */
6fe877779SCaesar Wang 
7c3cf06f1SAntonio Nino Diaz #ifndef DRAM_SPEC_TIMING_H
8c3cf06f1SAntonio Nino Diaz #define DRAM_SPEC_TIMING_H
9c3cf06f1SAntonio Nino Diaz 
10fe877779SCaesar Wang #include <stdint.h>
11fe877779SCaesar Wang 
12fe877779SCaesar Wang enum ddr3_speed_rate {
13fe877779SCaesar Wang 	/* 5-5-5 */
14fe877779SCaesar Wang 	DDR3_800D = 0,
15fe877779SCaesar Wang 	/* 6-6-6 */
16fe877779SCaesar Wang 	DDR3_800E = 1,
17fe877779SCaesar Wang 	/* 6-6-6 */
18fe877779SCaesar Wang 	DDR3_1066E = 2,
19fe877779SCaesar Wang 	/* 7-7-7 */
20fe877779SCaesar Wang 	DDR3_1066F = 3,
21fe877779SCaesar Wang 	/* 8-8-8 */
22fe877779SCaesar Wang 	DDR3_1066G = 4,
23fe877779SCaesar Wang 	/* 7-7-7 */
24fe877779SCaesar Wang 	DDR3_1333F = 5,
25fe877779SCaesar Wang 	/* 8-8-8 */
26fe877779SCaesar Wang 	DDR3_1333G = 6,
27fe877779SCaesar Wang 	/* 9-9-9 */
28fe877779SCaesar Wang 	DDR3_1333H = 7,
29fe877779SCaesar Wang 	/* 10-10-10 */
30fe877779SCaesar Wang 	DDR3_1333J = 8,
31fe877779SCaesar Wang 	/* 8-8-8 */
32fe877779SCaesar Wang 	DDR3_1600G = 9,
33fe877779SCaesar Wang 	/* 9-9-9 */
34fe877779SCaesar Wang 	DDR3_1600H = 10,
35fe877779SCaesar Wang 	/* 10-10-10 */
36fe877779SCaesar Wang 	DDR3_1600J = 11,
37fe877779SCaesar Wang 	/* 11-11-11 */
38fe877779SCaesar Wang 	DDR3_1600K = 12,
39fe877779SCaesar Wang 	/* 10-10-10 */
40fe877779SCaesar Wang 	DDR3_1866J = 13,
41fe877779SCaesar Wang 	/* 11-11-11 */
42fe877779SCaesar Wang 	DDR3_1866K = 14,
43fe877779SCaesar Wang 	/* 12-12-12 */
44fe877779SCaesar Wang 	DDR3_1866L = 15,
45fe877779SCaesar Wang 	/* 13-13-13 */
46fe877779SCaesar Wang 	DDR3_1866M = 16,
47fe877779SCaesar Wang 	/* 11-11-11 */
48fe877779SCaesar Wang 	DDR3_2133K = 17,
49fe877779SCaesar Wang 	/* 12-12-12 */
50fe877779SCaesar Wang 	DDR3_2133L = 18,
51fe877779SCaesar Wang 	/* 13-13-13 */
52fe877779SCaesar Wang 	DDR3_2133M = 19,
53fe877779SCaesar Wang 	/* 14-14-14 */
54fe877779SCaesar Wang 	DDR3_2133N = 20,
55fe877779SCaesar Wang 	DDR3_DEFAULT = 21,
56fe877779SCaesar Wang };
57fe877779SCaesar Wang 
58fe877779SCaesar Wang #define max(a, b)  (((a) > (b)) ? (a) : (b))
59fe877779SCaesar Wang #define range(mi, val, ma)  (((ma) > (val)) ? (max(mi, val)) : (ma))
60fe877779SCaesar Wang 
61fe877779SCaesar Wang struct dram_timing_t {
62fe877779SCaesar Wang 	/* unit MHz */
63fe877779SCaesar Wang 	uint32_t mhz;
64fe877779SCaesar Wang 	/* some timing unit is us */
65fe877779SCaesar Wang 	uint32_t tinit1;
66fe877779SCaesar Wang 	uint32_t tinit2;
67fe877779SCaesar Wang 	uint32_t tinit3;
68fe877779SCaesar Wang 	uint32_t tinit4;
69fe877779SCaesar Wang 	uint32_t tinit5;
70fe877779SCaesar Wang 	/* reset low, DDR3:200us */
71fe877779SCaesar Wang 	uint32_t trstl;
72fe877779SCaesar Wang 	/* reset high to CKE high, DDR3:500us  */
73fe877779SCaesar Wang 	uint32_t trsth;
74fe877779SCaesar Wang 	uint32_t trefi;
75fe877779SCaesar Wang 	/* base */
76fe877779SCaesar Wang 	uint32_t trcd;
77fe877779SCaesar Wang 	/* trp per bank */
78fe877779SCaesar Wang 	uint32_t trppb;
79fe877779SCaesar Wang 	/* trp all bank */
80fe877779SCaesar Wang 	uint32_t trp;
81fe877779SCaesar Wang 	uint32_t twr;
82fe877779SCaesar Wang 	uint32_t tdal;
83fe877779SCaesar Wang 	uint32_t trtp;
84fe877779SCaesar Wang 	uint32_t trc;
85fe877779SCaesar Wang 	uint32_t trrd;
86fe877779SCaesar Wang 	uint32_t tccd;
87fe877779SCaesar Wang 	uint32_t twtr;
88fe877779SCaesar Wang 	uint32_t trtw;
89fe877779SCaesar Wang 	uint32_t tras_max;
90fe877779SCaesar Wang 	uint32_t tras_min;
91fe877779SCaesar Wang 	uint32_t tfaw;
92fe877779SCaesar Wang 	uint32_t trfc;
93fe877779SCaesar Wang 	uint32_t tdqsck;
94fe877779SCaesar Wang 	uint32_t tdqsck_max;
95fe877779SCaesar Wang 	/* pd or sr */
96fe877779SCaesar Wang 	uint32_t txsr;
97fe877779SCaesar Wang 	uint32_t txsnr;
98fe877779SCaesar Wang 	uint32_t txp;
99fe877779SCaesar Wang 	uint32_t txpdll;
100fe877779SCaesar Wang 	uint32_t tdllk;
101fe877779SCaesar Wang 	uint32_t tcke;
102fe877779SCaesar Wang 	uint32_t tckesr;
103fe877779SCaesar Wang 	uint32_t tcksre;
104fe877779SCaesar Wang 	uint32_t tcksrx;
105fe877779SCaesar Wang 	uint32_t tdpd;
106*1b491eeaSElyes Haouas 	/* mode register timing */
107fe877779SCaesar Wang 	uint32_t tmod;
108fe877779SCaesar Wang 	uint32_t tmrd;
109fe877779SCaesar Wang 	uint32_t tmrr;
110fe877779SCaesar Wang 	uint32_t tmrri;
111fe877779SCaesar Wang 	/* ODT */
112fe877779SCaesar Wang 	uint32_t todton;
113fe877779SCaesar Wang 	/* ZQ */
114fe877779SCaesar Wang 	uint32_t tzqinit;
115fe877779SCaesar Wang 	uint32_t tzqcs;
116fe877779SCaesar Wang 	uint32_t tzqoper;
117fe877779SCaesar Wang 	uint32_t tzqreset;
118fe877779SCaesar Wang 	/* Write Leveling */
119fe877779SCaesar Wang 	uint32_t twlmrd;
120fe877779SCaesar Wang 	uint32_t twlo;
121fe877779SCaesar Wang 	uint32_t twldqsen;
122fe877779SCaesar Wang 	/* CA Training */
123fe877779SCaesar Wang 	uint32_t tcackel;
124fe877779SCaesar Wang 	uint32_t tcaent;
125fe877779SCaesar Wang 	uint32_t tcamrd;
126fe877779SCaesar Wang 	uint32_t tcackeh;
127fe877779SCaesar Wang 	uint32_t tcaext;
128fe877779SCaesar Wang 	uint32_t tadr;
129fe877779SCaesar Wang 	uint32_t tmrz;
130fe877779SCaesar Wang 	uint32_t tcacd;
131fe877779SCaesar Wang 	/* mode register */
132fe877779SCaesar Wang 	uint32_t mr[4];
133fe877779SCaesar Wang 	uint32_t mr11;
134fe877779SCaesar Wang 	/* lpddr4 spec */
135fe877779SCaesar Wang 	uint32_t mr12;
136fe877779SCaesar Wang 	uint32_t mr13;
137fe877779SCaesar Wang 	uint32_t mr14;
138fe877779SCaesar Wang 	uint32_t mr16;
139fe877779SCaesar Wang 	uint32_t mr17;
140fe877779SCaesar Wang 	uint32_t mr20;
141fe877779SCaesar Wang 	uint32_t mr22;
142fe877779SCaesar Wang 	uint32_t tccdmw;
143fe877779SCaesar Wang 	uint32_t tppd;
144fe877779SCaesar Wang 	uint32_t tescke;
145fe877779SCaesar Wang 	uint32_t tsr;
146fe877779SCaesar Wang 	uint32_t tcmdcke;
147fe877779SCaesar Wang 	uint32_t tcscke;
148fe877779SCaesar Wang 	uint32_t tckelcs;
149fe877779SCaesar Wang 	uint32_t tcsckeh;
150fe877779SCaesar Wang 	uint32_t tckehcs;
151fe877779SCaesar Wang 	uint32_t tmrwckel;
152fe877779SCaesar Wang 	uint32_t tzqcal;
153fe877779SCaesar Wang 	uint32_t tzqlat;
154fe877779SCaesar Wang 	uint32_t tzqcke;
155fe877779SCaesar Wang 	uint32_t tvref_long;
156fe877779SCaesar Wang 	uint32_t tvref_short;
157fe877779SCaesar Wang 	uint32_t tvrcg_enable;
158fe877779SCaesar Wang 	uint32_t tvrcg_disable;
159fe877779SCaesar Wang 	uint32_t tfc_long;
160fe877779SCaesar Wang 	uint32_t tckfspe;
161fe877779SCaesar Wang 	uint32_t tckfspx;
162fe877779SCaesar Wang 	uint32_t tckehcmd;
163fe877779SCaesar Wang 	uint32_t tckelcmd;
164fe877779SCaesar Wang 	uint32_t tckelpd;
165fe877779SCaesar Wang 	uint32_t tckckel;
166fe877779SCaesar Wang 	/* other */
167fe877779SCaesar Wang 	uint32_t al;
168fe877779SCaesar Wang 	uint32_t cl;
169fe877779SCaesar Wang 	uint32_t cwl;
170fe877779SCaesar Wang 	uint32_t bl;
171fe877779SCaesar Wang };
172fe877779SCaesar Wang 
173fe877779SCaesar Wang struct dram_info_t {
174fe877779SCaesar Wang 	/* speed_rate only used when DDR3 */
175fe877779SCaesar Wang 	enum ddr3_speed_rate speed_rate;
176fe877779SCaesar Wang 	/* 1: use CS0, 2: use CS0 and CS1 */
177fe877779SCaesar Wang 	uint32_t cs_cnt;
178fe877779SCaesar Wang 	/* give the max per-die capability on each rank/cs */
179fe877779SCaesar Wang 	uint32_t per_die_capability[2];
180fe877779SCaesar Wang };
181fe877779SCaesar Wang 
182fe877779SCaesar Wang struct timing_related_config {
183fe877779SCaesar Wang 	struct dram_info_t dram_info[2];
184fe877779SCaesar Wang 	uint32_t dram_type;
185fe877779SCaesar Wang 	/* MHz */
186fe877779SCaesar Wang 	uint32_t freq;
187fe877779SCaesar Wang 	uint32_t ch_cnt;
188fe877779SCaesar Wang 	uint32_t bl;
189fe877779SCaesar Wang 	/* 1:auto precharge, 0:never auto precharge */
190fe877779SCaesar Wang 	uint32_t ap;
191fe877779SCaesar Wang 	/*
192fe877779SCaesar Wang 	 * 1:dll bypass, 0:dll normal
193fe877779SCaesar Wang 	 * dram and controller dll bypass at the same time
194fe877779SCaesar Wang 	 */
195fe877779SCaesar Wang 	uint32_t dllbp;
196fe877779SCaesar Wang 	/* 1:odt enable, 0:odt disable */
197fe877779SCaesar Wang 	uint32_t odt;
198fe877779SCaesar Wang 	/* 1:enable, 0:disabe */
199fe877779SCaesar Wang 	uint32_t rdbi;
200fe877779SCaesar Wang 	uint32_t wdbi;
201fe877779SCaesar Wang 	/* dram driver strength */
202fe877779SCaesar Wang 	uint32_t dramds;
203fe877779SCaesar Wang 	/* dram ODT, if odt=0, this parameter invalid */
204fe877779SCaesar Wang 	uint32_t dramodt;
205fe877779SCaesar Wang 	/*
206fe877779SCaesar Wang 	 * ca ODT, if odt=0, this parameter invalid
207fe877779SCaesar Wang 	 * it only used by LPDDR4
208fe877779SCaesar Wang 	 */
209fe877779SCaesar Wang 	uint32_t caodt;
210fe877779SCaesar Wang };
211fe877779SCaesar Wang 
212fe877779SCaesar Wang /* mr0 for ddr3 */
213fe877779SCaesar Wang #define DDR3_BL8		(0)
214fe877779SCaesar Wang #define DDR3_BC4_8		(1)
215fe877779SCaesar Wang #define DDR3_BC4		(2)
216fe877779SCaesar Wang #define DDR3_CL(n)		(((((n) - 4) & 0x7) << 4)\
217fe877779SCaesar Wang 				| ((((n) - 4) & 0x8) >> 1))
218fe877779SCaesar Wang #define DDR3_WR(n)		(((n) & 0x7) << 9)
219fe877779SCaesar Wang #define DDR3_DLL_RESET		(1 << 8)
220fe877779SCaesar Wang #define DDR3_DLL_DERESET	(0 << 8)
221fe877779SCaesar Wang 
222fe877779SCaesar Wang /* mr1 for ddr3 */
223fe877779SCaesar Wang #define DDR3_DLL_ENABLE		(0)
224fe877779SCaesar Wang #define DDR3_DLL_DISABLE	(1)
225fe877779SCaesar Wang #define DDR3_MR1_AL(n)		(((n) & 0x3) << 3)
226fe877779SCaesar Wang 
227fe877779SCaesar Wang #define DDR3_DS_40		(0)
228fe877779SCaesar Wang #define DDR3_DS_34		(1 << 1)
229fe877779SCaesar Wang #define DDR3_RTT_NOM_DIS	(0)
230fe877779SCaesar Wang #define DDR3_RTT_NOM_60		(1 << 2)
231fe877779SCaesar Wang #define DDR3_RTT_NOM_120	(1 << 6)
232fe877779SCaesar Wang #define DDR3_RTT_NOM_40		((1 << 2) | (1 << 6))
233fe877779SCaesar Wang #define DDR3_TDQS		(1 << 11)
234fe877779SCaesar Wang 
235fe877779SCaesar Wang /* mr2 for ddr3 */
236fe877779SCaesar Wang #define DDR3_MR2_CWL(n)		((((n) - 5) & 0x7) << 3)
237fe877779SCaesar Wang #define DDR3_RTT_WR_DIS		(0)
238fe877779SCaesar Wang #define DDR3_RTT_WR_60		(1 << 9)
239fe877779SCaesar Wang #define DDR3_RTT_WR_120		(2 << 9)
240fe877779SCaesar Wang 
241fe877779SCaesar Wang /*
242fe877779SCaesar Wang  * MR0 (Device Information)
243fe877779SCaesar Wang  * 0:DAI complete, 1:DAI still in progress
244fe877779SCaesar Wang  */
245fe877779SCaesar Wang #define LPDDR2_DAI		(0x1)
246fe877779SCaesar Wang /* 0:S2 or S4 SDRAM, 1:NVM */
247fe877779SCaesar Wang #define LPDDR2_DI		(0x1 << 1)
248fe877779SCaesar Wang /* 0:DNV not supported, 1:DNV supported */
249fe877779SCaesar Wang #define LPDDR2_DNVI		(0x1 << 2)
250fe877779SCaesar Wang #define LPDDR2_RZQI		(0x3 << 3)
251fe877779SCaesar Wang 
252fe877779SCaesar Wang /*
253fe877779SCaesar Wang  * 00:RZQ self test not supported,
254fe877779SCaesar Wang  * 01:ZQ-pin may connect to VDDCA or float
255fe877779SCaesar Wang  * 10:ZQ-pin may short to GND.
256fe877779SCaesar Wang  * 11:ZQ-pin self test completed, no error condition detected.
257fe877779SCaesar Wang  */
258fe877779SCaesar Wang 
259fe877779SCaesar Wang /* MR1 (Device Feature) */
260fe877779SCaesar Wang #define LPDDR2_BL4		(0x2)
261fe877779SCaesar Wang #define LPDDR2_BL8		(0x3)
262fe877779SCaesar Wang #define LPDDR2_BL16		(0x4)
263fe877779SCaesar Wang #define LPDDR2_N_WR(n)		(((n) - 2) << 5)
264fe877779SCaesar Wang 
265fe877779SCaesar Wang /* MR2 (Device Feature 2) */
266fe877779SCaesar Wang #define LPDDR2_RL3_WL1		(0x1)
267fe877779SCaesar Wang #define LPDDR2_RL4_WL2		(0x2)
268fe877779SCaesar Wang #define LPDDR2_RL5_WL2		(0x3)
269fe877779SCaesar Wang #define LPDDR2_RL6_WL3		(0x4)
270fe877779SCaesar Wang #define LPDDR2_RL7_WL4		(0x5)
271fe877779SCaesar Wang #define LPDDR2_RL8_WL4		(0x6)
272fe877779SCaesar Wang 
273fe877779SCaesar Wang /* MR3 (IO Configuration 1) */
274fe877779SCaesar Wang #define LPDDR2_DS_34		(0x1)
275fe877779SCaesar Wang #define LPDDR2_DS_40		(0x2)
276fe877779SCaesar Wang #define LPDDR2_DS_48		(0x3)
277fe877779SCaesar Wang #define LPDDR2_DS_60		(0x4)
278fe877779SCaesar Wang #define LPDDR2_DS_80		(0x6)
279fe877779SCaesar Wang /* optional */
280fe877779SCaesar Wang #define LPDDR2_DS_120		(0x7)
281fe877779SCaesar Wang 
282fe877779SCaesar Wang /* MR4 (Device Temperature) */
283fe877779SCaesar Wang #define LPDDR2_TREF_MASK	(0x7)
284fe877779SCaesar Wang #define LPDDR2_4_TREF		(0x1)
285fe877779SCaesar Wang #define LPDDR2_2_TREF		(0x2)
286fe877779SCaesar Wang #define LPDDR2_1_TREF		(0x3)
287fe877779SCaesar Wang #define LPDDR2_025_TREF		(0x5)
288fe877779SCaesar Wang #define LPDDR2_025_TREF_DERATE	(0x6)
289fe877779SCaesar Wang 
290fe877779SCaesar Wang #define LPDDR2_TUF		(0x1 << 7)
291fe877779SCaesar Wang 
292fe877779SCaesar Wang /* MR8 (Basic configuration 4) */
293fe877779SCaesar Wang #define LPDDR2_S4		(0x0)
294fe877779SCaesar Wang #define LPDDR2_S2		(0x1)
295fe877779SCaesar Wang #define LPDDR2_N		(0x2)
296fe877779SCaesar Wang /* Unit:MB */
297fe877779SCaesar Wang #define LPDDR2_DENSITY(mr8)	(8 << (((mr8) >> 2) & 0xf))
298fe877779SCaesar Wang #define LPDDR2_IO_WIDTH(mr8)	(32 >> (((mr8) >> 6) & 0x3))
299fe877779SCaesar Wang 
300fe877779SCaesar Wang /* MR10 (Calibration) */
301fe877779SCaesar Wang #define LPDDR2_ZQINIT		(0xff)
302fe877779SCaesar Wang #define LPDDR2_ZQCL		(0xab)
303fe877779SCaesar Wang #define LPDDR2_ZQCS		(0x56)
304fe877779SCaesar Wang #define LPDDR2_ZQRESET		(0xc3)
305fe877779SCaesar Wang 
306fe877779SCaesar Wang /* MR16 (PASR Bank Mask), S2 SDRAM Only */
307fe877779SCaesar Wang #define LPDDR2_PASR_FULL	(0x0)
308fe877779SCaesar Wang #define LPDDR2_PASR_1_2		(0x1)
309fe877779SCaesar Wang #define LPDDR2_PASR_1_4		(0x2)
310fe877779SCaesar Wang #define LPDDR2_PASR_1_8		(0x3)
311fe877779SCaesar Wang 
312fe877779SCaesar Wang /*
313fe877779SCaesar Wang  * MR0 (Device Information)
314fe877779SCaesar Wang  * 0:DAI complete,
315fe877779SCaesar Wang  * 1:DAI still in progress
316fe877779SCaesar Wang  */
317fe877779SCaesar Wang #define LPDDR3_DAI		(0x1)
318fe877779SCaesar Wang /*
319fe877779SCaesar Wang  * 00:RZQ self test not supported,
320fe877779SCaesar Wang  * 01:ZQ-pin may connect to VDDCA or float
321fe877779SCaesar Wang  * 10:ZQ-pin may short to GND.
322fe877779SCaesar Wang  * 11:ZQ-pin self test completed, no error condition detected.
323fe877779SCaesar Wang  */
324fe877779SCaesar Wang #define LPDDR3_RZQI		(0x3 << 3)
325fe877779SCaesar Wang /*
326fe877779SCaesar Wang  * 0:DRAM does not support WL(Set B),
327fe877779SCaesar Wang  * 1:DRAM support WL(Set B)
328fe877779SCaesar Wang  */
329fe877779SCaesar Wang #define LPDDR3_WL_SUPOT		(1 << 6)
330fe877779SCaesar Wang /*
331fe877779SCaesar Wang  * 0:DRAM does not support RL=3,nWR=3,WL=1;
332fe877779SCaesar Wang  * 1:DRAM supports RL=3,nWR=3,WL=1 for frequencies <=166
333fe877779SCaesar Wang  */
334fe877779SCaesar Wang #define LPDDR3_RL3_SUPOT	(1 << 7)
335fe877779SCaesar Wang 
336fe877779SCaesar Wang /* MR1 (Device Feature) */
337fe877779SCaesar Wang #define LPDDR3_BL8		(0x3)
338fe877779SCaesar Wang #define LPDDR3_N_WR(n)		((n) << 5)
339fe877779SCaesar Wang 
340fe877779SCaesar Wang /* MR2 (Device Feature 2), WL Set A,default */
341fe877779SCaesar Wang /* <=166MHz,optional*/
342fe877779SCaesar Wang #define LPDDR3_RL3_WL1		(0x1)
343fe877779SCaesar Wang /* <=400MHz*/
344fe877779SCaesar Wang #define LPDDR3_RL6_WL3		(0x4)
345fe877779SCaesar Wang /* <=533MHz*/
346fe877779SCaesar Wang #define LPDDR3_RL8_WL4		(0x6)
347fe877779SCaesar Wang /* <=600MHz*/
348fe877779SCaesar Wang #define LPDDR3_RL9_WL5		(0x7)
349fe877779SCaesar Wang /* <=667MHz,default*/
350fe877779SCaesar Wang #define LPDDR3_RL10_WL6		(0x8)
351fe877779SCaesar Wang /* <=733MHz*/
352fe877779SCaesar Wang #define LPDDR3_RL11_WL6		(0x9)
353fe877779SCaesar Wang /* <=800MHz*/
354fe877779SCaesar Wang #define LPDDR3_RL12_WL6		(0xa)
355fe877779SCaesar Wang /* <=933MHz*/
356fe877779SCaesar Wang #define LPDDR3_RL14_WL8		(0xc)
357fe877779SCaesar Wang /* <=1066MHz*/
358fe877779SCaesar Wang #define LPDDR3_RL16_WL8		(0xe)
359fe877779SCaesar Wang 
360fe877779SCaesar Wang /* WL Set B, optional */
361fe877779SCaesar Wang /* <=667MHz,default*/
362fe877779SCaesar Wang #define LPDDR3_RL10_WL8		(0x8)
363fe877779SCaesar Wang /* <=733MHz*/
364fe877779SCaesar Wang #define LPDDR3_RL11_WL9		(0x9)
365fe877779SCaesar Wang /* <=800MHz*/
366fe877779SCaesar Wang #define LPDDR3_RL12_WL9		(0xa)
367fe877779SCaesar Wang /* <=933MHz*/
368fe877779SCaesar Wang #define LPDDR3_RL14_WL11	(0xc)
369fe877779SCaesar Wang /* <=1066MHz*/
370fe877779SCaesar Wang #define LPDDR3_RL16_WL13	(0xe)
371fe877779SCaesar Wang 
372fe877779SCaesar Wang /* 1:enable nWR programming > 9(default)*/
373fe877779SCaesar Wang #define LPDDR3_N_WRE		(1 << 4)
374fe877779SCaesar Wang /* 1:Select WL Set B*/
375fe877779SCaesar Wang #define LPDDR3_WL_S		(1 << 6)
376fe877779SCaesar Wang /* 1:enable*/
377fe877779SCaesar Wang #define LPDDR3_WR_LEVEL		(1 << 7)
378fe877779SCaesar Wang 
379fe877779SCaesar Wang /* MR3 (IO Configuration 1) */
380fe877779SCaesar Wang #define LPDDR3_DS_34		(0x1)
381fe877779SCaesar Wang #define LPDDR3_DS_40		(0x2)
382fe877779SCaesar Wang #define LPDDR3_DS_48		(0x3)
383fe877779SCaesar Wang #define LPDDR3_DS_60		(0x4)
384fe877779SCaesar Wang #define LPDDR3_DS_80		(0x6)
385fe877779SCaesar Wang #define LPDDR3_DS_34D_40U	(0x9)
386fe877779SCaesar Wang #define LPDDR3_DS_40D_48U	(0xa)
387fe877779SCaesar Wang #define LPDDR3_DS_34D_48U	(0xb)
388fe877779SCaesar Wang 
389fe877779SCaesar Wang /* MR4 (Device Temperature) */
390fe877779SCaesar Wang #define LPDDR3_TREF_MASK	(0x7)
391fe877779SCaesar Wang /* SDRAM Low temperature operating limit exceeded */
392fe877779SCaesar Wang #define LPDDR3_LT_EXED		(0x0)
393fe877779SCaesar Wang #define LPDDR3_4_TREF		(0x1)
394fe877779SCaesar Wang #define LPDDR3_2_TREF		(0x2)
395fe877779SCaesar Wang #define LPDDR3_1_TREF		(0x3)
396fe877779SCaesar Wang #define LPDDR3_05_TREF		(0x4)
397fe877779SCaesar Wang #define LPDDR3_025_TREF		(0x5)
398fe877779SCaesar Wang #define LPDDR3_025_TREF_DERATE	(0x6)
399fe877779SCaesar Wang /* SDRAM High temperature operating limit exceeded */
400fe877779SCaesar Wang #define LPDDR3_HT_EXED		(0x7)
401fe877779SCaesar Wang 
402fe877779SCaesar Wang /* 1:value has changed since last read of MR4 */
403fe877779SCaesar Wang #define LPDDR3_TUF		(0x1 << 7)
404fe877779SCaesar Wang 
405fe877779SCaesar Wang /* MR8 (Basic configuration 4) */
406fe877779SCaesar Wang #define LPDDR3_S8		(0x3)
407fe877779SCaesar Wang #define LPDDR3_DENSITY(mr8)	(8 << (((mr8) >> 2) & 0xf))
408fe877779SCaesar Wang #define LPDDR3_IO_WIDTH(mr8)	(32 >> (((mr8) >> 6) & 0x3))
409fe877779SCaesar Wang 
410fe877779SCaesar Wang /* MR10 (Calibration) */
411fe877779SCaesar Wang #define LPDDR3_ZQINIT		(0xff)
412fe877779SCaesar Wang #define LPDDR3_ZQCL		(0xab)
413fe877779SCaesar Wang #define LPDDR3_ZQCS		(0x56)
414fe877779SCaesar Wang #define LPDDR3_ZQRESET		(0xc3)
415fe877779SCaesar Wang 
416fe877779SCaesar Wang /* MR11 (ODT Control) */
417fe877779SCaesar Wang #define LPDDR3_ODT_60		(1)
418fe877779SCaesar Wang #define LPDDR3_ODT_120		(2)
419fe877779SCaesar Wang #define LPDDR3_ODT_240		(3)
420fe877779SCaesar Wang #define LPDDR3_ODT_DIS		(0)
421fe877779SCaesar Wang 
422fe877779SCaesar Wang /* MR2 (Device Feature 2) */
423fe877779SCaesar Wang /* RL & nRTP for DBI-RD Disabled */
424fe877779SCaesar Wang #define LPDDR4_RL6_NRTP8	(0x0)
425fe877779SCaesar Wang #define LPDDR4_RL10_NRTP8	(0x1)
426fe877779SCaesar Wang #define LPDDR4_RL14_NRTP8	(0x2)
427fe877779SCaesar Wang #define LPDDR4_RL20_NRTP8	(0x3)
428fe877779SCaesar Wang #define LPDDR4_RL24_NRTP10	(0x4)
429fe877779SCaesar Wang #define LPDDR4_RL28_NRTP12	(0x5)
430fe877779SCaesar Wang #define LPDDR4_RL32_NRTP14	(0x6)
431fe877779SCaesar Wang #define LPDDR4_RL36_NRTP16	(0x7)
432fe877779SCaesar Wang /* RL & nRTP for DBI-RD Disabled */
433fe877779SCaesar Wang #define LPDDR4_RL12_NRTP8	(0x1)
434fe877779SCaesar Wang #define LPDDR4_RL16_NRTP8	(0x2)
435fe877779SCaesar Wang #define LPDDR4_RL22_NRTP8	(0x3)
436fe877779SCaesar Wang #define LPDDR4_RL28_NRTP10	(0x4)
437fe877779SCaesar Wang #define LPDDR4_RL32_NRTP12	(0x5)
438fe877779SCaesar Wang #define LPDDR4_RL36_NRTP14	(0x6)
439fe877779SCaesar Wang #define LPDDR4_RL40_NRTP16	(0x7)
440fe877779SCaesar Wang /* WL Set A,default */
441fe877779SCaesar Wang #define LPDDR4_A_WL4		(0x0)
442fe877779SCaesar Wang #define LPDDR4_A_WL6		(0x1)
443fe877779SCaesar Wang #define LPDDR4_A_WL8		(0x2)
444fe877779SCaesar Wang #define LPDDR4_A_WL10		(0x3)
445fe877779SCaesar Wang #define LPDDR4_A_WL12		(0x4)
446fe877779SCaesar Wang #define LPDDR4_A_WL14		(0x5)
447fe877779SCaesar Wang #define LPDDR4_A_WL16		(0x6)
448fe877779SCaesar Wang #define LPDDR4_A_WL18		(0x7)
449fe877779SCaesar Wang /* WL Set B, optional */
450fe877779SCaesar Wang #define LPDDR4_B_WL4		(0x0 << 3)
451fe877779SCaesar Wang #define LPDDR4_B_WL8		(0x1 << 3)
452fe877779SCaesar Wang #define LPDDR4_B_WL12		(0x2 << 3)
453fe877779SCaesar Wang #define LPDDR4_B_WL18		(0x3 << 3)
454fe877779SCaesar Wang #define LPDDR4_B_WL22		(0x4 << 3)
455fe877779SCaesar Wang #define LPDDR4_B_WL26		(0x5 << 3)
456fe877779SCaesar Wang #define LPDDR4_B_WL30		(0x6 << 3)
457fe877779SCaesar Wang #define LPDDR4_B_WL34		(0x7 << 3)
458fe877779SCaesar Wang /* 1:Select WL Set B*/
459fe877779SCaesar Wang #define LPDDR4_WL_B		(1 << 6)
460fe877779SCaesar Wang /* 1:enable*/
461fe877779SCaesar Wang #define LPDDR4_WR_LEVEL		(1 << 7)
462fe877779SCaesar Wang 
463fe877779SCaesar Wang /* MR3 */
464fe877779SCaesar Wang #define LPDDR4_VDDQ_2_5		(0)
465fe877779SCaesar Wang #define LPDDR4_VDDQ_3		(1)
466fe877779SCaesar Wang #define LPDDR4_WRPST_0_5_TCK	(0 << 1)
467fe877779SCaesar Wang #define LPDDR4_WRPST_1_5_TCK	(1 << 1)
468fe877779SCaesar Wang #define LPDDR4_PPR_EN		(1 << 2)
469fe877779SCaesar Wang /* PDDS */
470fe877779SCaesar Wang #define LPDDR4_PDDS_240		(0x1 << 3)
471fe877779SCaesar Wang #define LPDDR4_PDDS_120		(0x2 << 3)
472fe877779SCaesar Wang #define LPDDR4_PDDS_80		(0x3 << 3)
473fe877779SCaesar Wang #define LPDDR4_PDDS_60		(0x4 << 3)
474fe877779SCaesar Wang #define LPDDR4_PDDS_48		(0x5 << 3)
475fe877779SCaesar Wang #define LPDDR4_PDDS_40		(0x6 << 3)
476fe877779SCaesar Wang #define LPDDR4_DBI_RD_EN	(1 << 6)
477fe877779SCaesar Wang #define LPDDR4_DBI_WR_EN	(1 << 7)
478fe877779SCaesar Wang 
479fe877779SCaesar Wang /* MR11 (ODT Control) */
480fe877779SCaesar Wang #define LPDDR4_DQODT_240	(1)
481fe877779SCaesar Wang #define LPDDR4_DQODT_120	(2)
482fe877779SCaesar Wang #define LPDDR4_DQODT_80		(3)
483fe877779SCaesar Wang #define LPDDR4_DQODT_60		(4)
484fe877779SCaesar Wang #define LPDDR4_DQODT_48		(5)
485fe877779SCaesar Wang #define LPDDR4_DQODT_40		(6)
486fe877779SCaesar Wang #define LPDDR4_DQODT_DIS	(0)
487fe877779SCaesar Wang #define LPDDR4_CAODT_240	(1 << 4)
488fe877779SCaesar Wang #define LPDDR4_CAODT_120	(2 << 4)
489fe877779SCaesar Wang #define LPDDR4_CAODT_80		(3 << 4)
490fe877779SCaesar Wang #define LPDDR4_CAODT_60		(4 << 4)
491fe877779SCaesar Wang #define LPDDR4_CAODT_48		(5 << 4)
492fe877779SCaesar Wang #define LPDDR4_CAODT_40		(6 << 4)
493fe877779SCaesar Wang #define LPDDR4_CAODT_DIS	(0 << 4)
494fe877779SCaesar Wang 
495fe877779SCaesar Wang /*
496fe877779SCaesar Wang  * Description: depend on input parameter "timing_config",
497fe877779SCaesar Wang  *		and calculate correspond "dram_type"
498fe877779SCaesar Wang  *		spec timing to "pdram_timing"
499fe877779SCaesar Wang  * parameters:
500fe877779SCaesar Wang  *   input: timing_config
501fe877779SCaesar Wang  *   output: pdram_timing
502fe877779SCaesar Wang  * NOTE: MR ODT is set, need to disable by controller
503fe877779SCaesar Wang  */
504fe877779SCaesar Wang void dram_get_parameter(struct timing_related_config *timing_config,
505fe877779SCaesar Wang 			struct dram_timing_t *pdram_timing);
506fe877779SCaesar Wang 
507c3cf06f1SAntonio Nino Diaz #endif /* DRAM_SPEC_TIMING_H */
508