xref: /rk3399_ARM-atf/plat/nxp/soc-lx2160a/lx2162aqds/ddr_init.c (revision 9719e19a977df3e8bf7567b3c0e1d6b2ebc5b46f)
1*1f497308SPankaj Gupta /*
2*1f497308SPankaj Gupta  * Copyright 2018-2021 NXP
3*1f497308SPankaj Gupta  *
4*1f497308SPankaj Gupta  * SPDX-License-Identifier: BSD-3-Clause
5*1f497308SPankaj Gupta  *
6*1f497308SPankaj Gupta  */
7*1f497308SPankaj Gupta 
8*1f497308SPankaj Gupta #include <assert.h>
9*1f497308SPankaj Gupta #include <errno.h>
10*1f497308SPankaj Gupta #include <stdbool.h>
11*1f497308SPankaj Gupta #include <stdint.h>
12*1f497308SPankaj Gupta #include <stdio.h>
13*1f497308SPankaj Gupta #include <stdlib.h>
14*1f497308SPankaj Gupta #include <string.h>
15*1f497308SPankaj Gupta 
16*1f497308SPankaj Gupta #include <common/debug.h>
17*1f497308SPankaj Gupta #include <ddr.h>
18*1f497308SPankaj Gupta #include <lib/utils.h>
19*1f497308SPankaj Gupta #include <load_img.h>
20*1f497308SPankaj Gupta 
21*1f497308SPankaj Gupta #include "plat_common.h"
22*1f497308SPankaj Gupta #include <platform_def.h>
23*1f497308SPankaj Gupta 
24*1f497308SPankaj Gupta #ifdef CONFIG_STATIC_DDR
25*1f497308SPankaj Gupta 
26*1f497308SPankaj Gupta const struct ddr_cfg_regs static_3200 = {
27*1f497308SPankaj Gupta 	.cs[0].bnds = U(0x03FFU),
28*1f497308SPankaj Gupta 	.cs[1].bnds = U(0x03FF),
29*1f497308SPankaj Gupta 	.cs[0].config = U(0x80050422),
30*1f497308SPankaj Gupta 	.cs[1].config = U(0x80000422),
31*1f497308SPankaj Gupta 	.cs[2].bnds = U(0x00),
32*1f497308SPankaj Gupta 	.cs[3].bnds = U(0x00),
33*1f497308SPankaj Gupta 	.cs[2].config = U(0x00),
34*1f497308SPankaj Gupta 	.cs[3].config = U(0x00),
35*1f497308SPankaj Gupta 	.timing_cfg[0] = U(0xFFAA0018),
36*1f497308SPankaj Gupta 	.timing_cfg[1] = U(0x646A8844),
37*1f497308SPankaj Gupta 	.timing_cfg[2] = U(0x00058022),
38*1f497308SPankaj Gupta 	.timing_cfg[3] = U(0x13622100),
39*1f497308SPankaj Gupta 	.timing_cfg[4] = U(0x02),
40*1f497308SPankaj Gupta 	.timing_cfg[5] = U(0x07401400),
41*1f497308SPankaj Gupta 	.timing_cfg[7] = U(0x3BB00000),
42*1f497308SPankaj Gupta 	.timing_cfg[8] = U(0x0944AC00),
43*1f497308SPankaj Gupta 	.sdram_cfg[0] = U(0x65044008),
44*1f497308SPankaj Gupta 	.sdram_cfg[1] = U(0x00401011),
45*1f497308SPankaj Gupta 	.sdram_cfg[2] = U(0x00),
46*1f497308SPankaj Gupta 	.sdram_mode[0] = U(0x06010C50),
47*1f497308SPankaj Gupta 	.sdram_mode[1] = U(0x00280400),
48*1f497308SPankaj Gupta 	.sdram_mode[2] = U(0x00),
49*1f497308SPankaj Gupta 	.sdram_mode[3] = U(0x00),
50*1f497308SPankaj Gupta 	.sdram_mode[4] = U(0x00),
51*1f497308SPankaj Gupta 	.sdram_mode[5] = U(0x00),
52*1f497308SPankaj Gupta 	.sdram_mode[6] = U(0x00),
53*1f497308SPankaj Gupta 	.sdram_mode[7] = U(0x00),
54*1f497308SPankaj Gupta 	.sdram_mode[8] = U(0x0500),
55*1f497308SPankaj Gupta 	.sdram_mode[9] = U(0x10240000),
56*1f497308SPankaj Gupta 	.sdram_mode[10] = U(0x00),
57*1f497308SPankaj Gupta 	.sdram_mode[11] = U(0x00),
58*1f497308SPankaj Gupta 	.sdram_mode[12] = U(0x00),
59*1f497308SPankaj Gupta 	.sdram_mode[13] = U(0x00),
60*1f497308SPankaj Gupta 	.sdram_mode[14] = U(0x00),
61*1f497308SPankaj Gupta 	.sdram_mode[15] = U(0x00),
62*1f497308SPankaj Gupta 	.md_cntl = U(0x00),
63*1f497308SPankaj Gupta 	.interval = U(0x30C00000),
64*1f497308SPankaj Gupta 	.data_init = U(0xDEADBEEF),
65*1f497308SPankaj Gupta 	.init_addr = U(0x00),
66*1f497308SPankaj Gupta 	.zq_cntl = U(0x8A090705),
67*1f497308SPankaj Gupta 	.sdram_rcw[0] = U(0x00),
68*1f497308SPankaj Gupta 	.sdram_rcw[1] = U(0x00),
69*1f497308SPankaj Gupta 	.sdram_rcw[2] = U(0x00),
70*1f497308SPankaj Gupta 	.sdram_rcw[3] = U(0x00),
71*1f497308SPankaj Gupta 	.sdram_rcw[4] = U(0x00),
72*1f497308SPankaj Gupta 	.sdram_rcw[5] = U(0x00),
73*1f497308SPankaj Gupta 	.err_disable = U(0x00),
74*1f497308SPankaj Gupta 	.err_int_en = U(0x00),
75*1f497308SPankaj Gupta };
76*1f497308SPankaj Gupta 
77*1f497308SPankaj Gupta const struct ddr_cfg_regs static_2900 = {
78*1f497308SPankaj Gupta 	.cs[0].bnds = U(0x03FF),
79*1f497308SPankaj Gupta 	.cs[1].bnds = U(0x03FF),
80*1f497308SPankaj Gupta 	.cs[0].config = U(0x80050422),
81*1f497308SPankaj Gupta 	.cs[1].config = U(0x80000422),
82*1f497308SPankaj Gupta 	.cs[2].bnds = U(0x00),
83*1f497308SPankaj Gupta 	.cs[3].bnds = U(0x00),
84*1f497308SPankaj Gupta 	.cs[2].config = U(0x00),
85*1f497308SPankaj Gupta 	.cs[3].config = U(0x00),
86*1f497308SPankaj Gupta 	.timing_cfg[0] = U(0xFF990018),
87*1f497308SPankaj Gupta 	.timing_cfg[1] = U(0x4F4A4844),
88*1f497308SPankaj Gupta 	.timing_cfg[2] = U(0x0005601F),
89*1f497308SPankaj Gupta 	.timing_cfg[3] = U(0x125F2100),
90*1f497308SPankaj Gupta 	.timing_cfg[4] = U(0x02),
91*1f497308SPankaj Gupta 	.timing_cfg[5] = U(0x07401400),
92*1f497308SPankaj Gupta 	.timing_cfg[7] = U(0x3AA00000),
93*1f497308SPankaj Gupta 	.timing_cfg[8] = U(0x09449B00),
94*1f497308SPankaj Gupta 	.sdram_cfg[0] = U(0x65044008),
95*1f497308SPankaj Gupta 	.sdram_cfg[1] = U(0x00401011),
96*1f497308SPankaj Gupta 	.sdram_cfg[2] = U(0x00),
97*1f497308SPankaj Gupta 	.sdram_mode[0] = U(0x06010C50),
98*1f497308SPankaj Gupta 	.sdram_mode[1] = U(0x00280400),
99*1f497308SPankaj Gupta 	.sdram_mode[2] = U(0x00),
100*1f497308SPankaj Gupta 	.sdram_mode[3] = U(0x00),
101*1f497308SPankaj Gupta 	.sdram_mode[4] = U(0x00),
102*1f497308SPankaj Gupta 	.sdram_mode[5] = U(0x00),
103*1f497308SPankaj Gupta 	.sdram_mode[6] = U(0x00),
104*1f497308SPankaj Gupta 	.sdram_mode[7] = U(0x00),
105*1f497308SPankaj Gupta 	.sdram_mode[8] = U(0x0500),
106*1f497308SPankaj Gupta 	.sdram_mode[9] = U(0x10240000),
107*1f497308SPankaj Gupta 	.sdram_mode[10] = U(0x00),
108*1f497308SPankaj Gupta 	.sdram_mode[11] = U(0x00),
109*1f497308SPankaj Gupta 	.sdram_mode[12] = U(0x00),
110*1f497308SPankaj Gupta 	.sdram_mode[13] = U(0x00),
111*1f497308SPankaj Gupta 	.sdram_mode[14] = U(0x00),
112*1f497308SPankaj Gupta 	.sdram_mode[15] = U(0x00),
113*1f497308SPankaj Gupta 	.md_cntl = U(0x00),
114*1f497308SPankaj Gupta 	.interval = U(0x2C2E0000),
115*1f497308SPankaj Gupta 	.data_init = U(0xDEADBEEF),
116*1f497308SPankaj Gupta 	.init_addr = U(0x00),
117*1f497308SPankaj Gupta 	.zq_cntl = U(0x8A090705),
118*1f497308SPankaj Gupta 	.sdram_rcw[0] = U(0x00),
119*1f497308SPankaj Gupta 	.sdram_rcw[1] = U(0x00),
120*1f497308SPankaj Gupta 	.sdram_rcw[2] = U(0x00),
121*1f497308SPankaj Gupta 	.sdram_rcw[3] = U(0x00),
122*1f497308SPankaj Gupta 	.sdram_rcw[4] = U(0x00),
123*1f497308SPankaj Gupta 	.sdram_rcw[5] = U(0x00),
124*1f497308SPankaj Gupta 	.err_disable = U(0x00),
125*1f497308SPankaj Gupta 	.err_int_en = U(0x00),
126*1f497308SPankaj Gupta };
127*1f497308SPankaj Gupta 
128*1f497308SPankaj Gupta const struct ddr_cfg_regs static_2600 = {
129*1f497308SPankaj Gupta 	.cs[0].bnds = U(0x03FF),
130*1f497308SPankaj Gupta 	.cs[1].bnds = U(0x03FF),
131*1f497308SPankaj Gupta 	.cs[0].config = U(0x80050422),
132*1f497308SPankaj Gupta 	.cs[1].config = U(0x80000422),
133*1f497308SPankaj Gupta 	.cs[2].bnds = U(0x00),
134*1f497308SPankaj Gupta 	.cs[3].bnds = U(0x00),
135*1f497308SPankaj Gupta 	.cs[2].config = U(0x00),
136*1f497308SPankaj Gupta 	.cs[3].config = U(0x00),
137*1f497308SPankaj Gupta 	.timing_cfg[0] = U(0xFF880018),
138*1f497308SPankaj Gupta 	.timing_cfg[1] = U(0x2A24F444),
139*1f497308SPankaj Gupta 	.timing_cfg[2] = U(0x007141DC),
140*1f497308SPankaj Gupta 	.timing_cfg[3] = U(0x125B2100),
141*1f497308SPankaj Gupta 	.timing_cfg[4] = U(0x02),
142*1f497308SPankaj Gupta 	.timing_cfg[5] = U(0x06401400),
143*1f497308SPankaj Gupta 	.timing_cfg[7] = U(0x28800000),
144*1f497308SPankaj Gupta 	.timing_cfg[8] = U(0x07338A00),
145*1f497308SPankaj Gupta 	.sdram_cfg[0] = U(0x65044008),
146*1f497308SPankaj Gupta 	.sdram_cfg[1] = U(0x00401011),
147*1f497308SPankaj Gupta 	.sdram_cfg[2] = U(0x00),
148*1f497308SPankaj Gupta 	.sdram_mode[0] = U(0x06010A70),
149*1f497308SPankaj Gupta 	.sdram_mode[1] = U(0x00200400),
150*1f497308SPankaj Gupta 	.sdram_mode[2] = U(0x00),
151*1f497308SPankaj Gupta 	.sdram_mode[3] = U(0x00),
152*1f497308SPankaj Gupta 	.sdram_mode[4] = U(0x00),
153*1f497308SPankaj Gupta 	.sdram_mode[5] = U(0x00),
154*1f497308SPankaj Gupta 	.sdram_mode[6] = U(0x00),
155*1f497308SPankaj Gupta 	.sdram_mode[7] = U(0x00),
156*1f497308SPankaj Gupta 	.sdram_mode[8] = U(0x0500),
157*1f497308SPankaj Gupta 	.sdram_mode[9] = U(0x0C240000),
158*1f497308SPankaj Gupta 	.sdram_mode[10] = U(0x00),
159*1f497308SPankaj Gupta 	.sdram_mode[11] = U(0x00),
160*1f497308SPankaj Gupta 	.sdram_mode[12] = U(0x00),
161*1f497308SPankaj Gupta 	.sdram_mode[13] = U(0x00),
162*1f497308SPankaj Gupta 	.sdram_mode[14] = U(0x00),
163*1f497308SPankaj Gupta 	.sdram_mode[15] = U(0x00),
164*1f497308SPankaj Gupta 	.md_cntl = U(0x00),
165*1f497308SPankaj Gupta 	.interval = U(0x279C0000),
166*1f497308SPankaj Gupta 	.data_init = U(0xDEADBEEF),
167*1f497308SPankaj Gupta 	.init_addr = U(0x00),
168*1f497308SPankaj Gupta 	.zq_cntl = U(0x8A090705),
169*1f497308SPankaj Gupta 	.sdram_rcw[0] = U(0x00),
170*1f497308SPankaj Gupta 	.sdram_rcw[1] = U(0x00),
171*1f497308SPankaj Gupta 	.sdram_rcw[2] = U(0x00),
172*1f497308SPankaj Gupta 	.sdram_rcw[3] = U(0x00),
173*1f497308SPankaj Gupta 	.sdram_rcw[4] = U(0x00),
174*1f497308SPankaj Gupta 	.sdram_rcw[5] = U(0x00),
175*1f497308SPankaj Gupta 	.err_disable = U(0x00),
176*1f497308SPankaj Gupta 	.err_int_en = U(0x00),
177*1f497308SPankaj Gupta };
178*1f497308SPankaj Gupta 
179*1f497308SPankaj Gupta const struct dimm_params static_dimm = {
180*1f497308SPankaj Gupta 	.rdimm = 0U,
181*1f497308SPankaj Gupta 	.primary_sdram_width = 64U,
182*1f497308SPankaj Gupta 	.ec_sdram_width = 8U,
183*1f497308SPankaj Gupta 	.n_ranks = 2U,
184*1f497308SPankaj Gupta 	.device_width = 8U,
185*1f497308SPankaj Gupta 	.mirrored_dimm = 1U,
186*1f497308SPankaj Gupta };
187*1f497308SPankaj Gupta 
188*1f497308SPankaj Gupta /* Sample code using two UDIMM MT18ASF1G72AZ-2G6B1, on each DDR controller */
board_static_ddr(struct ddr_info * priv)189*1f497308SPankaj Gupta unsigned long long board_static_ddr(struct ddr_info *priv)
190*1f497308SPankaj Gupta {
191*1f497308SPankaj Gupta 	memcpy(&priv->ddr_reg, &static_2900, sizeof(static_2900));
192*1f497308SPankaj Gupta 	memcpy(&priv->dimm, &static_dimm, sizeof(static_dimm));
193*1f497308SPankaj Gupta 	priv->conf.cs_on_dimm[0] = 0x3;
194*1f497308SPankaj Gupta 	ddr_board_options(priv);
195*1f497308SPankaj Gupta 	compute_ddr_phy(priv);
196*1f497308SPankaj Gupta 
197*1f497308SPankaj Gupta 	return ULL(0x400000000);
198*1f497308SPankaj Gupta }
199*1f497308SPankaj Gupta 
200*1f497308SPankaj Gupta #elif defined(CONFIG_DDR_NODIMM)
201*1f497308SPankaj Gupta /*
202*1f497308SPankaj Gupta  * Sample code to bypass reading SPD. This is a sample, not recommended
203*1f497308SPankaj Gupta  * for boards with slots. DDR model number: UDIMM MT18ASF1G72AZ-2G6B1.
204*1f497308SPankaj Gupta  */
205*1f497308SPankaj Gupta struct dimm_params ddr_raw_timing = {
206*1f497308SPankaj Gupta 	.n_ranks = 2U,
207*1f497308SPankaj Gupta 	.rank_density = U(0x200000000),
208*1f497308SPankaj Gupta 	.capacity = U(0x400000000),
209*1f497308SPankaj Gupta 	.primary_sdram_width = 64U,
210*1f497308SPankaj Gupta 	.ec_sdram_width = 8U,
211*1f497308SPankaj Gupta 	.device_width = 8U,
212*1f497308SPankaj Gupta 	.die_density = U(0x5),
213*1f497308SPankaj Gupta 	.rdimm = 0U,
214*1f497308SPankaj Gupta 	.mirrored_dimm = 1U,
215*1f497308SPankaj Gupta 	.n_row_addr = 16U,
216*1f497308SPankaj Gupta 	.n_col_addr = 10U,
217*1f497308SPankaj Gupta 	.bank_addr_bits = 0U,
218*1f497308SPankaj Gupta 	.bank_group_bits = 2U,
219*1f497308SPankaj Gupta 	.edc_config = 2U,
220*1f497308SPankaj Gupta 	.burst_lengths_bitmask = U(0x0c),
221*1f497308SPankaj Gupta 	.tckmin_x_ps = 625,
222*1f497308SPankaj Gupta 	.tckmax_ps = 1600,
223*1f497308SPankaj Gupta 	.caslat_x = U(0x15FFFC00),
224*1f497308SPankaj Gupta 	.taa_ps = 13750,
225*1f497308SPankaj Gupta 	.trcd_ps = 13750,
226*1f497308SPankaj Gupta 	.trp_ps = 13750,
227*1f497308SPankaj Gupta 	.tras_ps = 32000,
228*1f497308SPankaj Gupta 	.trc_ps = 457500,
229*1f497308SPankaj Gupta 	.twr_ps = 15000,
230*1f497308SPankaj Gupta 	.trfc1_ps = 350000,
231*1f497308SPankaj Gupta 	.trfc2_ps = 260000,
232*1f497308SPankaj Gupta 	.trfc4_ps = 160000,
233*1f497308SPankaj Gupta 	.tfaw_ps = 21000,
234*1f497308SPankaj Gupta 	.trrds_ps = 2500,
235*1f497308SPankaj Gupta 	.trrdl_ps = 4900,
236*1f497308SPankaj Gupta 	.tccdl_ps = 5000,
237*1f497308SPankaj Gupta 	.refresh_rate_ps = 7800000U,
238*1f497308SPankaj Gupta };
239*1f497308SPankaj Gupta 
ddr_get_ddr_params(struct dimm_params * pdimm,struct ddr_conf * conf)240*1f497308SPankaj Gupta int ddr_get_ddr_params(struct dimm_params *pdimm,
241*1f497308SPankaj Gupta 		       struct ddr_conf *conf)
242*1f497308SPankaj Gupta {
243*1f497308SPankaj Gupta 	static const char dimm_model[] = "Fixed DDR on board";
244*1f497308SPankaj Gupta 
245*1f497308SPankaj Gupta 	conf->dimm_in_use[0] = 1;	/* Modify accordingly */
246*1f497308SPankaj Gupta 	memcpy(pdimm, &ddr_raw_timing, sizeof(struct dimm_params));
247*1f497308SPankaj Gupta 	memcpy(pdimm->mpart, dimm_model, sizeof(dimm_model) - 1);
248*1f497308SPankaj Gupta 
249*1f497308SPankaj Gupta 	/* valid DIMM mask, change accordingly, together with dimm_on_ctlr. */
250*1f497308SPankaj Gupta 	return 0x5;
251*1f497308SPankaj Gupta }
252*1f497308SPankaj Gupta #endif	/* CONFIG_DDR_NODIMM */
253*1f497308SPankaj Gupta 
ddr_board_options(struct ddr_info * priv)254*1f497308SPankaj Gupta int ddr_board_options(struct ddr_info *priv)
255*1f497308SPankaj Gupta {
256*1f497308SPankaj Gupta 	struct memctl_opt *popts = &priv->opt;
257*1f497308SPankaj Gupta 	const struct ddr_conf *conf = &priv->conf;
258*1f497308SPankaj Gupta 
259*1f497308SPankaj Gupta 	popts->vref_dimm = U(0x19);		/* range 1, 83.4% */
260*1f497308SPankaj Gupta 	popts->rtt_override = 1U;
261*1f497308SPankaj Gupta 	popts->rtt_override_value = 0x5U;	/* RTT being used as 60 ohm */
262*1f497308SPankaj Gupta 	popts->rtt_park = 120U;
263*1f497308SPankaj Gupta 	popts->otf_burst_chop_en = 0;
264*1f497308SPankaj Gupta 	popts->burst_length = DDR_BL8;
265*1f497308SPankaj Gupta 	popts->trwt_override = 1U;
266*1f497308SPankaj Gupta 	popts->bstopre = 0U;			/* auto precharge */
267*1f497308SPankaj Gupta 	popts->addr_hash = 1;
268*1f497308SPankaj Gupta 
269*1f497308SPankaj Gupta 	/* Set ODT impedance on PHY side */
270*1f497308SPankaj Gupta 	switch (conf->cs_on_dimm[1]) {
271*1f497308SPankaj Gupta 	case 0xc:	/* Two slots dual rank */
272*1f497308SPankaj Gupta 	case 0x4:	/* Two slots single rank, not valid for interleaving */
273*1f497308SPankaj Gupta 		popts->trwt = U(0xf);
274*1f497308SPankaj Gupta 		popts->twrt = U(0x7);
275*1f497308SPankaj Gupta 		popts->trrt = U(0x7);
276*1f497308SPankaj Gupta 		popts->twwt = U(0x7);
277*1f497308SPankaj Gupta 		popts->vref_phy = U(0x6B);	/* 83.6% */
278*1f497308SPankaj Gupta 		popts->odt = 60U;
279*1f497308SPankaj Gupta 		popts->phy_tx_impedance = 28U;
280*1f497308SPankaj Gupta 		break;
281*1f497308SPankaj Gupta 	case 0:		/* Ont slot used */
282*1f497308SPankaj Gupta 	default:
283*1f497308SPankaj Gupta 		popts->trwt = U(0x3);
284*1f497308SPankaj Gupta 		popts->twrt = U(0x3);
285*1f497308SPankaj Gupta 		popts->trrt = U(0x3);
286*1f497308SPankaj Gupta 		popts->twwt = U(0x3);
287*1f497308SPankaj Gupta 		popts->vref_phy = U(0x5D);		/* 72% */
288*1f497308SPankaj Gupta 		popts->odt = 60U;
289*1f497308SPankaj Gupta 		popts->phy_tx_impedance = 28U;
290*1f497308SPankaj Gupta 		break;
291*1f497308SPankaj Gupta 	}
292*1f497308SPankaj Gupta 
293*1f497308SPankaj Gupta 	return 0;
294*1f497308SPankaj Gupta }
295*1f497308SPankaj Gupta 
296*1f497308SPankaj Gupta #ifdef NXP_WARM_BOOT
init_ddr(uint32_t wrm_bt_flg)297*1f497308SPankaj Gupta long long init_ddr(uint32_t wrm_bt_flg)
298*1f497308SPankaj Gupta #else
299*1f497308SPankaj Gupta long long init_ddr(void)
300*1f497308SPankaj Gupta #endif
301*1f497308SPankaj Gupta {
302*1f497308SPankaj Gupta 	int spd_addr[] = { 0x51, 0x52, 0x53, 0x54 };
303*1f497308SPankaj Gupta 	struct ddr_info info;
304*1f497308SPankaj Gupta 	struct sysinfo sys;
305*1f497308SPankaj Gupta 	long long dram_size;
306*1f497308SPankaj Gupta 
307*1f497308SPankaj Gupta 	zeromem(&sys, sizeof(sys));
308*1f497308SPankaj Gupta 	if (get_clocks(&sys) != 0) {
309*1f497308SPankaj Gupta 		ERROR("System clocks are not set\n");
310*1f497308SPankaj Gupta 		panic();
311*1f497308SPankaj Gupta 	}
312*1f497308SPankaj Gupta 	debug("platform clock %lu\n", sys.freq_platform);
313*1f497308SPankaj Gupta 	debug("DDR PLL1 %lu\n", sys.freq_ddr_pll0);
314*1f497308SPankaj Gupta 	debug("DDR PLL2 %lu\n", sys.freq_ddr_pll1);
315*1f497308SPankaj Gupta 
316*1f497308SPankaj Gupta 	zeromem(&info, sizeof(info));
317*1f497308SPankaj Gupta 
318*1f497308SPankaj Gupta 	/* Set two DDRC. Unused DDRC will be removed automatically. */
319*1f497308SPankaj Gupta 	info.num_ctlrs = NUM_OF_DDRC;
320*1f497308SPankaj Gupta 	info.spd_addr = spd_addr;
321*1f497308SPankaj Gupta 	info.ddr[0] = (void *)NXP_DDR_ADDR;
322*1f497308SPankaj Gupta 	info.ddr[1] = (void *)NXP_DDR2_ADDR;
323*1f497308SPankaj Gupta 	info.phy[0] = (void *)NXP_DDR_PHY1_ADDR;
324*1f497308SPankaj Gupta 	info.phy[1] = (void *)NXP_DDR_PHY2_ADDR;
325*1f497308SPankaj Gupta 	info.clk = get_ddr_freq(&sys, 0);
326*1f497308SPankaj Gupta 	info.img_loadr = load_img;
327*1f497308SPankaj Gupta 	info.phy_gen2_fw_img_buf = PHY_GEN2_FW_IMAGE_BUFFER;
328*1f497308SPankaj Gupta 	if (info.clk == 0) {
329*1f497308SPankaj Gupta 		info.clk = get_ddr_freq(&sys, 1);
330*1f497308SPankaj Gupta 	}
331*1f497308SPankaj Gupta 	info.dimm_on_ctlr = DDRC_NUM_DIMM;
332*1f497308SPankaj Gupta 
333*1f497308SPankaj Gupta 	info.warm_boot_flag = DDR_WRM_BOOT_NT_SUPPORTED;
334*1f497308SPankaj Gupta #ifdef NXP_WARM_BOOT
335*1f497308SPankaj Gupta 	if (wrm_bt_flg != 0) {
336*1f497308SPankaj Gupta 		info.warm_boot_flag = DDR_WARM_BOOT;
337*1f497308SPankaj Gupta 	} else {
338*1f497308SPankaj Gupta 		info.warm_boot_flag = DDR_COLD_BOOT;
339*1f497308SPankaj Gupta 	}
340*1f497308SPankaj Gupta #endif
341*1f497308SPankaj Gupta 
342*1f497308SPankaj Gupta 	dram_size = dram_init(&info
343*1f497308SPankaj Gupta #if defined(NXP_HAS_CCN504) || defined(NXP_HAS_CCN508)
344*1f497308SPankaj Gupta 				    , NXP_CCN_HN_F_0_ADDR
345*1f497308SPankaj Gupta #endif
346*1f497308SPankaj Gupta 			);
347*1f497308SPankaj Gupta 
348*1f497308SPankaj Gupta 
349*1f497308SPankaj Gupta 	if (dram_size < 0) {
350*1f497308SPankaj Gupta 		ERROR("DDR init failed.\n");
351*1f497308SPankaj Gupta 	}
352*1f497308SPankaj Gupta 
353*1f497308SPankaj Gupta 	return dram_size;
354*1f497308SPankaj Gupta }
355