1*e4061556SMario Six // SPDX-License-Identifier: GPL-2.0+
2*e4061556SMario Six /*
3*e4061556SMario Six * (C) Copyright 2018
4*e4061556SMario Six * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
5*e4061556SMario Six */
6*e4061556SMario Six
7*e4061556SMario Six #include <common.h>
8*e4061556SMario Six #include <dm.h>
9*e4061556SMario Six #include <ram.h>
10*e4061556SMario Six #include <dt-bindings/memory/mpc83xx-sdram.h>
11*e4061556SMario Six
12*e4061556SMario Six DECLARE_GLOBAL_DATA_PTR;
13*e4061556SMario Six
14*e4061556SMario Six /* Masks for the CS config register */
15*e4061556SMario Six static const u32 CSCONFIG_ENABLE = 0x80000000;
16*e4061556SMario Six
17*e4061556SMario Six static const u32 BANK_BITS_2;
18*e4061556SMario Six static const u32 BANK_BITS_3 = 0x00004000;
19*e4061556SMario Six
20*e4061556SMario Six static const u32 ROW_BITS_12;
21*e4061556SMario Six static const u32 ROW_BITS_13 = 0x00000100;
22*e4061556SMario Six static const u32 ROW_BITS_14 = 0x00000200;
23*e4061556SMario Six
24*e4061556SMario Six static const u32 COL_BITS_8;
25*e4061556SMario Six static const u32 COL_BITS_9 = 0x00000001;
26*e4061556SMario Six static const u32 COL_BITS_10 = 0x00000002;
27*e4061556SMario Six static const u32 COL_BITS_11 = 0x00000003;
28*e4061556SMario Six
29*e4061556SMario Six /* Shifts for the DDR SDRAM Timing Configuration 3 register */
30*e4061556SMario Six static const uint TIMING_CFG3_EXT_REFREC_SHIFT = (31 - 15);
31*e4061556SMario Six
32*e4061556SMario Six /* Shifts for the DDR SDRAM Timing Configuration 0 register */
33*e4061556SMario Six static const uint TIMING_CFG0_RWT_SHIFT = (31 - 1);
34*e4061556SMario Six static const uint TIMING_CFG0_WRT_SHIFT = (31 - 3);
35*e4061556SMario Six static const uint TIMING_CFG0_RRT_SHIFT = (31 - 5);
36*e4061556SMario Six static const uint TIMING_CFG0_WWT_SHIFT = (31 - 7);
37*e4061556SMario Six static const uint TIMING_CFG0_ACT_PD_EXIT_SHIFT = (31 - 11);
38*e4061556SMario Six static const uint TIMING_CFG0_PRE_PD_EXIT_SHIFT = (31 - 15);
39*e4061556SMario Six static const uint TIMING_CFG0_ODT_PD_EXIT_SHIFT = (31 - 23);
40*e4061556SMario Six static const uint TIMING_CFG0_MRS_CYC_SHIFT = (31 - 31);
41*e4061556SMario Six
42*e4061556SMario Six /* Shifts for the DDR SDRAM Timing Configuration 1 register */
43*e4061556SMario Six static const uint TIMING_CFG1_PRETOACT_SHIFT = (31 - 3);
44*e4061556SMario Six static const uint TIMING_CFG1_ACTTOPRE_SHIFT = (31 - 7);
45*e4061556SMario Six static const uint TIMING_CFG1_ACTTORW_SHIFT = (31 - 11);
46*e4061556SMario Six static const uint TIMING_CFG1_CASLAT_SHIFT = (31 - 15);
47*e4061556SMario Six static const uint TIMING_CFG1_REFREC_SHIFT = (31 - 19);
48*e4061556SMario Six static const uint TIMING_CFG1_WRREC_SHIFT = (31 - 23);
49*e4061556SMario Six static const uint TIMING_CFG1_ACTTOACT_SHIFT = (31 - 27);
50*e4061556SMario Six static const uint TIMING_CFG1_WRTORD_SHIFT = (31 - 31);
51*e4061556SMario Six
52*e4061556SMario Six /* Shifts for the DDR SDRAM Timing Configuration 2 register */
53*e4061556SMario Six static const uint TIMING_CFG2_CPO_SHIFT = (31 - 8);
54*e4061556SMario Six static const uint TIMING_CFG2_WR_DATA_DELAY_SHIFT = (31 - 21);
55*e4061556SMario Six static const uint TIMING_CFG2_ADD_LAT_SHIFT = (31 - 3);
56*e4061556SMario Six static const uint TIMING_CFG2_WR_LAT_DELAY_SHIFT = (31 - 12);
57*e4061556SMario Six static const uint TIMING_CFG2_RD_TO_PRE_SHIFT = (31 - 18);
58*e4061556SMario Six static const uint TIMING_CFG2_CKE_PLS_SHIFT = (31 - 25);
59*e4061556SMario Six static const uint TIMING_CFG2_FOUR_ACT_SHIFT;
60*e4061556SMario Six
61*e4061556SMario Six /* Shifts for the DDR SDRAM Control Configuration register */
62*e4061556SMario Six static const uint SDRAM_CFG_SREN_SHIFT = (31 - 1);
63*e4061556SMario Six static const uint SDRAM_CFG_ECC_EN_SHIFT = (31 - 2);
64*e4061556SMario Six static const uint SDRAM_CFG_RD_EN_SHIFT = (31 - 3);
65*e4061556SMario Six static const uint SDRAM_CFG_SDRAM_TYPE_SHIFT = (31 - 7);
66*e4061556SMario Six static const uint SDRAM_CFG_DYN_PWR_SHIFT = (31 - 10);
67*e4061556SMario Six static const uint SDRAM_CFG_DBW_SHIFT = (31 - 12);
68*e4061556SMario Six static const uint SDRAM_CFG_NCAP_SHIFT = (31 - 14);
69*e4061556SMario Six static const uint SDRAM_CFG_2T_EN_SHIFT = (31 - 16);
70*e4061556SMario Six static const uint SDRAM_CFG_BA_INTLV_CTL_SHIFT = (31 - 23);
71*e4061556SMario Six static const uint SDRAM_CFG_PCHB8_SHIFT = (31 - 27);
72*e4061556SMario Six static const uint SDRAM_CFG_HSE_SHIFT = (31 - 28);
73*e4061556SMario Six static const uint SDRAM_CFG_BI_SHIFT = (31 - 31);
74*e4061556SMario Six
75*e4061556SMario Six /* Shifts for the DDR SDRAM Control Configuration 2 register */
76*e4061556SMario Six static const uint SDRAM_CFG2_FRC_SR_SHIFT = (31 - 0);
77*e4061556SMario Six static const uint SDRAM_CFG2_DLL_RST_DIS = (31 - 2);
78*e4061556SMario Six static const uint SDRAM_CFG2_DQS_CFG = (31 - 5);
79*e4061556SMario Six static const uint SDRAM_CFG2_ODT_CFG = (31 - 10);
80*e4061556SMario Six static const uint SDRAM_CFG2_NUM_PR = (31 - 19);
81*e4061556SMario Six
82*e4061556SMario Six /* Shifts for the DDR SDRAM Mode register */
83*e4061556SMario Six static const uint SDRAM_MODE_ESD_SHIFT = (31 - 15);
84*e4061556SMario Six static const uint SDRAM_MODE_SD_SHIFT = (31 - 31);
85*e4061556SMario Six
86*e4061556SMario Six /* Shifts for the DDR SDRAM Mode 2 register */
87*e4061556SMario Six static const uint SDRAM_MODE2_ESD2_SHIFT = (31 - 15);
88*e4061556SMario Six static const uint SDRAM_MODE2_ESD3_SHIFT = (31 - 31);
89*e4061556SMario Six
90*e4061556SMario Six /* Shifts for the DDR SDRAM Interval Configuration register */
91*e4061556SMario Six static const uint SDRAM_INTERVAL_REFINT_SHIFT = (31 - 15);
92*e4061556SMario Six static const uint SDRAM_INTERVAL_BSTOPRE_SHIFT = (31 - 31);
93*e4061556SMario Six
94*e4061556SMario Six /* Mask for the DDR SDRAM Mode Control register */
95*e4061556SMario Six static const u32 SDRAM_CFG_MEM_EN = 0x80000000;
96*e4061556SMario Six
dram_init(void)97*e4061556SMario Six int dram_init(void)
98*e4061556SMario Six {
99*e4061556SMario Six struct udevice *ram_ctrl;
100*e4061556SMario Six int ret;
101*e4061556SMario Six
102*e4061556SMario Six /* Current assumption: There is only one RAM controller */
103*e4061556SMario Six ret = uclass_first_device_err(UCLASS_RAM, &ram_ctrl);
104*e4061556SMario Six if (ret) {
105*e4061556SMario Six debug("%s: uclass_first_device_err failed: %d\n",
106*e4061556SMario Six __func__, ret);
107*e4061556SMario Six return ret;
108*e4061556SMario Six }
109*e4061556SMario Six
110*e4061556SMario Six /* FIXME(mario.six@gdsys.cc): Set gd->ram_size? */
111*e4061556SMario Six
112*e4061556SMario Six return 0;
113*e4061556SMario Six }
114*e4061556SMario Six
get_effective_memsize(void)115*e4061556SMario Six phys_size_t get_effective_memsize(void)
116*e4061556SMario Six {
117*e4061556SMario Six if (!IS_ENABLED(CONFIG_VERY_BIG_RAM))
118*e4061556SMario Six return gd->ram_size;
119*e4061556SMario Six
120*e4061556SMario Six /* Limit stack to what we can reasonable map */
121*e4061556SMario Six return ((gd->ram_size > CONFIG_MAX_MEM_MAPPED) ?
122*e4061556SMario Six CONFIG_MAX_MEM_MAPPED : gd->ram_size);
123*e4061556SMario Six }
124*e4061556SMario Six
125*e4061556SMario Six /**
126*e4061556SMario Six * struct mpc83xx_sdram_priv - Private data for MPC83xx RAM controllers
127*e4061556SMario Six * @total_size: The total size of all RAM modules associated with this RAM
128*e4061556SMario Six * controller in bytes
129*e4061556SMario Six */
130*e4061556SMario Six struct mpc83xx_sdram_priv {
131*e4061556SMario Six ulong total_size;
132*e4061556SMario Six };
133*e4061556SMario Six
134*e4061556SMario Six /**
135*e4061556SMario Six * mpc83xx_sdram_static_init() - Statically initialize a RAM module.
136*e4061556SMario Six * @node: Device tree node associated with ths module in question
137*e4061556SMario Six * @cs: The chip select to use for this RAM module
138*e4061556SMario Six * @mapaddr: The address where the RAM module should be mapped
139*e4061556SMario Six * @size: The size of the RAM module to be mapped in bytes
140*e4061556SMario Six *
141*e4061556SMario Six * Return: 0 if OK, -ve on error
142*e4061556SMario Six */
mpc83xx_sdram_static_init(ofnode node,u32 cs,u32 mapaddr,u32 size)143*e4061556SMario Six static int mpc83xx_sdram_static_init(ofnode node, u32 cs, u32 mapaddr, u32 size)
144*e4061556SMario Six {
145*e4061556SMario Six immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
146*e4061556SMario Six u32 msize = size;
147*e4061556SMario Six u32 msize_log2 = __ilog2(msize);
148*e4061556SMario Six u32 auto_precharge, odt_rd_cfg, odt_wr_cfg, bank_bits, row_bits,
149*e4061556SMario Six col_bits;
150*e4061556SMario Six u32 bank_bits_mask, row_bits_mask, col_bits_mask;
151*e4061556SMario Six
152*e4061556SMario Six /* Configure the DDR local access window */
153*e4061556SMario Six out_be32(&im->sysconf.ddrlaw[cs].bar, mapaddr & 0xfffff000);
154*e4061556SMario Six out_be32(&im->sysconf.ddrlaw[cs].ar, LBLAWAR_EN | (msize_log2 - 1));
155*e4061556SMario Six
156*e4061556SMario Six out_be32(&im->ddr.csbnds[cs].csbnds, (msize - 1) >> 24);
157*e4061556SMario Six
158*e4061556SMario Six auto_precharge = ofnode_read_u32_default(node, "auto_precharge", 0);
159*e4061556SMario Six switch (auto_precharge) {
160*e4061556SMario Six case AUTO_PRECHARGE_ENABLE:
161*e4061556SMario Six case AUTO_PRECHARGE_DISABLE:
162*e4061556SMario Six break;
163*e4061556SMario Six default:
164*e4061556SMario Six debug("%s: auto_precharge value %d invalid.\n",
165*e4061556SMario Six ofnode_get_name(node), auto_precharge);
166*e4061556SMario Six return -EINVAL;
167*e4061556SMario Six }
168*e4061556SMario Six
169*e4061556SMario Six odt_rd_cfg = ofnode_read_u32_default(node, "odt_rd_cfg", 0);
170*e4061556SMario Six switch (odt_rd_cfg) {
171*e4061556SMario Six case ODT_RD_ONLY_OTHER_DIMM:
172*e4061556SMario Six if (!IS_ENABLED(CONFIG_MPC8360) &&
173*e4061556SMario Six !IS_ENABLED(CONFIG_MPC837x)) {
174*e4061556SMario Six debug("%s: odt_rd_cfg value %d invalid.\n",
175*e4061556SMario Six ofnode_get_name(node), odt_rd_cfg);
176*e4061556SMario Six return -EINVAL;
177*e4061556SMario Six }
178*e4061556SMario Six /* fall through */
179*e4061556SMario Six case ODT_RD_NEVER:
180*e4061556SMario Six case ODT_RD_ONLY_CURRENT:
181*e4061556SMario Six case ODT_RD_ONLY_OTHER_CS:
182*e4061556SMario Six if (!IS_ENABLED(CONFIG_MPC830x) &&
183*e4061556SMario Six !IS_ENABLED(CONFIG_MPC831x) &&
184*e4061556SMario Six !IS_ENABLED(CONFIG_MPC8360) &&
185*e4061556SMario Six !IS_ENABLED(CONFIG_MPC837x)) {
186*e4061556SMario Six debug("%s: odt_rd_cfg value %d invalid.\n",
187*e4061556SMario Six ofnode_get_name(node), odt_rd_cfg);
188*e4061556SMario Six return -EINVAL;
189*e4061556SMario Six }
190*e4061556SMario Six /* fall through */
191*e4061556SMario Six /* Only MPC832x knows this value */
192*e4061556SMario Six case ODT_RD_ALL:
193*e4061556SMario Six break;
194*e4061556SMario Six default:
195*e4061556SMario Six debug("%s: odt_rd_cfg value %d invalid.\n",
196*e4061556SMario Six ofnode_get_name(node), odt_rd_cfg);
197*e4061556SMario Six return -EINVAL;
198*e4061556SMario Six }
199*e4061556SMario Six
200*e4061556SMario Six odt_wr_cfg = ofnode_read_u32_default(node, "odt_wr_cfg", 0);
201*e4061556SMario Six switch (odt_wr_cfg) {
202*e4061556SMario Six case ODT_WR_ONLY_OTHER_DIMM:
203*e4061556SMario Six if (!IS_ENABLED(CONFIG_MPC8360) &&
204*e4061556SMario Six !IS_ENABLED(CONFIG_MPC837x)) {
205*e4061556SMario Six debug("%s: odt_wr_cfg value %d invalid.\n",
206*e4061556SMario Six ofnode_get_name(node), odt_wr_cfg);
207*e4061556SMario Six return -EINVAL;
208*e4061556SMario Six }
209*e4061556SMario Six /* fall through */
210*e4061556SMario Six case ODT_WR_NEVER:
211*e4061556SMario Six case ODT_WR_ONLY_CURRENT:
212*e4061556SMario Six case ODT_WR_ONLY_OTHER_CS:
213*e4061556SMario Six if (!IS_ENABLED(CONFIG_MPC830x) &&
214*e4061556SMario Six !IS_ENABLED(CONFIG_MPC831x) &&
215*e4061556SMario Six !IS_ENABLED(CONFIG_MPC8360) &&
216*e4061556SMario Six !IS_ENABLED(CONFIG_MPC837x)) {
217*e4061556SMario Six debug("%s: odt_wr_cfg value %d invalid.\n",
218*e4061556SMario Six ofnode_get_name(node), odt_wr_cfg);
219*e4061556SMario Six return -EINVAL;
220*e4061556SMario Six }
221*e4061556SMario Six /* fall through */
222*e4061556SMario Six /* MPC832x only knows this value */
223*e4061556SMario Six case ODT_WR_ALL:
224*e4061556SMario Six break;
225*e4061556SMario Six default:
226*e4061556SMario Six debug("%s: odt_wr_cfg value %d invalid.\n",
227*e4061556SMario Six ofnode_get_name(node), odt_wr_cfg);
228*e4061556SMario Six return -EINVAL;
229*e4061556SMario Six }
230*e4061556SMario Six
231*e4061556SMario Six bank_bits = ofnode_read_u32_default(node, "bank_bits", 0);
232*e4061556SMario Six switch (bank_bits) {
233*e4061556SMario Six case 2:
234*e4061556SMario Six bank_bits_mask = BANK_BITS_2;
235*e4061556SMario Six break;
236*e4061556SMario Six case 3:
237*e4061556SMario Six bank_bits_mask = BANK_BITS_3;
238*e4061556SMario Six break;
239*e4061556SMario Six default:
240*e4061556SMario Six debug("%s: bank_bits value %d invalid.\n",
241*e4061556SMario Six ofnode_get_name(node), bank_bits);
242*e4061556SMario Six return -EINVAL;
243*e4061556SMario Six }
244*e4061556SMario Six
245*e4061556SMario Six row_bits = ofnode_read_u32_default(node, "row_bits", 0);
246*e4061556SMario Six switch (row_bits) {
247*e4061556SMario Six case 12:
248*e4061556SMario Six row_bits_mask = ROW_BITS_12;
249*e4061556SMario Six break;
250*e4061556SMario Six case 13:
251*e4061556SMario Six row_bits_mask = ROW_BITS_13;
252*e4061556SMario Six break;
253*e4061556SMario Six case 14:
254*e4061556SMario Six row_bits_mask = ROW_BITS_14;
255*e4061556SMario Six break;
256*e4061556SMario Six default:
257*e4061556SMario Six debug("%s: row_bits value %d invalid.\n",
258*e4061556SMario Six ofnode_get_name(node), row_bits);
259*e4061556SMario Six return -EINVAL;
260*e4061556SMario Six }
261*e4061556SMario Six
262*e4061556SMario Six col_bits = ofnode_read_u32_default(node, "col_bits", 0);
263*e4061556SMario Six switch (col_bits) {
264*e4061556SMario Six case 8:
265*e4061556SMario Six col_bits_mask = COL_BITS_8;
266*e4061556SMario Six break;
267*e4061556SMario Six case 9:
268*e4061556SMario Six col_bits_mask = COL_BITS_9;
269*e4061556SMario Six break;
270*e4061556SMario Six case 10:
271*e4061556SMario Six col_bits_mask = COL_BITS_10;
272*e4061556SMario Six break;
273*e4061556SMario Six case 11:
274*e4061556SMario Six col_bits_mask = COL_BITS_11;
275*e4061556SMario Six break;
276*e4061556SMario Six default:
277*e4061556SMario Six debug("%s: col_bits value %d invalid.\n",
278*e4061556SMario Six ofnode_get_name(node), col_bits);
279*e4061556SMario Six return -EINVAL;
280*e4061556SMario Six }
281*e4061556SMario Six
282*e4061556SMario Six /* Write CS config value */
283*e4061556SMario Six out_be32(&im->ddr.cs_config[cs], CSCONFIG_ENABLE | auto_precharge |
284*e4061556SMario Six odt_rd_cfg | odt_wr_cfg |
285*e4061556SMario Six bank_bits_mask | row_bits_mask |
286*e4061556SMario Six col_bits_mask);
287*e4061556SMario Six return 0;
288*e4061556SMario Six }
289*e4061556SMario Six
290*e4061556SMario Six /**
291*e4061556SMario Six * mpc83xx_sdram_spd_init() - Initialize a RAM module using a SPD flash.
292*e4061556SMario Six * @node: Device tree node associated with ths module in question
293*e4061556SMario Six * @cs: The chip select to use for this RAM module
294*e4061556SMario Six * @mapaddr: The address where the RAM module should be mapped
295*e4061556SMario Six * @size: The size of the RAM module to be mapped in bytes
296*e4061556SMario Six *
297*e4061556SMario Six * Return: 0 if OK, -ve on error
298*e4061556SMario Six */
mpc83xx_sdram_spd_init(ofnode node,u32 cs,u32 mapaddr,u32 size)299*e4061556SMario Six static int mpc83xx_sdram_spd_init(ofnode node, u32 cs, u32 mapaddr, u32 size)
300*e4061556SMario Six {
301*e4061556SMario Six /* TODO(mario.six@gdsys.cc): Implement */
302*e4061556SMario Six return 0;
303*e4061556SMario Six }
304*e4061556SMario Six
mpc83xx_sdram_ofdata_to_platdata(struct udevice * dev)305*e4061556SMario Six static int mpc83xx_sdram_ofdata_to_platdata(struct udevice *dev)
306*e4061556SMario Six {
307*e4061556SMario Six return 0;
308*e4061556SMario Six }
309*e4061556SMario Six
mpc83xx_sdram_probe(struct udevice * dev)310*e4061556SMario Six static int mpc83xx_sdram_probe(struct udevice *dev)
311*e4061556SMario Six {
312*e4061556SMario Six struct mpc83xx_sdram_priv *priv = dev_get_priv(dev);
313*e4061556SMario Six immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
314*e4061556SMario Six int ret = 0;
315*e4061556SMario Six ofnode subnode;
316*e4061556SMario Six /* DDR control driver register values */
317*e4061556SMario Six u32 dso, pz_override, nz_override, odt_term, ddr_type, mvref_sel, m_odr;
318*e4061556SMario Six u32 ddrcdr;
319*e4061556SMario Six /* DDR SDRAM Clock Control register values */
320*e4061556SMario Six u32 clock_adjust;
321*e4061556SMario Six /* DDR SDRAM Timing Configuration 3 register values */
322*e4061556SMario Six u32 ext_refresh_rec, ext_refresh_rec_mask;
323*e4061556SMario Six /* DDR SDRAM Timing Configuration 0 register values */
324*e4061556SMario Six u32 read_to_write, write_to_read, read_to_read, write_to_write,
325*e4061556SMario Six active_powerdown_exit, precharge_powerdown_exit,
326*e4061556SMario Six odt_powerdown_exit, mode_reg_set_cycle;
327*e4061556SMario Six u32 timing_cfg_0;
328*e4061556SMario Six /* DDR SDRAM Timing Configuration 1 register values */
329*e4061556SMario Six u32 precharge_to_activate, activate_to_precharge,
330*e4061556SMario Six activate_to_readwrite, mcas_latency, refresh_recovery,
331*e4061556SMario Six last_data_to_precharge, activate_to_activate,
332*e4061556SMario Six last_write_data_to_read;
333*e4061556SMario Six u32 timing_cfg_1;
334*e4061556SMario Six /* DDR SDRAM Timing Configuration 2 register values */
335*e4061556SMario Six u32 additive_latency, mcas_to_preamble_override, write_latency,
336*e4061556SMario Six read_to_precharge, write_cmd_to_write_data,
337*e4061556SMario Six minimum_cke_pulse_width, four_activates_window;
338*e4061556SMario Six u32 timing_cfg_2;
339*e4061556SMario Six /* DDR SDRAM Control Configuration register values */
340*e4061556SMario Six u32 self_refresh, ecc, registered_dram, sdram_type,
341*e4061556SMario Six dynamic_power_management, databus_width, nc_auto_precharge,
342*e4061556SMario Six timing_2t, bank_interleaving_ctrl, precharge_bit_8, half_strength,
343*e4061556SMario Six bypass_initialization;
344*e4061556SMario Six u32 sdram_cfg;
345*e4061556SMario Six /* DDR SDRAM Control Configuration 2 register values */
346*e4061556SMario Six u32 force_self_refresh, dll_reset, dqs_config, odt_config,
347*e4061556SMario Six posted_refreshes;
348*e4061556SMario Six u32 sdram_cfg2;
349*e4061556SMario Six /* DDR SDRAM Mode Configuration register values */
350*e4061556SMario Six u32 sdmode, esdmode;
351*e4061556SMario Six u32 sdram_mode;
352*e4061556SMario Six /* DDR SDRAM Mode Configuration 2 register values */
353*e4061556SMario Six u32 esdmode2, esdmode3;
354*e4061556SMario Six u32 sdram_mode2;
355*e4061556SMario Six /* DDR SDRAM Interval Configuration register values */
356*e4061556SMario Six u32 refresh_interval, precharge_interval;
357*e4061556SMario Six u32 sdram_interval;
358*e4061556SMario Six
359*e4061556SMario Six priv->total_size = 0;
360*e4061556SMario Six
361*e4061556SMario Six /* Disable both banks initially (might be re-enabled in loop below) */
362*e4061556SMario Six out_be32(&im->ddr.cs_config[0], 0);
363*e4061556SMario Six out_be32(&im->ddr.cs_config[1], 0);
364*e4061556SMario Six
365*e4061556SMario Six dso = dev_read_u32_default(dev, "driver_software_override", 0);
366*e4061556SMario Six if (dso > 1) {
367*e4061556SMario Six debug("%s: driver_software_override value %d invalid.\n",
368*e4061556SMario Six dev->name, dso);
369*e4061556SMario Six return -EINVAL;
370*e4061556SMario Six }
371*e4061556SMario Six
372*e4061556SMario Six pz_override = dev_read_u32_default(dev, "p_impedance_override", 0);
373*e4061556SMario Six
374*e4061556SMario Six switch (pz_override) {
375*e4061556SMario Six case DSO_P_IMPEDANCE_HIGHEST_Z:
376*e4061556SMario Six case DSO_P_IMPEDANCE_MUCH_HIGHER_Z:
377*e4061556SMario Six case DSO_P_IMPEDANCE_HIGHER_Z:
378*e4061556SMario Six case DSO_P_IMPEDANCE_NOMINAL:
379*e4061556SMario Six case DSO_P_IMPEDANCE_LOWER_Z:
380*e4061556SMario Six break;
381*e4061556SMario Six default:
382*e4061556SMario Six debug("%s: p_impedance_override value %d invalid.\n",
383*e4061556SMario Six dev->name, pz_override);
384*e4061556SMario Six return -EINVAL;
385*e4061556SMario Six }
386*e4061556SMario Six
387*e4061556SMario Six nz_override = dev_read_u32_default(dev, "n_impedance_override", 0);
388*e4061556SMario Six
389*e4061556SMario Six switch (nz_override) {
390*e4061556SMario Six case DSO_N_IMPEDANCE_HIGHEST_Z:
391*e4061556SMario Six case DSO_N_IMPEDANCE_MUCH_HIGHER_Z:
392*e4061556SMario Six case DSO_N_IMPEDANCE_HIGHER_Z:
393*e4061556SMario Six case DSO_N_IMPEDANCE_NOMINAL:
394*e4061556SMario Six case DSO_N_IMPEDANCE_LOWER_Z:
395*e4061556SMario Six break;
396*e4061556SMario Six default:
397*e4061556SMario Six debug("%s: n_impedance_override value %d invalid.\n",
398*e4061556SMario Six dev->name, nz_override);
399*e4061556SMario Six return -EINVAL;
400*e4061556SMario Six }
401*e4061556SMario Six
402*e4061556SMario Six odt_term = dev_read_u32_default(dev, "odt_termination_value", 0);
403*e4061556SMario Six if (odt_term > 1) {
404*e4061556SMario Six debug("%s: odt_termination_value value %d invalid.\n",
405*e4061556SMario Six dev->name, odt_term);
406*e4061556SMario Six return -EINVAL;
407*e4061556SMario Six }
408*e4061556SMario Six
409*e4061556SMario Six ddr_type = dev_read_u32_default(dev, "ddr_type", 0);
410*e4061556SMario Six if (ddr_type > 1) {
411*e4061556SMario Six debug("%s: ddr_type value %d invalid.\n",
412*e4061556SMario Six dev->name, ddr_type);
413*e4061556SMario Six return -EINVAL;
414*e4061556SMario Six }
415*e4061556SMario Six
416*e4061556SMario Six mvref_sel = dev_read_u32_default(dev, "mvref_sel", 0);
417*e4061556SMario Six if (mvref_sel > 1) {
418*e4061556SMario Six debug("%s: mvref_sel value %d invalid.\n",
419*e4061556SMario Six dev->name, mvref_sel);
420*e4061556SMario Six return -EINVAL;
421*e4061556SMario Six }
422*e4061556SMario Six
423*e4061556SMario Six m_odr = dev_read_u32_default(dev, "m_odr", 0);
424*e4061556SMario Six if (mvref_sel > 1) {
425*e4061556SMario Six debug("%s: m_odr value %d invalid.\n",
426*e4061556SMario Six dev->name, m_odr);
427*e4061556SMario Six return -EINVAL;
428*e4061556SMario Six }
429*e4061556SMario Six
430*e4061556SMario Six ddrcdr = dso << (31 - 1) |
431*e4061556SMario Six pz_override << (31 - 5) |
432*e4061556SMario Six nz_override << (31 - 9) |
433*e4061556SMario Six odt_term << (31 - 12) |
434*e4061556SMario Six ddr_type << (31 - 13) |
435*e4061556SMario Six mvref_sel << (31 - 29) |
436*e4061556SMario Six m_odr << (31 - 30) | 1;
437*e4061556SMario Six
438*e4061556SMario Six /* Configure the DDR control driver register */
439*e4061556SMario Six out_be32(&im->sysconf.ddrcdr, ddrcdr);
440*e4061556SMario Six
441*e4061556SMario Six dev_for_each_subnode(subnode, dev) {
442*e4061556SMario Six u32 val[3];
443*e4061556SMario Six u32 cs, addr, size;
444*e4061556SMario Six
445*e4061556SMario Six /* CS, map address, size -> three values */
446*e4061556SMario Six ofnode_read_u32_array(subnode, "reg", val, 3);
447*e4061556SMario Six
448*e4061556SMario Six cs = val[0];
449*e4061556SMario Six addr = val[1];
450*e4061556SMario Six size = val[2];
451*e4061556SMario Six
452*e4061556SMario Six if (cs > 1) {
453*e4061556SMario Six debug("%s: chip select value %d invalid.\n",
454*e4061556SMario Six dev->name, cs);
455*e4061556SMario Six return -EINVAL;
456*e4061556SMario Six }
457*e4061556SMario Six
458*e4061556SMario Six /* TODO(mario.six@gdsys.cc): Sanity check for size. */
459*e4061556SMario Six
460*e4061556SMario Six if (ofnode_read_bool(subnode, "read-spd"))
461*e4061556SMario Six ret = mpc83xx_sdram_spd_init(subnode, cs, addr, size);
462*e4061556SMario Six else
463*e4061556SMario Six ret = mpc83xx_sdram_static_init(subnode, cs, addr,
464*e4061556SMario Six size);
465*e4061556SMario Six if (ret) {
466*e4061556SMario Six debug("%s: RAM init failed.\n", dev->name);
467*e4061556SMario Six return ret;
468*e4061556SMario Six }
469*e4061556SMario Six };
470*e4061556SMario Six
471*e4061556SMario Six /*
472*e4061556SMario Six * TODO(mario.six@gdsys.cc): This should only occur for static
473*e4061556SMario Six * configuration
474*e4061556SMario Six */
475*e4061556SMario Six
476*e4061556SMario Six clock_adjust = dev_read_u32_default(dev, "clock_adjust", 0);
477*e4061556SMario Six switch (clock_adjust) {
478*e4061556SMario Six case CLOCK_ADJUST_025:
479*e4061556SMario Six case CLOCK_ADJUST_05:
480*e4061556SMario Six case CLOCK_ADJUST_075:
481*e4061556SMario Six case CLOCK_ADJUST_1:
482*e4061556SMario Six break;
483*e4061556SMario Six default:
484*e4061556SMario Six debug("%s: clock_adjust value %d invalid.\n",
485*e4061556SMario Six dev->name, clock_adjust);
486*e4061556SMario Six return -EINVAL;
487*e4061556SMario Six }
488*e4061556SMario Six
489*e4061556SMario Six /* Configure the DDR SDRAM Clock Control register */
490*e4061556SMario Six out_be32(&im->ddr.sdram_clk_cntl, clock_adjust);
491*e4061556SMario Six
492*e4061556SMario Six ext_refresh_rec = dev_read_u32_default(dev, "ext_refresh_rec", 0);
493*e4061556SMario Six switch (ext_refresh_rec) {
494*e4061556SMario Six case 0:
495*e4061556SMario Six ext_refresh_rec_mask = 0 << TIMING_CFG3_EXT_REFREC_SHIFT;
496*e4061556SMario Six break;
497*e4061556SMario Six case 16:
498*e4061556SMario Six ext_refresh_rec_mask = 1 << TIMING_CFG3_EXT_REFREC_SHIFT;
499*e4061556SMario Six break;
500*e4061556SMario Six case 32:
501*e4061556SMario Six ext_refresh_rec_mask = 2 << TIMING_CFG3_EXT_REFREC_SHIFT;
502*e4061556SMario Six break;
503*e4061556SMario Six case 48:
504*e4061556SMario Six ext_refresh_rec_mask = 3 << TIMING_CFG3_EXT_REFREC_SHIFT;
505*e4061556SMario Six break;
506*e4061556SMario Six case 64:
507*e4061556SMario Six ext_refresh_rec_mask = 4 << TIMING_CFG3_EXT_REFREC_SHIFT;
508*e4061556SMario Six break;
509*e4061556SMario Six case 80:
510*e4061556SMario Six ext_refresh_rec_mask = 5 << TIMING_CFG3_EXT_REFREC_SHIFT;
511*e4061556SMario Six break;
512*e4061556SMario Six case 96:
513*e4061556SMario Six ext_refresh_rec_mask = 6 << TIMING_CFG3_EXT_REFREC_SHIFT;
514*e4061556SMario Six break;
515*e4061556SMario Six case 112:
516*e4061556SMario Six ext_refresh_rec_mask = 7 << TIMING_CFG3_EXT_REFREC_SHIFT;
517*e4061556SMario Six break;
518*e4061556SMario Six default:
519*e4061556SMario Six debug("%s: ext_refresh_rec value %d invalid.\n",
520*e4061556SMario Six dev->name, ext_refresh_rec);
521*e4061556SMario Six return -EINVAL;
522*e4061556SMario Six }
523*e4061556SMario Six
524*e4061556SMario Six /* Configure the DDR SDRAM Timing Configuration 3 register */
525*e4061556SMario Six out_be32(&im->ddr.timing_cfg_3, ext_refresh_rec_mask);
526*e4061556SMario Six
527*e4061556SMario Six read_to_write = dev_read_u32_default(dev, "read_to_write", 0);
528*e4061556SMario Six if (read_to_write > 3) {
529*e4061556SMario Six debug("%s: read_to_write value %d invalid.\n",
530*e4061556SMario Six dev->name, read_to_write);
531*e4061556SMario Six return -EINVAL;
532*e4061556SMario Six }
533*e4061556SMario Six
534*e4061556SMario Six write_to_read = dev_read_u32_default(dev, "write_to_read", 0);
535*e4061556SMario Six if (write_to_read > 3) {
536*e4061556SMario Six debug("%s: write_to_read value %d invalid.\n",
537*e4061556SMario Six dev->name, write_to_read);
538*e4061556SMario Six return -EINVAL;
539*e4061556SMario Six }
540*e4061556SMario Six
541*e4061556SMario Six read_to_read = dev_read_u32_default(dev, "read_to_read", 0);
542*e4061556SMario Six if (read_to_read > 3) {
543*e4061556SMario Six debug("%s: read_to_read value %d invalid.\n",
544*e4061556SMario Six dev->name, read_to_read);
545*e4061556SMario Six return -EINVAL;
546*e4061556SMario Six }
547*e4061556SMario Six
548*e4061556SMario Six write_to_write = dev_read_u32_default(dev, "write_to_write", 0);
549*e4061556SMario Six if (write_to_write > 3) {
550*e4061556SMario Six debug("%s: write_to_write value %d invalid.\n",
551*e4061556SMario Six dev->name, write_to_write);
552*e4061556SMario Six return -EINVAL;
553*e4061556SMario Six }
554*e4061556SMario Six
555*e4061556SMario Six active_powerdown_exit =
556*e4061556SMario Six dev_read_u32_default(dev, "active_powerdown_exit", 0);
557*e4061556SMario Six if (active_powerdown_exit > 7) {
558*e4061556SMario Six debug("%s: active_powerdown_exit value %d invalid.\n",
559*e4061556SMario Six dev->name, active_powerdown_exit);
560*e4061556SMario Six return -EINVAL;
561*e4061556SMario Six }
562*e4061556SMario Six
563*e4061556SMario Six precharge_powerdown_exit =
564*e4061556SMario Six dev_read_u32_default(dev, "precharge_powerdown_exit", 0);
565*e4061556SMario Six if (precharge_powerdown_exit > 7) {
566*e4061556SMario Six debug("%s: precharge_powerdown_exit value %d invalid.\n",
567*e4061556SMario Six dev->name, precharge_powerdown_exit);
568*e4061556SMario Six return -EINVAL;
569*e4061556SMario Six }
570*e4061556SMario Six
571*e4061556SMario Six odt_powerdown_exit = dev_read_u32_default(dev, "odt_powerdown_exit", 0);
572*e4061556SMario Six if (odt_powerdown_exit > 15) {
573*e4061556SMario Six debug("%s: odt_powerdown_exit value %d invalid.\n",
574*e4061556SMario Six dev->name, odt_powerdown_exit);
575*e4061556SMario Six return -EINVAL;
576*e4061556SMario Six }
577*e4061556SMario Six
578*e4061556SMario Six mode_reg_set_cycle = dev_read_u32_default(dev, "mode_reg_set_cycle", 0);
579*e4061556SMario Six if (mode_reg_set_cycle > 15) {
580*e4061556SMario Six debug("%s: mode_reg_set_cycle value %d invalid.\n",
581*e4061556SMario Six dev->name, mode_reg_set_cycle);
582*e4061556SMario Six return -EINVAL;
583*e4061556SMario Six }
584*e4061556SMario Six
585*e4061556SMario Six timing_cfg_0 = read_to_write << TIMING_CFG0_RWT_SHIFT |
586*e4061556SMario Six write_to_read << TIMING_CFG0_WRT_SHIFT |
587*e4061556SMario Six read_to_read << TIMING_CFG0_RRT_SHIFT |
588*e4061556SMario Six write_to_write << TIMING_CFG0_WWT_SHIFT |
589*e4061556SMario Six active_powerdown_exit << TIMING_CFG0_ACT_PD_EXIT_SHIFT |
590*e4061556SMario Six precharge_powerdown_exit << TIMING_CFG0_PRE_PD_EXIT_SHIFT |
591*e4061556SMario Six odt_powerdown_exit << TIMING_CFG0_ODT_PD_EXIT_SHIFT |
592*e4061556SMario Six mode_reg_set_cycle << TIMING_CFG0_MRS_CYC_SHIFT;
593*e4061556SMario Six
594*e4061556SMario Six out_be32(&im->ddr.timing_cfg_0, timing_cfg_0);
595*e4061556SMario Six
596*e4061556SMario Six precharge_to_activate =
597*e4061556SMario Six dev_read_u32_default(dev, "precharge_to_activate", 0);
598*e4061556SMario Six if (precharge_to_activate > 7 || precharge_to_activate == 0) {
599*e4061556SMario Six debug("%s: precharge_to_activate value %d invalid.\n",
600*e4061556SMario Six dev->name, precharge_to_activate);
601*e4061556SMario Six return -EINVAL;
602*e4061556SMario Six }
603*e4061556SMario Six
604*e4061556SMario Six activate_to_precharge =
605*e4061556SMario Six dev_read_u32_default(dev, "activate_to_precharge", 0);
606*e4061556SMario Six if (activate_to_precharge > 19) {
607*e4061556SMario Six debug("%s: activate_to_precharge value %d invalid.\n",
608*e4061556SMario Six dev->name, activate_to_precharge);
609*e4061556SMario Six return -EINVAL;
610*e4061556SMario Six }
611*e4061556SMario Six
612*e4061556SMario Six activate_to_readwrite =
613*e4061556SMario Six dev_read_u32_default(dev, "activate_to_readwrite", 0);
614*e4061556SMario Six if (activate_to_readwrite > 7 || activate_to_readwrite == 0) {
615*e4061556SMario Six debug("%s: activate_to_readwrite value %d invalid.\n",
616*e4061556SMario Six dev->name, activate_to_readwrite);
617*e4061556SMario Six return -EINVAL;
618*e4061556SMario Six }
619*e4061556SMario Six
620*e4061556SMario Six mcas_latency = dev_read_u32_default(dev, "mcas_latency", 0);
621*e4061556SMario Six switch (mcas_latency) {
622*e4061556SMario Six case CASLAT_20:
623*e4061556SMario Six case CASLAT_25:
624*e4061556SMario Six if (!IS_ENABLED(CONFIG_ARCH_MPC8308)) {
625*e4061556SMario Six debug("%s: MCAS latency < 3.0 unsupported on MPC8308\n",
626*e4061556SMario Six dev->name);
627*e4061556SMario Six return -EINVAL;
628*e4061556SMario Six }
629*e4061556SMario Six /* fall through */
630*e4061556SMario Six case CASLAT_30:
631*e4061556SMario Six case CASLAT_35:
632*e4061556SMario Six case CASLAT_40:
633*e4061556SMario Six case CASLAT_45:
634*e4061556SMario Six case CASLAT_50:
635*e4061556SMario Six case CASLAT_55:
636*e4061556SMario Six case CASLAT_60:
637*e4061556SMario Six case CASLAT_65:
638*e4061556SMario Six case CASLAT_70:
639*e4061556SMario Six case CASLAT_75:
640*e4061556SMario Six case CASLAT_80:
641*e4061556SMario Six break;
642*e4061556SMario Six default:
643*e4061556SMario Six debug("%s: mcas_latency value %d invalid.\n",
644*e4061556SMario Six dev->name, mcas_latency);
645*e4061556SMario Six return -EINVAL;
646*e4061556SMario Six }
647*e4061556SMario Six
648*e4061556SMario Six refresh_recovery = dev_read_u32_default(dev, "refresh_recovery", 0);
649*e4061556SMario Six if (refresh_recovery > 23 || refresh_recovery < 8) {
650*e4061556SMario Six debug("%s: refresh_recovery value %d invalid.\n",
651*e4061556SMario Six dev->name, refresh_recovery);
652*e4061556SMario Six return -EINVAL;
653*e4061556SMario Six }
654*e4061556SMario Six
655*e4061556SMario Six last_data_to_precharge =
656*e4061556SMario Six dev_read_u32_default(dev, "last_data_to_precharge", 0);
657*e4061556SMario Six if (last_data_to_precharge > 7 || last_data_to_precharge == 0) {
658*e4061556SMario Six debug("%s: last_data_to_precharge value %d invalid.\n",
659*e4061556SMario Six dev->name, last_data_to_precharge);
660*e4061556SMario Six return -EINVAL;
661*e4061556SMario Six }
662*e4061556SMario Six
663*e4061556SMario Six activate_to_activate =
664*e4061556SMario Six dev_read_u32_default(dev, "activate_to_activate", 0);
665*e4061556SMario Six if (activate_to_activate > 7 || activate_to_activate == 0) {
666*e4061556SMario Six debug("%s: activate_to_activate value %d invalid.\n",
667*e4061556SMario Six dev->name, activate_to_activate);
668*e4061556SMario Six return -EINVAL;
669*e4061556SMario Six }
670*e4061556SMario Six
671*e4061556SMario Six last_write_data_to_read =
672*e4061556SMario Six dev_read_u32_default(dev, "last_write_data_to_read", 0);
673*e4061556SMario Six if (last_write_data_to_read > 7 || last_write_data_to_read == 0) {
674*e4061556SMario Six debug("%s: last_write_data_to_read value %d invalid.\n",
675*e4061556SMario Six dev->name, last_write_data_to_read);
676*e4061556SMario Six return -EINVAL;
677*e4061556SMario Six }
678*e4061556SMario Six
679*e4061556SMario Six timing_cfg_1 = precharge_to_activate << TIMING_CFG1_PRETOACT_SHIFT |
680*e4061556SMario Six (activate_to_precharge > 15 ?
681*e4061556SMario Six activate_to_precharge - 16 :
682*e4061556SMario Six activate_to_precharge) << TIMING_CFG1_ACTTOPRE_SHIFT |
683*e4061556SMario Six activate_to_readwrite << TIMING_CFG1_ACTTORW_SHIFT |
684*e4061556SMario Six mcas_latency << TIMING_CFG1_CASLAT_SHIFT |
685*e4061556SMario Six (refresh_recovery - 8) << TIMING_CFG1_REFREC_SHIFT |
686*e4061556SMario Six last_data_to_precharge << TIMING_CFG1_WRREC_SHIFT |
687*e4061556SMario Six activate_to_activate << TIMING_CFG1_ACTTOACT_SHIFT |
688*e4061556SMario Six last_write_data_to_read << TIMING_CFG1_WRTORD_SHIFT;
689*e4061556SMario Six
690*e4061556SMario Six /* Configure the DDR SDRAM Timing Configuration 1 register */
691*e4061556SMario Six out_be32(&im->ddr.timing_cfg_1, timing_cfg_1);
692*e4061556SMario Six
693*e4061556SMario Six additive_latency = dev_read_u32_default(dev, "additive_latency", 0);
694*e4061556SMario Six if (additive_latency > 5) {
695*e4061556SMario Six debug("%s: additive_latency value %d invalid.\n",
696*e4061556SMario Six dev->name, additive_latency);
697*e4061556SMario Six return -EINVAL;
698*e4061556SMario Six }
699*e4061556SMario Six
700*e4061556SMario Six mcas_to_preamble_override =
701*e4061556SMario Six dev_read_u32_default(dev, "mcas_to_preamble_override", 0);
702*e4061556SMario Six switch (mcas_to_preamble_override) {
703*e4061556SMario Six case READ_LAT_PLUS_1:
704*e4061556SMario Six case READ_LAT:
705*e4061556SMario Six case READ_LAT_PLUS_1_4:
706*e4061556SMario Six case READ_LAT_PLUS_1_2:
707*e4061556SMario Six case READ_LAT_PLUS_3_4:
708*e4061556SMario Six case READ_LAT_PLUS_5_4:
709*e4061556SMario Six case READ_LAT_PLUS_3_2:
710*e4061556SMario Six case READ_LAT_PLUS_7_4:
711*e4061556SMario Six case READ_LAT_PLUS_2:
712*e4061556SMario Six case READ_LAT_PLUS_9_4:
713*e4061556SMario Six case READ_LAT_PLUS_5_2:
714*e4061556SMario Six case READ_LAT_PLUS_11_4:
715*e4061556SMario Six case READ_LAT_PLUS_3:
716*e4061556SMario Six case READ_LAT_PLUS_13_4:
717*e4061556SMario Six case READ_LAT_PLUS_7_2:
718*e4061556SMario Six case READ_LAT_PLUS_15_4:
719*e4061556SMario Six case READ_LAT_PLUS_4:
720*e4061556SMario Six case READ_LAT_PLUS_17_4:
721*e4061556SMario Six case READ_LAT_PLUS_9_2:
722*e4061556SMario Six case READ_LAT_PLUS_19_4:
723*e4061556SMario Six break;
724*e4061556SMario Six default:
725*e4061556SMario Six debug("%s: mcas_to_preamble_override value %d invalid.\n",
726*e4061556SMario Six dev->name, mcas_to_preamble_override);
727*e4061556SMario Six return -EINVAL;
728*e4061556SMario Six }
729*e4061556SMario Six
730*e4061556SMario Six write_latency = dev_read_u32_default(dev, "write_latency", 0);
731*e4061556SMario Six if (write_latency > 7 || write_latency == 0) {
732*e4061556SMario Six debug("%s: write_latency value %d invalid.\n",
733*e4061556SMario Six dev->name, write_latency);
734*e4061556SMario Six return -EINVAL;
735*e4061556SMario Six }
736*e4061556SMario Six
737*e4061556SMario Six read_to_precharge = dev_read_u32_default(dev, "read_to_precharge", 0);
738*e4061556SMario Six if (read_to_precharge > 4 || read_to_precharge == 0) {
739*e4061556SMario Six debug("%s: read_to_precharge value %d invalid.\n",
740*e4061556SMario Six dev->name, read_to_precharge);
741*e4061556SMario Six return -EINVAL;
742*e4061556SMario Six }
743*e4061556SMario Six
744*e4061556SMario Six write_cmd_to_write_data =
745*e4061556SMario Six dev_read_u32_default(dev, "write_cmd_to_write_data", 0);
746*e4061556SMario Six switch (write_cmd_to_write_data) {
747*e4061556SMario Six case CLOCK_DELAY_0:
748*e4061556SMario Six case CLOCK_DELAY_1_4:
749*e4061556SMario Six case CLOCK_DELAY_1_2:
750*e4061556SMario Six case CLOCK_DELAY_3_4:
751*e4061556SMario Six case CLOCK_DELAY_1:
752*e4061556SMario Six case CLOCK_DELAY_5_4:
753*e4061556SMario Six case CLOCK_DELAY_3_2:
754*e4061556SMario Six break;
755*e4061556SMario Six default:
756*e4061556SMario Six debug("%s: write_cmd_to_write_data value %d invalid.\n",
757*e4061556SMario Six dev->name, write_cmd_to_write_data);
758*e4061556SMario Six return -EINVAL;
759*e4061556SMario Six }
760*e4061556SMario Six
761*e4061556SMario Six minimum_cke_pulse_width =
762*e4061556SMario Six dev_read_u32_default(dev, "minimum_cke_pulse_width", 0);
763*e4061556SMario Six if (minimum_cke_pulse_width > 4 || minimum_cke_pulse_width == 0) {
764*e4061556SMario Six debug("%s: minimum_cke_pulse_width value %d invalid.\n",
765*e4061556SMario Six dev->name, minimum_cke_pulse_width);
766*e4061556SMario Six return -EINVAL;
767*e4061556SMario Six }
768*e4061556SMario Six
769*e4061556SMario Six four_activates_window =
770*e4061556SMario Six dev_read_u32_default(dev, "four_activates_window", 0);
771*e4061556SMario Six if (four_activates_window > 20 || four_activates_window == 0) {
772*e4061556SMario Six debug("%s: four_activates_window value %d invalid.\n",
773*e4061556SMario Six dev->name, four_activates_window);
774*e4061556SMario Six return -EINVAL;
775*e4061556SMario Six }
776*e4061556SMario Six
777*e4061556SMario Six timing_cfg_2 = additive_latency << TIMING_CFG2_ADD_LAT_SHIFT |
778*e4061556SMario Six mcas_to_preamble_override << TIMING_CFG2_CPO_SHIFT |
779*e4061556SMario Six write_latency << TIMING_CFG2_WR_LAT_DELAY_SHIFT |
780*e4061556SMario Six read_to_precharge << TIMING_CFG2_RD_TO_PRE_SHIFT |
781*e4061556SMario Six write_cmd_to_write_data << TIMING_CFG2_WR_DATA_DELAY_SHIFT |
782*e4061556SMario Six minimum_cke_pulse_width << TIMING_CFG2_CKE_PLS_SHIFT |
783*e4061556SMario Six four_activates_window << TIMING_CFG2_FOUR_ACT_SHIFT;
784*e4061556SMario Six
785*e4061556SMario Six out_be32(&im->ddr.timing_cfg_2, timing_cfg_2);
786*e4061556SMario Six
787*e4061556SMario Six self_refresh = dev_read_u32_default(dev, "self_refresh", 0);
788*e4061556SMario Six switch (self_refresh) {
789*e4061556SMario Six case SREN_DISABLE:
790*e4061556SMario Six case SREN_ENABLE:
791*e4061556SMario Six break;
792*e4061556SMario Six default:
793*e4061556SMario Six debug("%s: self_refresh value %d invalid.\n",
794*e4061556SMario Six dev->name, self_refresh);
795*e4061556SMario Six return -EINVAL;
796*e4061556SMario Six }
797*e4061556SMario Six
798*e4061556SMario Six ecc = dev_read_u32_default(dev, "ecc", 0);
799*e4061556SMario Six switch (ecc) {
800*e4061556SMario Six case ECC_DISABLE:
801*e4061556SMario Six case ECC_ENABLE:
802*e4061556SMario Six break;
803*e4061556SMario Six default:
804*e4061556SMario Six debug("%s: ecc value %d invalid.\n", dev->name, ecc);
805*e4061556SMario Six return -EINVAL;
806*e4061556SMario Six }
807*e4061556SMario Six
808*e4061556SMario Six registered_dram = dev_read_u32_default(dev, "registered_dram", 0);
809*e4061556SMario Six switch (registered_dram) {
810*e4061556SMario Six case RD_DISABLE:
811*e4061556SMario Six case RD_ENABLE:
812*e4061556SMario Six break;
813*e4061556SMario Six default:
814*e4061556SMario Six debug("%s: registered_dram value %d invalid.\n",
815*e4061556SMario Six dev->name, registered_dram);
816*e4061556SMario Six return -EINVAL;
817*e4061556SMario Six }
818*e4061556SMario Six
819*e4061556SMario Six sdram_type = dev_read_u32_default(dev, "sdram_type", 0);
820*e4061556SMario Six switch (sdram_type) {
821*e4061556SMario Six case TYPE_DDR1:
822*e4061556SMario Six case TYPE_DDR2:
823*e4061556SMario Six break;
824*e4061556SMario Six default:
825*e4061556SMario Six debug("%s: sdram_type value %d invalid.\n",
826*e4061556SMario Six dev->name, sdram_type);
827*e4061556SMario Six return -EINVAL;
828*e4061556SMario Six }
829*e4061556SMario Six
830*e4061556SMario Six dynamic_power_management =
831*e4061556SMario Six dev_read_u32_default(dev, "dynamic_power_management", 0);
832*e4061556SMario Six switch (dynamic_power_management) {
833*e4061556SMario Six case DYN_PWR_DISABLE:
834*e4061556SMario Six case DYN_PWR_ENABLE:
835*e4061556SMario Six break;
836*e4061556SMario Six default:
837*e4061556SMario Six debug("%s: dynamic_power_management value %d invalid.\n",
838*e4061556SMario Six dev->name, dynamic_power_management);
839*e4061556SMario Six return -EINVAL;
840*e4061556SMario Six }
841*e4061556SMario Six
842*e4061556SMario Six databus_width = dev_read_u32_default(dev, "databus_width", 0);
843*e4061556SMario Six switch (databus_width) {
844*e4061556SMario Six case DATA_BUS_WIDTH_16:
845*e4061556SMario Six case DATA_BUS_WIDTH_32:
846*e4061556SMario Six break;
847*e4061556SMario Six default:
848*e4061556SMario Six debug("%s: databus_width value %d invalid.\n",
849*e4061556SMario Six dev->name, databus_width);
850*e4061556SMario Six return -EINVAL;
851*e4061556SMario Six }
852*e4061556SMario Six
853*e4061556SMario Six nc_auto_precharge = dev_read_u32_default(dev, "nc_auto_precharge", 0);
854*e4061556SMario Six switch (nc_auto_precharge) {
855*e4061556SMario Six case NCAP_DISABLE:
856*e4061556SMario Six case NCAP_ENABLE:
857*e4061556SMario Six break;
858*e4061556SMario Six default:
859*e4061556SMario Six debug("%s: nc_auto_precharge value %d invalid.\n",
860*e4061556SMario Six dev->name, nc_auto_precharge);
861*e4061556SMario Six return -EINVAL;
862*e4061556SMario Six }
863*e4061556SMario Six
864*e4061556SMario Six timing_2t = dev_read_u32_default(dev, "timing_2t", 0);
865*e4061556SMario Six switch (timing_2t) {
866*e4061556SMario Six case TIMING_1T:
867*e4061556SMario Six case TIMING_2T:
868*e4061556SMario Six break;
869*e4061556SMario Six default:
870*e4061556SMario Six debug("%s: timing_2t value %d invalid.\n",
871*e4061556SMario Six dev->name, timing_2t);
872*e4061556SMario Six return -EINVAL;
873*e4061556SMario Six }
874*e4061556SMario Six
875*e4061556SMario Six bank_interleaving_ctrl =
876*e4061556SMario Six dev_read_u32_default(dev, "bank_interleaving_ctrl", 0);
877*e4061556SMario Six switch (bank_interleaving_ctrl) {
878*e4061556SMario Six case INTERLEAVE_NONE:
879*e4061556SMario Six case INTERLEAVE_1_AND_2:
880*e4061556SMario Six break;
881*e4061556SMario Six default:
882*e4061556SMario Six debug("%s: bank_interleaving_ctrl value %d invalid.\n",
883*e4061556SMario Six dev->name, bank_interleaving_ctrl);
884*e4061556SMario Six return -EINVAL;
885*e4061556SMario Six }
886*e4061556SMario Six
887*e4061556SMario Six precharge_bit_8 = dev_read_u32_default(dev, "precharge_bit_8", 0);
888*e4061556SMario Six switch (precharge_bit_8) {
889*e4061556SMario Six case PRECHARGE_MA_10:
890*e4061556SMario Six case PRECHARGE_MA_8:
891*e4061556SMario Six break;
892*e4061556SMario Six default:
893*e4061556SMario Six debug("%s: precharge_bit_8 value %d invalid.\n",
894*e4061556SMario Six dev->name, precharge_bit_8);
895*e4061556SMario Six return -EINVAL;
896*e4061556SMario Six }
897*e4061556SMario Six
898*e4061556SMario Six half_strength = dev_read_u32_default(dev, "half_strength", 0);
899*e4061556SMario Six switch (half_strength) {
900*e4061556SMario Six case STRENGTH_FULL:
901*e4061556SMario Six case STRENGTH_HALF:
902*e4061556SMario Six break;
903*e4061556SMario Six default:
904*e4061556SMario Six debug("%s: half_strength value %d invalid.\n",
905*e4061556SMario Six dev->name, half_strength);
906*e4061556SMario Six return -EINVAL;
907*e4061556SMario Six }
908*e4061556SMario Six
909*e4061556SMario Six bypass_initialization =
910*e4061556SMario Six dev_read_u32_default(dev, "bypass_initialization", 0);
911*e4061556SMario Six switch (bypass_initialization) {
912*e4061556SMario Six case INITIALIZATION_DONT_BYPASS:
913*e4061556SMario Six case INITIALIZATION_BYPASS:
914*e4061556SMario Six break;
915*e4061556SMario Six default:
916*e4061556SMario Six debug("%s: bypass_initialization value %d invalid.\n",
917*e4061556SMario Six dev->name, bypass_initialization);
918*e4061556SMario Six return -EINVAL;
919*e4061556SMario Six }
920*e4061556SMario Six
921*e4061556SMario Six sdram_cfg = self_refresh << SDRAM_CFG_SREN_SHIFT |
922*e4061556SMario Six ecc << SDRAM_CFG_ECC_EN_SHIFT |
923*e4061556SMario Six registered_dram << SDRAM_CFG_RD_EN_SHIFT |
924*e4061556SMario Six sdram_type << SDRAM_CFG_SDRAM_TYPE_SHIFT |
925*e4061556SMario Six dynamic_power_management << SDRAM_CFG_DYN_PWR_SHIFT |
926*e4061556SMario Six databus_width << SDRAM_CFG_DBW_SHIFT |
927*e4061556SMario Six nc_auto_precharge << SDRAM_CFG_NCAP_SHIFT |
928*e4061556SMario Six timing_2t << SDRAM_CFG_2T_EN_SHIFT |
929*e4061556SMario Six bank_interleaving_ctrl << SDRAM_CFG_BA_INTLV_CTL_SHIFT |
930*e4061556SMario Six precharge_bit_8 << SDRAM_CFG_PCHB8_SHIFT |
931*e4061556SMario Six half_strength << SDRAM_CFG_HSE_SHIFT |
932*e4061556SMario Six bypass_initialization << SDRAM_CFG_BI_SHIFT;
933*e4061556SMario Six
934*e4061556SMario Six out_be32(&im->ddr.sdram_cfg, sdram_cfg);
935*e4061556SMario Six
936*e4061556SMario Six force_self_refresh = dev_read_u32_default(dev, "force_self_refresh", 0);
937*e4061556SMario Six switch (force_self_refresh) {
938*e4061556SMario Six case MODE_NORMAL:
939*e4061556SMario Six case MODE_REFRESH:
940*e4061556SMario Six break;
941*e4061556SMario Six default:
942*e4061556SMario Six debug("%s: force_self_refresh value %d invalid.\n",
943*e4061556SMario Six dev->name, force_self_refresh);
944*e4061556SMario Six return -EINVAL;
945*e4061556SMario Six }
946*e4061556SMario Six
947*e4061556SMario Six dll_reset = dev_read_u32_default(dev, "dll_reset", 0);
948*e4061556SMario Six switch (dll_reset) {
949*e4061556SMario Six case DLL_RESET_ENABLE:
950*e4061556SMario Six case DLL_RESET_DISABLE:
951*e4061556SMario Six break;
952*e4061556SMario Six default:
953*e4061556SMario Six debug("%s: dll_reset value %d invalid.\n",
954*e4061556SMario Six dev->name, dll_reset);
955*e4061556SMario Six return -EINVAL;
956*e4061556SMario Six }
957*e4061556SMario Six
958*e4061556SMario Six dqs_config = dev_read_u32_default(dev, "dqs_config", 0);
959*e4061556SMario Six switch (dqs_config) {
960*e4061556SMario Six case DQS_TRUE:
961*e4061556SMario Six break;
962*e4061556SMario Six default:
963*e4061556SMario Six debug("%s: dqs_config value %d invalid.\n",
964*e4061556SMario Six dev->name, dqs_config);
965*e4061556SMario Six return -EINVAL;
966*e4061556SMario Six }
967*e4061556SMario Six
968*e4061556SMario Six odt_config = dev_read_u32_default(dev, "odt_config", 0);
969*e4061556SMario Six switch (odt_config) {
970*e4061556SMario Six case ODT_ASSERT_NEVER:
971*e4061556SMario Six case ODT_ASSERT_WRITES:
972*e4061556SMario Six case ODT_ASSERT_READS:
973*e4061556SMario Six case ODT_ASSERT_ALWAYS:
974*e4061556SMario Six break;
975*e4061556SMario Six default:
976*e4061556SMario Six debug("%s: odt_config value %d invalid.\n",
977*e4061556SMario Six dev->name, odt_config);
978*e4061556SMario Six return -EINVAL;
979*e4061556SMario Six }
980*e4061556SMario Six
981*e4061556SMario Six posted_refreshes = dev_read_u32_default(dev, "posted_refreshes", 0);
982*e4061556SMario Six if (posted_refreshes > 8 || posted_refreshes == 0) {
983*e4061556SMario Six debug("%s: posted_refreshes value %d invalid.\n",
984*e4061556SMario Six dev->name, posted_refreshes);
985*e4061556SMario Six return -EINVAL;
986*e4061556SMario Six }
987*e4061556SMario Six
988*e4061556SMario Six sdram_cfg2 = force_self_refresh << SDRAM_CFG2_FRC_SR_SHIFT |
989*e4061556SMario Six dll_reset << SDRAM_CFG2_DLL_RST_DIS |
990*e4061556SMario Six dqs_config << SDRAM_CFG2_DQS_CFG |
991*e4061556SMario Six odt_config << SDRAM_CFG2_ODT_CFG |
992*e4061556SMario Six posted_refreshes << SDRAM_CFG2_NUM_PR;
993*e4061556SMario Six
994*e4061556SMario Six out_be32(&im->ddr.sdram_cfg2, sdram_cfg2);
995*e4061556SMario Six
996*e4061556SMario Six sdmode = dev_read_u32_default(dev, "sdmode", 0);
997*e4061556SMario Six if (sdmode > 0xFFFF) {
998*e4061556SMario Six debug("%s: sdmode value %d invalid.\n",
999*e4061556SMario Six dev->name, sdmode);
1000*e4061556SMario Six return -EINVAL;
1001*e4061556SMario Six }
1002*e4061556SMario Six
1003*e4061556SMario Six esdmode = dev_read_u32_default(dev, "esdmode", 0);
1004*e4061556SMario Six if (esdmode > 0xFFFF) {
1005*e4061556SMario Six debug("%s: esdmode value %d invalid.\n", dev->name, esdmode);
1006*e4061556SMario Six return -EINVAL;
1007*e4061556SMario Six }
1008*e4061556SMario Six
1009*e4061556SMario Six sdram_mode = sdmode << SDRAM_MODE_SD_SHIFT |
1010*e4061556SMario Six esdmode << SDRAM_MODE_ESD_SHIFT;
1011*e4061556SMario Six
1012*e4061556SMario Six out_be32(&im->ddr.sdram_mode, sdram_mode);
1013*e4061556SMario Six
1014*e4061556SMario Six esdmode2 = dev_read_u32_default(dev, "esdmode2", 0);
1015*e4061556SMario Six if (esdmode2 > 0xFFFF) {
1016*e4061556SMario Six debug("%s: esdmode2 value %d invalid.\n", dev->name, esdmode2);
1017*e4061556SMario Six return -EINVAL;
1018*e4061556SMario Six }
1019*e4061556SMario Six
1020*e4061556SMario Six esdmode3 = dev_read_u32_default(dev, "esdmode3", 0);
1021*e4061556SMario Six if (esdmode3 > 0xFFFF) {
1022*e4061556SMario Six debug("%s: esdmode3 value %d invalid.\n", dev->name, esdmode3);
1023*e4061556SMario Six return -EINVAL;
1024*e4061556SMario Six }
1025*e4061556SMario Six
1026*e4061556SMario Six sdram_mode2 = esdmode2 << SDRAM_MODE2_ESD2_SHIFT |
1027*e4061556SMario Six esdmode3 << SDRAM_MODE2_ESD3_SHIFT;
1028*e4061556SMario Six
1029*e4061556SMario Six out_be32(&im->ddr.sdram_mode2, sdram_mode2);
1030*e4061556SMario Six
1031*e4061556SMario Six refresh_interval = dev_read_u32_default(dev, "refresh_interval", 0);
1032*e4061556SMario Six if (refresh_interval > 0xFFFF) {
1033*e4061556SMario Six debug("%s: refresh_interval value %d invalid.\n",
1034*e4061556SMario Six dev->name, refresh_interval);
1035*e4061556SMario Six return -EINVAL;
1036*e4061556SMario Six }
1037*e4061556SMario Six
1038*e4061556SMario Six precharge_interval = dev_read_u32_default(dev, "precharge_interval", 0);
1039*e4061556SMario Six if (precharge_interval > 0x3FFF) {
1040*e4061556SMario Six debug("%s: precharge_interval value %d invalid.\n",
1041*e4061556SMario Six dev->name, precharge_interval);
1042*e4061556SMario Six return -EINVAL;
1043*e4061556SMario Six }
1044*e4061556SMario Six
1045*e4061556SMario Six sdram_interval = refresh_interval << SDRAM_INTERVAL_REFINT_SHIFT |
1046*e4061556SMario Six precharge_interval << SDRAM_INTERVAL_BSTOPRE_SHIFT;
1047*e4061556SMario Six
1048*e4061556SMario Six out_be32(&im->ddr.sdram_interval, sdram_interval);
1049*e4061556SMario Six sync();
1050*e4061556SMario Six
1051*e4061556SMario Six /* Enable DDR controller */
1052*e4061556SMario Six setbits_be32(&im->ddr.sdram_cfg, SDRAM_CFG_MEM_EN);
1053*e4061556SMario Six sync();
1054*e4061556SMario Six
1055*e4061556SMario Six dev_for_each_subnode(subnode, dev) {
1056*e4061556SMario Six u32 val[3];
1057*e4061556SMario Six u32 addr, size;
1058*e4061556SMario Six
1059*e4061556SMario Six /* CS, map address, size -> three values */
1060*e4061556SMario Six ofnode_read_u32_array(subnode, "reg", val, 3);
1061*e4061556SMario Six
1062*e4061556SMario Six addr = val[1];
1063*e4061556SMario Six size = val[2];
1064*e4061556SMario Six
1065*e4061556SMario Six priv->total_size += get_ram_size((long int *)addr, size);
1066*e4061556SMario Six };
1067*e4061556SMario Six
1068*e4061556SMario Six gd->ram_size = priv->total_size;
1069*e4061556SMario Six
1070*e4061556SMario Six return 0;
1071*e4061556SMario Six }
1072*e4061556SMario Six
mpc83xx_sdram_get_info(struct udevice * dev,struct ram_info * info)1073*e4061556SMario Six static int mpc83xx_sdram_get_info(struct udevice *dev, struct ram_info *info)
1074*e4061556SMario Six {
1075*e4061556SMario Six /* TODO(mario.six@gdsys.cc): Implement */
1076*e4061556SMario Six return 0;
1077*e4061556SMario Six }
1078*e4061556SMario Six
1079*e4061556SMario Six static struct ram_ops mpc83xx_sdram_ops = {
1080*e4061556SMario Six .get_info = mpc83xx_sdram_get_info,
1081*e4061556SMario Six };
1082*e4061556SMario Six
1083*e4061556SMario Six static const struct udevice_id mpc83xx_sdram_ids[] = {
1084*e4061556SMario Six { .compatible = "fsl,mpc83xx-mem-controller" },
1085*e4061556SMario Six { /* sentinel */ }
1086*e4061556SMario Six };
1087*e4061556SMario Six
1088*e4061556SMario Six U_BOOT_DRIVER(mpc83xx_sdram) = {
1089*e4061556SMario Six .name = "mpc83xx_sdram",
1090*e4061556SMario Six .id = UCLASS_RAM,
1091*e4061556SMario Six .of_match = mpc83xx_sdram_ids,
1092*e4061556SMario Six .ops = &mpc83xx_sdram_ops,
1093*e4061556SMario Six .ofdata_to_platdata = mpc83xx_sdram_ofdata_to_platdata,
1094*e4061556SMario Six .probe = mpc83xx_sdram_probe,
1095*e4061556SMario Six .priv_auto_alloc_size = sizeof(struct mpc83xx_sdram_priv),
1096*e4061556SMario Six };
1097