xref: /openbmc/u-boot/drivers/ddr/fsl/interactive.c (revision 4a34e4b8)
1 /*
2  * Copyright 2010-2014 Freescale Semiconductor, Inc.
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 /*
8  * Generic driver for Freescale DDR/DDR2/DDR3 memory controller.
9  * Based on code from spd_sdram.c
10  * Author: James Yang [at freescale.com]
11  *         York Sun [at freescale.com]
12  */
13 
14 #include <common.h>
15 #include <cli.h>
16 #include <linux/ctype.h>
17 #include <asm/types.h>
18 #include <asm/io.h>
19 
20 #include <fsl_ddr_sdram.h>
21 #include <fsl_ddr.h>
22 
23 /* Option parameter Structures */
24 struct options_string {
25 	const char *option_name;
26 	size_t offset;
27 	unsigned int size;
28 	const char printhex;
29 };
30 
31 static unsigned int picos_to_mhz(unsigned int picos)
32 {
33 	return 1000000 / picos;
34 }
35 
36 static void print_option_table(const struct options_string *table,
37 			 int table_size,
38 			 const void *base)
39 {
40 	unsigned int i;
41 	unsigned int *ptr;
42 	unsigned long long *ptr_l;
43 
44 	for (i = 0; i < table_size; i++) {
45 		switch (table[i].size) {
46 		case 4:
47 			ptr = (unsigned int *) (base + table[i].offset);
48 			if (table[i].printhex) {
49 				printf("%s = 0x%08X\n",
50 					table[i].option_name, *ptr);
51 			} else {
52 				printf("%s = %u\n",
53 					table[i].option_name, *ptr);
54 			}
55 			break;
56 		case 8:
57 			ptr_l = (unsigned long long *) (base + table[i].offset);
58 			printf("%s = %llu\n",
59 				table[i].option_name, *ptr_l);
60 			break;
61 		default:
62 			printf("Unrecognized size!\n");
63 			break;
64 		}
65 	}
66 }
67 
68 static int handle_option_table(const struct options_string *table,
69 			 int table_size,
70 			 void *base,
71 			 const char *opt,
72 			 const char *val)
73 {
74 	unsigned int i;
75 	unsigned int value, *ptr;
76 	unsigned long long value_l, *ptr_l;
77 
78 	for (i = 0; i < table_size; i++) {
79 		if (strcmp(table[i].option_name, opt) != 0)
80 			continue;
81 		switch (table[i].size) {
82 		case 4:
83 			value = simple_strtoul(val, NULL, 0);
84 			ptr = base + table[i].offset;
85 			*ptr = value;
86 			break;
87 		case 8:
88 			value_l = simple_strtoull(val, NULL, 0);
89 			ptr_l = base + table[i].offset;
90 			*ptr_l = value_l;
91 			break;
92 		default:
93 			printf("Unrecognized size!\n");
94 			break;
95 		}
96 		return 1;
97 	}
98 
99 	return 0;
100 }
101 
102 static void fsl_ddr_generic_edit(void *pdata,
103 			   void *pend,
104 			   unsigned int element_size,
105 			   unsigned int element_num,
106 			   unsigned int value)
107 {
108 	char *pcdata = (char *)pdata;		/* BIG ENDIAN ONLY */
109 
110 	pcdata += element_num * element_size;
111 	if ((pcdata + element_size) > (char *) pend) {
112 		printf("trying to write past end of data\n");
113 		return;
114 	}
115 
116 	switch (element_size) {
117 	case 1:
118 		__raw_writeb(value, pcdata);
119 		break;
120 	case 2:
121 		__raw_writew(value, pcdata);
122 		break;
123 	case 4:
124 		__raw_writel(value, pcdata);
125 		break;
126 	default:
127 		printf("unexpected element size %u\n", element_size);
128 		break;
129 	}
130 }
131 
132 static void fsl_ddr_spd_edit(fsl_ddr_info_t *pinfo,
133 		       unsigned int ctrl_num,
134 		       unsigned int dimm_num,
135 		       unsigned int element_num,
136 		       unsigned int value)
137 {
138 	generic_spd_eeprom_t *pspd;
139 
140 	pspd = &(pinfo->spd_installed_dimms[ctrl_num][dimm_num]);
141 	fsl_ddr_generic_edit(pspd, pspd + 1, 1, element_num, value);
142 }
143 
144 #define COMMON_TIMING(x) {#x, offsetof(common_timing_params_t, x), \
145 	sizeof((common_timing_params_t *)0)->x, 0}
146 
147 static void lowest_common_dimm_parameters_edit(fsl_ddr_info_t *pinfo,
148 					unsigned int ctrl_num,
149 					const char *optname_str,
150 					const char *value_str)
151 {
152 	common_timing_params_t *p = &pinfo->common_timing_params[ctrl_num];
153 
154 	static const struct options_string options[] = {
155 		COMMON_TIMING(tckmin_x_ps),
156 		COMMON_TIMING(tckmax_ps),
157 		COMMON_TIMING(taamin_ps),
158 		COMMON_TIMING(trcd_ps),
159 		COMMON_TIMING(trp_ps),
160 		COMMON_TIMING(tras_ps),
161 
162 #ifdef CONFIG_SYS_FSL_DDR4
163 		COMMON_TIMING(trfc1_ps),
164 		COMMON_TIMING(trfc2_ps),
165 		COMMON_TIMING(trfc4_ps),
166 		COMMON_TIMING(trrds_ps),
167 		COMMON_TIMING(trrdl_ps),
168 		COMMON_TIMING(tccdl_ps),
169 #else
170 		COMMON_TIMING(twtr_ps),
171 		COMMON_TIMING(trfc_ps),
172 		COMMON_TIMING(trrd_ps),
173 		COMMON_TIMING(trtp_ps),
174 #endif
175 		COMMON_TIMING(twr_ps),
176 		COMMON_TIMING(trc_ps),
177 		COMMON_TIMING(refresh_rate_ps),
178 		COMMON_TIMING(extended_op_srt),
179 #if defined(CONFIG_SYS_FSL_DDR1) || defined(CONFIG_SYS_FSL_DDR2)
180 		COMMON_TIMING(tis_ps),
181 		COMMON_TIMING(tih_ps),
182 		COMMON_TIMING(tds_ps),
183 		COMMON_TIMING(tdh_ps),
184 		COMMON_TIMING(tdqsq_max_ps),
185 		COMMON_TIMING(tqhs_ps),
186 #endif
187 		COMMON_TIMING(ndimms_present),
188 		COMMON_TIMING(lowest_common_spd_caslat),
189 		COMMON_TIMING(highest_common_derated_caslat),
190 		COMMON_TIMING(additive_latency),
191 		COMMON_TIMING(all_dimms_burst_lengths_bitmask),
192 		COMMON_TIMING(all_dimms_registered),
193 		COMMON_TIMING(all_dimms_unbuffered),
194 		COMMON_TIMING(all_dimms_ecc_capable),
195 		COMMON_TIMING(total_mem),
196 		COMMON_TIMING(base_address),
197 	};
198 	static const unsigned int n_opts = ARRAY_SIZE(options);
199 
200 	if (handle_option_table(options, n_opts, p, optname_str, value_str))
201 		return;
202 
203 	printf("Error: couldn't find option string %s\n", optname_str);
204 }
205 
206 #define DIMM_PARM(x) {#x, offsetof(dimm_params_t, x), \
207 	sizeof((dimm_params_t *)0)->x, 0}
208 #define DIMM_PARM_HEX(x) {#x, offsetof(dimm_params_t, x), \
209 	sizeof((dimm_params_t *)0)->x, 1}
210 
211 static void fsl_ddr_dimm_parameters_edit(fsl_ddr_info_t *pinfo,
212 				   unsigned int ctrl_num,
213 				   unsigned int dimm_num,
214 				   const char *optname_str,
215 				   const char *value_str)
216 {
217 	dimm_params_t *p = &(pinfo->dimm_params[ctrl_num][dimm_num]);
218 
219 	static const struct options_string options[] = {
220 		DIMM_PARM(n_ranks),
221 		DIMM_PARM(data_width),
222 		DIMM_PARM(primary_sdram_width),
223 		DIMM_PARM(ec_sdram_width),
224 		DIMM_PARM(registered_dimm),
225 		DIMM_PARM(mirrored_dimm),
226 		DIMM_PARM(device_width),
227 
228 		DIMM_PARM(n_row_addr),
229 		DIMM_PARM(n_col_addr),
230 		DIMM_PARM(edc_config),
231 #ifdef CONFIG_SYS_FSL_DDR4
232 		DIMM_PARM(bank_addr_bits),
233 		DIMM_PARM(bank_group_bits),
234 #else
235 		DIMM_PARM(n_banks_per_sdram_device),
236 #endif
237 		DIMM_PARM(burst_lengths_bitmask),
238 		DIMM_PARM(row_density),
239 
240 		DIMM_PARM(tckmin_x_ps),
241 		DIMM_PARM(tckmin_x_minus_1_ps),
242 		DIMM_PARM(tckmin_x_minus_2_ps),
243 		DIMM_PARM(tckmax_ps),
244 
245 		DIMM_PARM(caslat_x),
246 		DIMM_PARM(caslat_x_minus_1),
247 		DIMM_PARM(caslat_x_minus_2),
248 
249 		DIMM_PARM(caslat_lowest_derated),
250 
251 		DIMM_PARM(trcd_ps),
252 		DIMM_PARM(trp_ps),
253 		DIMM_PARM(tras_ps),
254 #ifdef CONFIG_SYS_FSL_DDR4
255 		DIMM_PARM(trfc1_ps),
256 		DIMM_PARM(trfc2_ps),
257 		DIMM_PARM(trfc4_ps),
258 		DIMM_PARM(trrds_ps),
259 		DIMM_PARM(trrdl_ps),
260 		DIMM_PARM(tccdl_ps),
261 #else
262 		DIMM_PARM(twr_ps),
263 		DIMM_PARM(twtr_ps),
264 		DIMM_PARM(trfc_ps),
265 		DIMM_PARM(trrd_ps),
266 		DIMM_PARM(trtp_ps),
267 #endif
268 		DIMM_PARM(trc_ps),
269 		DIMM_PARM(refresh_rate_ps),
270 		DIMM_PARM(extended_op_srt),
271 
272 #if defined(CONFIG_SYS_FSL_DDR1) || defined(CONFIG_SYS_FSL_DDR2)
273 		DIMM_PARM(tis_ps),
274 		DIMM_PARM(tih_ps),
275 		DIMM_PARM(tds_ps),
276 		DIMM_PARM(tdh_ps),
277 		DIMM_PARM(tdqsq_max_ps),
278 		DIMM_PARM(tqhs_ps),
279 #endif
280 #ifdef CONFIG_SYS_FSL_DDR4
281 		DIMM_PARM_HEX(dq_mapping[0]),
282 		DIMM_PARM_HEX(dq_mapping[1]),
283 		DIMM_PARM_HEX(dq_mapping[2]),
284 		DIMM_PARM_HEX(dq_mapping[3]),
285 		DIMM_PARM_HEX(dq_mapping[4]),
286 		DIMM_PARM_HEX(dq_mapping[5]),
287 		DIMM_PARM_HEX(dq_mapping[6]),
288 		DIMM_PARM_HEX(dq_mapping[7]),
289 		DIMM_PARM_HEX(dq_mapping[8]),
290 		DIMM_PARM_HEX(dq_mapping[9]),
291 		DIMM_PARM_HEX(dq_mapping[10]),
292 		DIMM_PARM_HEX(dq_mapping[11]),
293 		DIMM_PARM_HEX(dq_mapping[12]),
294 		DIMM_PARM_HEX(dq_mapping[13]),
295 		DIMM_PARM_HEX(dq_mapping[14]),
296 		DIMM_PARM_HEX(dq_mapping[15]),
297 		DIMM_PARM_HEX(dq_mapping[16]),
298 		DIMM_PARM_HEX(dq_mapping[17]),
299 		DIMM_PARM(dq_mapping_ors),
300 #endif
301 		DIMM_PARM(rank_density),
302 		DIMM_PARM(capacity),
303 		DIMM_PARM(base_address),
304 	};
305 
306 	static const unsigned int n_opts = ARRAY_SIZE(options);
307 
308 	if (handle_option_table(options, n_opts, p, optname_str, value_str))
309 		return;
310 
311 	printf("couldn't find option string %s\n", optname_str);
312 }
313 
314 static void print_dimm_parameters(const dimm_params_t *pdimm)
315 {
316 	static const struct options_string options[] = {
317 		DIMM_PARM(n_ranks),
318 		DIMM_PARM(data_width),
319 		DIMM_PARM(primary_sdram_width),
320 		DIMM_PARM(ec_sdram_width),
321 		DIMM_PARM(registered_dimm),
322 		DIMM_PARM(mirrored_dimm),
323 		DIMM_PARM(device_width),
324 
325 		DIMM_PARM(n_row_addr),
326 		DIMM_PARM(n_col_addr),
327 		DIMM_PARM(edc_config),
328 #ifdef CONFIG_SYS_FSL_DDR4
329 		DIMM_PARM(bank_addr_bits),
330 		DIMM_PARM(bank_group_bits),
331 #else
332 		DIMM_PARM(n_banks_per_sdram_device),
333 #endif
334 
335 		DIMM_PARM(tckmin_x_ps),
336 		DIMM_PARM(tckmin_x_minus_1_ps),
337 		DIMM_PARM(tckmin_x_minus_2_ps),
338 		DIMM_PARM(tckmax_ps),
339 
340 		DIMM_PARM(caslat_x),
341 		DIMM_PARM_HEX(caslat_x),
342 		DIMM_PARM(taa_ps),
343 		DIMM_PARM(caslat_x_minus_1),
344 		DIMM_PARM(caslat_x_minus_2),
345 		DIMM_PARM(caslat_lowest_derated),
346 
347 		DIMM_PARM(trcd_ps),
348 		DIMM_PARM(trp_ps),
349 		DIMM_PARM(tras_ps),
350 #if defined(CONFIG_SYS_FSL_DDR4) || defined(CONFIG_SYS_FSL_DDR3)
351 		DIMM_PARM(tfaw_ps),
352 #endif
353 #ifdef CONFIG_SYS_FSL_DDR4
354 		DIMM_PARM(trfc1_ps),
355 		DIMM_PARM(trfc2_ps),
356 		DIMM_PARM(trfc4_ps),
357 		DIMM_PARM(trrds_ps),
358 		DIMM_PARM(trrdl_ps),
359 		DIMM_PARM(tccdl_ps),
360 #else
361 		DIMM_PARM(twr_ps),
362 		DIMM_PARM(twtr_ps),
363 		DIMM_PARM(trfc_ps),
364 		DIMM_PARM(trrd_ps),
365 		DIMM_PARM(trtp_ps),
366 #endif
367 		DIMM_PARM(trc_ps),
368 		DIMM_PARM(refresh_rate_ps),
369 
370 #if defined(CONFIG_SYS_FSL_DDR1) || defined(CONFIG_SYS_FSL_DDR2)
371 		DIMM_PARM(tis_ps),
372 		DIMM_PARM(tih_ps),
373 		DIMM_PARM(tds_ps),
374 		DIMM_PARM(tdh_ps),
375 		DIMM_PARM(tdqsq_max_ps),
376 		DIMM_PARM(tqhs_ps),
377 #endif
378 #ifdef CONFIG_SYS_FSL_DDR4
379 		DIMM_PARM_HEX(dq_mapping[0]),
380 		DIMM_PARM_HEX(dq_mapping[1]),
381 		DIMM_PARM_HEX(dq_mapping[2]),
382 		DIMM_PARM_HEX(dq_mapping[3]),
383 		DIMM_PARM_HEX(dq_mapping[4]),
384 		DIMM_PARM_HEX(dq_mapping[5]),
385 		DIMM_PARM_HEX(dq_mapping[6]),
386 		DIMM_PARM_HEX(dq_mapping[7]),
387 		DIMM_PARM_HEX(dq_mapping[8]),
388 		DIMM_PARM_HEX(dq_mapping[9]),
389 		DIMM_PARM_HEX(dq_mapping[10]),
390 		DIMM_PARM_HEX(dq_mapping[11]),
391 		DIMM_PARM_HEX(dq_mapping[12]),
392 		DIMM_PARM_HEX(dq_mapping[13]),
393 		DIMM_PARM_HEX(dq_mapping[14]),
394 		DIMM_PARM_HEX(dq_mapping[15]),
395 		DIMM_PARM_HEX(dq_mapping[16]),
396 		DIMM_PARM_HEX(dq_mapping[17]),
397 		DIMM_PARM(dq_mapping_ors),
398 #endif
399 	};
400 	static const unsigned int n_opts = ARRAY_SIZE(options);
401 
402 	if (pdimm->n_ranks == 0) {
403 		printf("DIMM not present\n");
404 		return;
405 	}
406 	printf("DIMM organization parameters:\n");
407 	printf("module part name = %s\n", pdimm->mpart);
408 	printf("rank_density = %llu bytes (%llu megabytes)\n",
409 	       pdimm->rank_density, pdimm->rank_density / 0x100000);
410 	printf("capacity = %llu bytes (%llu megabytes)\n",
411 	       pdimm->capacity, pdimm->capacity / 0x100000);
412 	printf("burst_lengths_bitmask = %02X\n",
413 	       pdimm->burst_lengths_bitmask);
414 	printf("base_addresss = %llu (%08llX %08llX)\n",
415 	       pdimm->base_address,
416 	       (pdimm->base_address >> 32),
417 	       pdimm->base_address & 0xFFFFFFFF);
418 	print_option_table(options, n_opts, pdimm);
419 }
420 
421 static void print_lowest_common_dimm_parameters(
422 		const common_timing_params_t *plcd_dimm_params)
423 {
424 	static const struct options_string options[] = {
425 		COMMON_TIMING(taamin_ps),
426 		COMMON_TIMING(trcd_ps),
427 		COMMON_TIMING(trp_ps),
428 		COMMON_TIMING(tras_ps),
429 #ifdef CONFIG_SYS_FSL_DDR4
430 		COMMON_TIMING(trfc1_ps),
431 		COMMON_TIMING(trfc2_ps),
432 		COMMON_TIMING(trfc4_ps),
433 		COMMON_TIMING(trrds_ps),
434 		COMMON_TIMING(trrdl_ps),
435 		COMMON_TIMING(tccdl_ps),
436 #else
437 		COMMON_TIMING(twtr_ps),
438 		COMMON_TIMING(trfc_ps),
439 		COMMON_TIMING(trrd_ps),
440 		COMMON_TIMING(trtp_ps),
441 #endif
442 		COMMON_TIMING(twr_ps),
443 		COMMON_TIMING(trc_ps),
444 		COMMON_TIMING(refresh_rate_ps),
445 		COMMON_TIMING(extended_op_srt),
446 #if defined(CONFIG_SYS_FSL_DDR1) || defined(CONFIG_SYS_FSL_DDR2)
447 		COMMON_TIMING(tis_ps),
448 		COMMON_TIMING(tih_ps),
449 		COMMON_TIMING(tds_ps),
450 		COMMON_TIMING(tdh_ps),
451 		COMMON_TIMING(tdqsq_max_ps),
452 		COMMON_TIMING(tqhs_ps),
453 #endif
454 		COMMON_TIMING(lowest_common_spd_caslat),
455 		COMMON_TIMING(highest_common_derated_caslat),
456 		COMMON_TIMING(additive_latency),
457 		COMMON_TIMING(ndimms_present),
458 		COMMON_TIMING(all_dimms_registered),
459 		COMMON_TIMING(all_dimms_unbuffered),
460 		COMMON_TIMING(all_dimms_ecc_capable),
461 	};
462 	static const unsigned int n_opts = ARRAY_SIZE(options);
463 
464 	/* Clock frequencies */
465 	printf("tckmin_x_ps = %u (%u MHz)\n",
466 	       plcd_dimm_params->tckmin_x_ps,
467 	       picos_to_mhz(plcd_dimm_params->tckmin_x_ps));
468 	printf("tckmax_ps = %u (%u MHz)\n",
469 	       plcd_dimm_params->tckmax_ps,
470 	       picos_to_mhz(plcd_dimm_params->tckmax_ps));
471 	printf("all_dimms_burst_lengths_bitmask = %02X\n",
472 	       plcd_dimm_params->all_dimms_burst_lengths_bitmask);
473 
474 	print_option_table(options, n_opts, plcd_dimm_params);
475 
476 	printf("total_mem = %llu (%llu megabytes)\n",
477 	       plcd_dimm_params->total_mem,
478 	       plcd_dimm_params->total_mem / 0x100000);
479 	printf("base_address = %llu (%llu megabytes)\n",
480 	       plcd_dimm_params->base_address,
481 	       plcd_dimm_params->base_address / 0x100000);
482 }
483 
484 #define CTRL_OPTIONS(x) {#x, offsetof(memctl_options_t, x), \
485 	sizeof((memctl_options_t *)0)->x, 0}
486 #define CTRL_OPTIONS_CS(x, y) {"cs" #x "_" #y, \
487 	offsetof(memctl_options_t, cs_local_opts[x].y), \
488 	sizeof((memctl_options_t *)0)->cs_local_opts[x].y, 0}
489 
490 static void fsl_ddr_options_edit(fsl_ddr_info_t *pinfo,
491 			   unsigned int ctl_num,
492 			   const char *optname_str,
493 			   const char *value_str)
494 {
495 	memctl_options_t *p = &(pinfo->memctl_opts[ctl_num]);
496 	/*
497 	 * This array all on the stack and *computed* each time this
498 	 * function is rung.
499 	 */
500 	static const struct options_string options[] = {
501 		CTRL_OPTIONS_CS(0, odt_rd_cfg),
502 		CTRL_OPTIONS_CS(0, odt_wr_cfg),
503 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
504 		CTRL_OPTIONS_CS(1, odt_rd_cfg),
505 		CTRL_OPTIONS_CS(1, odt_wr_cfg),
506 #endif
507 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
508 		CTRL_OPTIONS_CS(2, odt_rd_cfg),
509 		CTRL_OPTIONS_CS(2, odt_wr_cfg),
510 #endif
511 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
512 		CTRL_OPTIONS_CS(3, odt_rd_cfg),
513 		CTRL_OPTIONS_CS(3, odt_wr_cfg),
514 #endif
515 #if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
516 		CTRL_OPTIONS_CS(0, odt_rtt_norm),
517 		CTRL_OPTIONS_CS(0, odt_rtt_wr),
518 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
519 		CTRL_OPTIONS_CS(1, odt_rtt_norm),
520 		CTRL_OPTIONS_CS(1, odt_rtt_wr),
521 #endif
522 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
523 		CTRL_OPTIONS_CS(2, odt_rtt_norm),
524 		CTRL_OPTIONS_CS(2, odt_rtt_wr),
525 #endif
526 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
527 		CTRL_OPTIONS_CS(3, odt_rtt_norm),
528 		CTRL_OPTIONS_CS(3, odt_rtt_wr),
529 #endif
530 #endif
531 		CTRL_OPTIONS(memctl_interleaving),
532 		CTRL_OPTIONS(memctl_interleaving_mode),
533 		CTRL_OPTIONS(ba_intlv_ctl),
534 		CTRL_OPTIONS(ecc_mode),
535 		CTRL_OPTIONS(ecc_init_using_memctl),
536 		CTRL_OPTIONS(dqs_config),
537 		CTRL_OPTIONS(self_refresh_in_sleep),
538 		CTRL_OPTIONS(dynamic_power),
539 		CTRL_OPTIONS(data_bus_width),
540 		CTRL_OPTIONS(burst_length),
541 		CTRL_OPTIONS(cas_latency_override),
542 		CTRL_OPTIONS(cas_latency_override_value),
543 		CTRL_OPTIONS(use_derated_caslat),
544 		CTRL_OPTIONS(additive_latency_override),
545 		CTRL_OPTIONS(additive_latency_override_value),
546 		CTRL_OPTIONS(clk_adjust),
547 		CTRL_OPTIONS(cpo_override),
548 		CTRL_OPTIONS(write_data_delay),
549 		CTRL_OPTIONS(half_strength_driver_enable),
550 
551 		/*
552 		 * These can probably be changed to 2T_EN and 3T_EN
553 		 * (using a leading numerical character) without problem
554 		 */
555 		CTRL_OPTIONS(twot_en),
556 		CTRL_OPTIONS(threet_en),
557 		CTRL_OPTIONS(ap_en),
558 		CTRL_OPTIONS(x4_en),
559 		CTRL_OPTIONS(bstopre),
560 		CTRL_OPTIONS(wrlvl_override),
561 		CTRL_OPTIONS(wrlvl_sample),
562 		CTRL_OPTIONS(wrlvl_start),
563 		CTRL_OPTIONS(cswl_override),
564 		CTRL_OPTIONS(rcw_override),
565 		CTRL_OPTIONS(rcw_1),
566 		CTRL_OPTIONS(rcw_2),
567 		CTRL_OPTIONS(ddr_cdr1),
568 		CTRL_OPTIONS(ddr_cdr2),
569 		CTRL_OPTIONS(tfaw_window_four_activates_ps),
570 		CTRL_OPTIONS(trwt_override),
571 		CTRL_OPTIONS(trwt),
572 		CTRL_OPTIONS(rtt_override),
573 		CTRL_OPTIONS(rtt_override_value),
574 		CTRL_OPTIONS(rtt_wr_override_value),
575 	};
576 
577 	static const unsigned int n_opts = ARRAY_SIZE(options);
578 
579 	if (handle_option_table(options, n_opts, p,
580 					optname_str, value_str))
581 		return;
582 
583 	printf("couldn't find option string %s\n", optname_str);
584 }
585 
586 #define CFG_REGS(x) {#x, offsetof(fsl_ddr_cfg_regs_t, x), \
587 	sizeof((fsl_ddr_cfg_regs_t *)0)->x, 1}
588 #define CFG_REGS_CS(x, y) {"cs" #x "_" #y, \
589 	offsetof(fsl_ddr_cfg_regs_t, cs[x].y), \
590 	sizeof((fsl_ddr_cfg_regs_t *)0)->cs[x].y, 1}
591 
592 static void print_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr)
593 {
594 	unsigned int i;
595 	static const struct options_string options[] = {
596 		CFG_REGS_CS(0, bnds),
597 		CFG_REGS_CS(0, config),
598 		CFG_REGS_CS(0, config_2),
599 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
600 		CFG_REGS_CS(1, bnds),
601 		CFG_REGS_CS(1, config),
602 		CFG_REGS_CS(1, config_2),
603 #endif
604 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
605 		CFG_REGS_CS(2, bnds),
606 		CFG_REGS_CS(2, config),
607 		CFG_REGS_CS(2, config_2),
608 #endif
609 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
610 		CFG_REGS_CS(3, bnds),
611 		CFG_REGS_CS(3, config),
612 		CFG_REGS_CS(3, config_2),
613 #endif
614 		CFG_REGS(timing_cfg_3),
615 		CFG_REGS(timing_cfg_0),
616 		CFG_REGS(timing_cfg_1),
617 		CFG_REGS(timing_cfg_2),
618 		CFG_REGS(ddr_sdram_cfg),
619 		CFG_REGS(ddr_sdram_cfg_2),
620 		CFG_REGS(ddr_sdram_cfg_3),
621 		CFG_REGS(ddr_sdram_mode),
622 		CFG_REGS(ddr_sdram_mode_2),
623 		CFG_REGS(ddr_sdram_mode_3),
624 		CFG_REGS(ddr_sdram_mode_4),
625 		CFG_REGS(ddr_sdram_mode_5),
626 		CFG_REGS(ddr_sdram_mode_6),
627 		CFG_REGS(ddr_sdram_mode_7),
628 		CFG_REGS(ddr_sdram_mode_8),
629 #ifdef CONFIG_SYS_FSL_DDR4
630 		CFG_REGS(ddr_sdram_mode_9),
631 		CFG_REGS(ddr_sdram_mode_10),
632 		CFG_REGS(ddr_sdram_mode_11),
633 		CFG_REGS(ddr_sdram_mode_12),
634 		CFG_REGS(ddr_sdram_mode_13),
635 		CFG_REGS(ddr_sdram_mode_14),
636 		CFG_REGS(ddr_sdram_mode_15),
637 		CFG_REGS(ddr_sdram_mode_16),
638 #endif
639 		CFG_REGS(ddr_sdram_interval),
640 		CFG_REGS(ddr_data_init),
641 		CFG_REGS(ddr_sdram_clk_cntl),
642 		CFG_REGS(ddr_init_addr),
643 		CFG_REGS(ddr_init_ext_addr),
644 		CFG_REGS(timing_cfg_4),
645 		CFG_REGS(timing_cfg_5),
646 #ifdef CONFIG_SYS_FSL_DDR4
647 		CFG_REGS(timing_cfg_6),
648 		CFG_REGS(timing_cfg_7),
649 		CFG_REGS(timing_cfg_8),
650 		CFG_REGS(timing_cfg_9),
651 #endif
652 		CFG_REGS(ddr_zq_cntl),
653 		CFG_REGS(ddr_wrlvl_cntl),
654 		CFG_REGS(ddr_wrlvl_cntl_2),
655 		CFG_REGS(ddr_wrlvl_cntl_3),
656 		CFG_REGS(ddr_sr_cntr),
657 		CFG_REGS(ddr_sdram_rcw_1),
658 		CFG_REGS(ddr_sdram_rcw_2),
659 		CFG_REGS(ddr_cdr1),
660 		CFG_REGS(ddr_cdr2),
661 		CFG_REGS(dq_map_0),
662 		CFG_REGS(dq_map_1),
663 		CFG_REGS(dq_map_2),
664 		CFG_REGS(dq_map_3),
665 		CFG_REGS(err_disable),
666 		CFG_REGS(err_int_en),
667 		CFG_REGS(ddr_eor),
668 	};
669 	static const unsigned int n_opts = ARRAY_SIZE(options);
670 
671 	print_option_table(options, n_opts, ddr);
672 
673 	for (i = 0; i < 32; i++)
674 		printf("debug_%02d = 0x%08X\n", i+1, ddr->debug[i]);
675 }
676 
677 static void fsl_ddr_regs_edit(fsl_ddr_info_t *pinfo,
678 			unsigned int ctrl_num,
679 			const char *regname,
680 			const char *value_str)
681 {
682 	unsigned int i;
683 	fsl_ddr_cfg_regs_t *ddr;
684 	char buf[20];
685 	static const struct options_string options[] = {
686 		CFG_REGS_CS(0, bnds),
687 		CFG_REGS_CS(0, config),
688 		CFG_REGS_CS(0, config_2),
689 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
690 		CFG_REGS_CS(1, bnds),
691 		CFG_REGS_CS(1, config),
692 		CFG_REGS_CS(1, config_2),
693 #endif
694 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
695 		CFG_REGS_CS(2, bnds),
696 		CFG_REGS_CS(2, config),
697 		CFG_REGS_CS(2, config_2),
698 #endif
699 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 3)
700 		CFG_REGS_CS(3, bnds),
701 		CFG_REGS_CS(3, config),
702 		CFG_REGS_CS(3, config_2),
703 #endif
704 		CFG_REGS(timing_cfg_3),
705 		CFG_REGS(timing_cfg_0),
706 		CFG_REGS(timing_cfg_1),
707 		CFG_REGS(timing_cfg_2),
708 		CFG_REGS(ddr_sdram_cfg),
709 		CFG_REGS(ddr_sdram_cfg_2),
710 		CFG_REGS(ddr_sdram_cfg_3),
711 		CFG_REGS(ddr_sdram_mode),
712 		CFG_REGS(ddr_sdram_mode_2),
713 		CFG_REGS(ddr_sdram_mode_3),
714 		CFG_REGS(ddr_sdram_mode_4),
715 		CFG_REGS(ddr_sdram_mode_5),
716 		CFG_REGS(ddr_sdram_mode_6),
717 		CFG_REGS(ddr_sdram_mode_7),
718 		CFG_REGS(ddr_sdram_mode_8),
719 #ifdef CONFIG_SYS_FSL_DDR4
720 		CFG_REGS(ddr_sdram_mode_9),
721 		CFG_REGS(ddr_sdram_mode_10),
722 		CFG_REGS(ddr_sdram_mode_11),
723 		CFG_REGS(ddr_sdram_mode_12),
724 		CFG_REGS(ddr_sdram_mode_13),
725 		CFG_REGS(ddr_sdram_mode_14),
726 		CFG_REGS(ddr_sdram_mode_15),
727 		CFG_REGS(ddr_sdram_mode_16),
728 #endif
729 		CFG_REGS(ddr_sdram_interval),
730 		CFG_REGS(ddr_data_init),
731 		CFG_REGS(ddr_sdram_clk_cntl),
732 		CFG_REGS(ddr_init_addr),
733 		CFG_REGS(ddr_init_ext_addr),
734 		CFG_REGS(timing_cfg_4),
735 		CFG_REGS(timing_cfg_5),
736 #ifdef CONFIG_SYS_FSL_DDR4
737 		CFG_REGS(timing_cfg_6),
738 		CFG_REGS(timing_cfg_7),
739 		CFG_REGS(timing_cfg_8),
740 		CFG_REGS(timing_cfg_9),
741 #endif
742 		CFG_REGS(ddr_zq_cntl),
743 		CFG_REGS(ddr_wrlvl_cntl),
744 		CFG_REGS(ddr_wrlvl_cntl_2),
745 		CFG_REGS(ddr_wrlvl_cntl_3),
746 		CFG_REGS(ddr_sr_cntr),
747 		CFG_REGS(ddr_sdram_rcw_1),
748 		CFG_REGS(ddr_sdram_rcw_2),
749 		CFG_REGS(ddr_cdr1),
750 		CFG_REGS(ddr_cdr2),
751 		CFG_REGS(dq_map_0),
752 		CFG_REGS(dq_map_1),
753 		CFG_REGS(dq_map_2),
754 		CFG_REGS(dq_map_3),
755 		CFG_REGS(err_disable),
756 		CFG_REGS(err_int_en),
757 		CFG_REGS(ddr_sdram_rcw_2),
758 		CFG_REGS(ddr_sdram_rcw_2),
759 		CFG_REGS(ddr_eor),
760 	};
761 	static const unsigned int n_opts = ARRAY_SIZE(options);
762 
763 	debug("fsl_ddr_regs_edit: ctrl_num = %u, "
764 		"regname = %s, value = %s\n",
765 		ctrl_num, regname, value_str);
766 	if (ctrl_num > CONFIG_NUM_DDR_CONTROLLERS)
767 		return;
768 
769 	ddr = &(pinfo->fsl_ddr_config_reg[ctrl_num]);
770 
771 	if (handle_option_table(options, n_opts, ddr, regname, value_str))
772 		return;
773 
774 	for (i = 0; i < 32; i++) {
775 		unsigned int value = simple_strtoul(value_str, NULL, 0);
776 		sprintf(buf, "debug_%u", i + 1);
777 		if (strcmp(buf, regname) == 0) {
778 			ddr->debug[i] = value;
779 			return;
780 		}
781 	}
782 	printf("Error: couldn't find register string %s\n", regname);
783 }
784 
785 #define CTRL_OPTIONS_HEX(x) {#x, offsetof(memctl_options_t, x), \
786 	sizeof((memctl_options_t *)0)->x, 1}
787 
788 static void print_memctl_options(const memctl_options_t *popts)
789 {
790 	static const struct options_string options[] = {
791 		CTRL_OPTIONS_CS(0, odt_rd_cfg),
792 		CTRL_OPTIONS_CS(0, odt_wr_cfg),
793 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
794 		CTRL_OPTIONS_CS(1, odt_rd_cfg),
795 		CTRL_OPTIONS_CS(1, odt_wr_cfg),
796 #endif
797 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
798 		CTRL_OPTIONS_CS(2, odt_rd_cfg),
799 		CTRL_OPTIONS_CS(2, odt_wr_cfg),
800 #endif
801 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 3)
802 		CTRL_OPTIONS_CS(3, odt_rd_cfg),
803 		CTRL_OPTIONS_CS(3, odt_wr_cfg),
804 #endif
805 #if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
806 		CTRL_OPTIONS_CS(0, odt_rtt_norm),
807 		CTRL_OPTIONS_CS(0, odt_rtt_wr),
808 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
809 		CTRL_OPTIONS_CS(1, odt_rtt_norm),
810 		CTRL_OPTIONS_CS(1, odt_rtt_wr),
811 #endif
812 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
813 		CTRL_OPTIONS_CS(2, odt_rtt_norm),
814 		CTRL_OPTIONS_CS(2, odt_rtt_wr),
815 #endif
816 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 3)
817 		CTRL_OPTIONS_CS(3, odt_rtt_norm),
818 		CTRL_OPTIONS_CS(3, odt_rtt_wr),
819 #endif
820 #endif
821 		CTRL_OPTIONS(memctl_interleaving),
822 		CTRL_OPTIONS(memctl_interleaving_mode),
823 		CTRL_OPTIONS_HEX(ba_intlv_ctl),
824 		CTRL_OPTIONS(ecc_mode),
825 		CTRL_OPTIONS(ecc_init_using_memctl),
826 		CTRL_OPTIONS(dqs_config),
827 		CTRL_OPTIONS(self_refresh_in_sleep),
828 		CTRL_OPTIONS(dynamic_power),
829 		CTRL_OPTIONS(data_bus_width),
830 		CTRL_OPTIONS(burst_length),
831 		CTRL_OPTIONS(cas_latency_override),
832 		CTRL_OPTIONS(cas_latency_override_value),
833 		CTRL_OPTIONS(use_derated_caslat),
834 		CTRL_OPTIONS(additive_latency_override),
835 		CTRL_OPTIONS(additive_latency_override_value),
836 		CTRL_OPTIONS(clk_adjust),
837 		CTRL_OPTIONS(cpo_override),
838 		CTRL_OPTIONS(write_data_delay),
839 		CTRL_OPTIONS(half_strength_driver_enable),
840 		/*
841 		 * These can probably be changed to 2T_EN and 3T_EN
842 		 * (using a leading numerical character) without problem
843 		 */
844 		CTRL_OPTIONS(twot_en),
845 		CTRL_OPTIONS(threet_en),
846 		CTRL_OPTIONS(registered_dimm_en),
847 		CTRL_OPTIONS(mirrored_dimm),
848 		CTRL_OPTIONS(ap_en),
849 		CTRL_OPTIONS(x4_en),
850 		CTRL_OPTIONS(bstopre),
851 		CTRL_OPTIONS(wrlvl_override),
852 		CTRL_OPTIONS(wrlvl_sample),
853 		CTRL_OPTIONS(wrlvl_start),
854 		CTRL_OPTIONS_HEX(cswl_override),
855 		CTRL_OPTIONS(rcw_override),
856 		CTRL_OPTIONS(rcw_1),
857 		CTRL_OPTIONS(rcw_2),
858 		CTRL_OPTIONS_HEX(ddr_cdr1),
859 		CTRL_OPTIONS_HEX(ddr_cdr2),
860 		CTRL_OPTIONS(tfaw_window_four_activates_ps),
861 		CTRL_OPTIONS(trwt_override),
862 		CTRL_OPTIONS(trwt),
863 		CTRL_OPTIONS(rtt_override),
864 		CTRL_OPTIONS(rtt_override_value),
865 		CTRL_OPTIONS(rtt_wr_override_value),
866 	};
867 	static const unsigned int n_opts = ARRAY_SIZE(options);
868 
869 	print_option_table(options, n_opts, popts);
870 }
871 
872 #ifdef CONFIG_SYS_FSL_DDR1
873 void ddr1_spd_dump(const ddr1_spd_eeprom_t *spd)
874 {
875 	unsigned int i;
876 
877 	printf("%-3d    : %02x %s\n", 0, spd->info_size,
878 	       " spd->info_size,   *  0 # bytes written into serial memory *");
879 	printf("%-3d    : %02x %s\n", 1, spd->chip_size,
880 	       " spd->chip_size,   *  1 Total # bytes of SPD memory device *");
881 	printf("%-3d    : %02x %s\n", 2, spd->mem_type,
882 	       " spd->mem_type,    *  2 Fundamental memory type *");
883 	printf("%-3d    : %02x %s\n", 3, spd->nrow_addr,
884 	       " spd->nrow_addr,   *  3 # of Row Addresses on this assembly *");
885 	printf("%-3d    : %02x %s\n", 4, spd->ncol_addr,
886 	       " spd->ncol_addr,   *  4 # of Column Addrs on this assembly *");
887 	printf("%-3d    : %02x %s\n", 5, spd->nrows,
888 	       " spd->nrows        *  5 # of DIMM Banks *");
889 	printf("%-3d    : %02x %s\n", 6, spd->dataw_lsb,
890 	       " spd->dataw_lsb,   *  6 Data Width lsb of this assembly *");
891 	printf("%-3d    : %02x %s\n", 7, spd->dataw_msb,
892 	       " spd->dataw_msb,   *  7 Data Width msb of this assembly *");
893 	printf("%-3d    : %02x %s\n", 8, spd->voltage,
894 	       " spd->voltage,     *  8 Voltage intf std of this assembly *");
895 	printf("%-3d    : %02x %s\n", 9, spd->clk_cycle,
896 	       " spd->clk_cycle,   *  9 SDRAM Cycle time at CL=X *");
897 	printf("%-3d    : %02x %s\n", 10, spd->clk_access,
898 	       " spd->clk_access,  * 10 SDRAM Access from Clock at CL=X *");
899 	printf("%-3d    : %02x %s\n", 11, spd->config,
900 	       " spd->config,      * 11 DIMM Configuration type *");
901 	printf("%-3d    : %02x %s\n", 12, spd->refresh,
902 	       " spd->refresh,     * 12 Refresh Rate/Type *");
903 	printf("%-3d    : %02x %s\n", 13, spd->primw,
904 	       " spd->primw,       * 13 Primary SDRAM Width *");
905 	printf("%-3d    : %02x %s\n", 14, spd->ecw,
906 	       " spd->ecw,         * 14 Error Checking SDRAM width *");
907 	printf("%-3d    : %02x %s\n", 15, spd->min_delay,
908 	       " spd->min_delay,   * 15 Back to Back Random Access *");
909 	printf("%-3d    : %02x %s\n", 16, spd->burstl,
910 	       " spd->burstl,      * 16 Burst Lengths Supported *");
911 	printf("%-3d    : %02x %s\n", 17, spd->nbanks,
912 	       " spd->nbanks,      * 17 # of Banks on Each SDRAM Device *");
913 	printf("%-3d    : %02x %s\n", 18, spd->cas_lat,
914 	       " spd->cas_lat,     * 18 CAS# Latencies Supported *");
915 	printf("%-3d    : %02x %s\n", 19, spd->cs_lat,
916 	       " spd->cs_lat,      * 19 Chip Select Latency *");
917 	printf("%-3d    : %02x %s\n", 20, spd->write_lat,
918 	       " spd->write_lat,   * 20 Write Latency/Recovery *");
919 	printf("%-3d    : %02x %s\n", 21, spd->mod_attr,
920 	       " spd->mod_attr,    * 21 SDRAM Module Attributes *");
921 	printf("%-3d    : %02x %s\n", 22, spd->dev_attr,
922 	       " spd->dev_attr,    * 22 SDRAM Device Attributes *");
923 	printf("%-3d    : %02x %s\n", 23, spd->clk_cycle2,
924 	       " spd->clk_cycle2,  * 23 Min SDRAM Cycle time at CL=X-1 *");
925 	printf("%-3d    : %02x %s\n", 24, spd->clk_access2,
926 	       " spd->clk_access2, * 24 SDRAM Access from Clock at CL=X-1 *");
927 	printf("%-3d    : %02x %s\n", 25, spd->clk_cycle3,
928 	       " spd->clk_cycle3,  * 25 Min SDRAM Cycle time at CL=X-2 *");
929 	printf("%-3d    : %02x %s\n", 26, spd->clk_access3,
930 	       " spd->clk_access3, * 26 Max Access from Clock at CL=X-2 *");
931 	printf("%-3d    : %02x %s\n", 27, spd->trp,
932 	       " spd->trp,         * 27 Min Row Precharge Time (tRP)*");
933 	printf("%-3d    : %02x %s\n", 28, spd->trrd,
934 	       " spd->trrd,        * 28 Min Row Active to Row Active (tRRD) *");
935 	printf("%-3d    : %02x %s\n", 29, spd->trcd,
936 	       " spd->trcd,        * 29 Min RAS to CAS Delay (tRCD) *");
937 	printf("%-3d    : %02x %s\n", 30, spd->tras,
938 	       " spd->tras,        * 30 Minimum RAS Pulse Width (tRAS) *");
939 	printf("%-3d    : %02x %s\n", 31, spd->bank_dens,
940 	       " spd->bank_dens,   * 31 Density of each bank on module *");
941 	printf("%-3d    : %02x %s\n", 32, spd->ca_setup,
942 	       " spd->ca_setup,    * 32 Cmd + Addr signal input setup time *");
943 	printf("%-3d    : %02x %s\n", 33, spd->ca_hold,
944 	       " spd->ca_hold,     * 33 Cmd and Addr signal input hold time *");
945 	printf("%-3d    : %02x %s\n", 34, spd->data_setup,
946 	       " spd->data_setup,  * 34 Data signal input setup time *");
947 	printf("%-3d    : %02x %s\n", 35, spd->data_hold,
948 	       " spd->data_hold,   * 35 Data signal input hold time *");
949 	printf("%-3d    : %02x %s\n", 36, spd->res_36_40[0],
950 	       " spd->res_36_40[0], * 36 Reserved / tWR *");
951 	printf("%-3d    : %02x %s\n", 37, spd->res_36_40[1],
952 	       " spd->res_36_40[1], * 37 Reserved / tWTR *");
953 	printf("%-3d    : %02x %s\n", 38, spd->res_36_40[2],
954 	       " spd->res_36_40[2], * 38 Reserved / tRTP *");
955 	printf("%-3d    : %02x %s\n", 39, spd->res_36_40[3],
956 	       " spd->res_36_40[3], * 39 Reserved / mem_probe *");
957 	printf("%-3d    : %02x %s\n", 40, spd->res_36_40[4],
958 	       " spd->res_36_40[4], * 40 Reserved / trc,trfc extensions *");
959 	printf("%-3d    : %02x %s\n", 41, spd->trc,
960 	       " spd->trc,         * 41 Min Active to Auto refresh time tRC *");
961 	printf("%-3d    : %02x %s\n", 42, spd->trfc,
962 	       " spd->trfc,        * 42 Min Auto to Active period tRFC *");
963 	printf("%-3d    : %02x %s\n", 43, spd->tckmax,
964 	       " spd->tckmax,      * 43 Max device cycle time tCKmax *");
965 	printf("%-3d    : %02x %s\n", 44, spd->tdqsq,
966 	       " spd->tdqsq,       * 44 Max DQS to DQ skew *");
967 	printf("%-3d    : %02x %s\n", 45, spd->tqhs,
968 	       " spd->tqhs,        * 45 Max Read DataHold skew tQHS *");
969 	printf("%-3d    : %02x %s\n", 46, spd->res_46,
970 	       " spd->res_46,  * 46 Reserved/ PLL Relock time *");
971 	printf("%-3d    : %02x %s\n", 47, spd->dimm_height,
972 	       " spd->dimm_height  * 47 SDRAM DIMM Height *");
973 
974 	printf("%-3d-%3d: ",  48, 61);
975 
976 	for (i = 0; i < 14; i++)
977 		printf("%02x", spd->res_48_61[i]);
978 
979 	printf(" * 48-61 IDD in SPD and Reserved space *\n");
980 
981 	printf("%-3d    : %02x %s\n", 62, spd->spd_rev,
982 	       " spd->spd_rev,     * 62 SPD Data Revision Code *");
983 	printf("%-3d    : %02x %s\n", 63, spd->cksum,
984 	       " spd->cksum,       * 63 Checksum for bytes 0-62 *");
985 	printf("%-3d-%3d: ",  64, 71);
986 
987 	for (i = 0; i < 8; i++)
988 		printf("%02x", spd->mid[i]);
989 
990 	printf("* 64 Mfr's JEDEC ID code per JEP-108E *\n");
991 	printf("%-3d    : %02x %s\n", 72, spd->mloc,
992 	       " spd->mloc,        * 72 Manufacturing Location *");
993 
994 	printf("%-3d-%3d: >>",  73, 90);
995 
996 	for (i = 0; i < 18; i++)
997 		printf("%c", spd->mpart[i]);
998 
999 	printf("<<* 73 Manufacturer's Part Number *\n");
1000 
1001 	printf("%-3d-%3d: %02x %02x %s\n", 91, 92, spd->rev[0], spd->rev[1],
1002 	       "* 91 Revision Code *");
1003 	printf("%-3d-%3d: %02x %02x %s\n", 93, 94, spd->mdate[0], spd->mdate[1],
1004 	       "* 93 Manufacturing Date *");
1005 	printf("%-3d-%3d: ", 95, 98);
1006 
1007 	for (i = 0; i < 4; i++)
1008 		printf("%02x", spd->sernum[i]);
1009 
1010 	printf("* 95 Assembly Serial Number *\n");
1011 
1012 	printf("%-3d-%3d: ", 99, 127);
1013 
1014 	for (i = 0; i < 27; i++)
1015 		printf("%02x", spd->mspec[i]);
1016 
1017 	printf("* 99 Manufacturer Specific Data *\n");
1018 }
1019 #endif
1020 
1021 #ifdef CONFIG_SYS_FSL_DDR2
1022 void ddr2_spd_dump(const ddr2_spd_eeprom_t *spd)
1023 {
1024 	unsigned int i;
1025 
1026 	printf("%-3d    : %02x %s\n", 0, spd->info_size,
1027 	       " spd->info_size,   *  0 # bytes written into serial memory *");
1028 	printf("%-3d    : %02x %s\n", 1, spd->chip_size,
1029 	       " spd->chip_size,   *  1 Total # bytes of SPD memory device *");
1030 	printf("%-3d    : %02x %s\n", 2, spd->mem_type,
1031 	       " spd->mem_type,    *  2 Fundamental memory type *");
1032 	printf("%-3d    : %02x %s\n", 3, spd->nrow_addr,
1033 	       " spd->nrow_addr,   *  3 # of Row Addresses on this assembly *");
1034 	printf("%-3d    : %02x %s\n", 4, spd->ncol_addr,
1035 	       " spd->ncol_addr,   *  4 # of Column Addrs on this assembly *");
1036 	printf("%-3d    : %02x %s\n", 5, spd->mod_ranks,
1037 	       " spd->mod_ranks    *  5 # of Module Rows on this assembly *");
1038 	printf("%-3d    : %02x %s\n", 6, spd->dataw,
1039 	       " spd->dataw,       *  6 Data Width of this assembly *");
1040 	printf("%-3d    : %02x %s\n", 7, spd->res_7,
1041 	       " spd->res_7,       *  7 Reserved *");
1042 	printf("%-3d    : %02x %s\n", 8, spd->voltage,
1043 	       " spd->voltage,     *  8 Voltage intf std of this assembly *");
1044 	printf("%-3d    : %02x %s\n", 9, spd->clk_cycle,
1045 	       " spd->clk_cycle,   *  9 SDRAM Cycle time at CL=X *");
1046 	printf("%-3d    : %02x %s\n", 10, spd->clk_access,
1047 	       " spd->clk_access,  * 10 SDRAM Access from Clock at CL=X *");
1048 	printf("%-3d    : %02x %s\n", 11, spd->config,
1049 	       " spd->config,      * 11 DIMM Configuration type *");
1050 	printf("%-3d    : %02x %s\n", 12, spd->refresh,
1051 	       " spd->refresh,     * 12 Refresh Rate/Type *");
1052 	printf("%-3d    : %02x %s\n", 13, spd->primw,
1053 	       " spd->primw,       * 13 Primary SDRAM Width *");
1054 	printf("%-3d    : %02x %s\n", 14, spd->ecw,
1055 	       " spd->ecw,         * 14 Error Checking SDRAM width *");
1056 	printf("%-3d    : %02x %s\n", 15, spd->res_15,
1057 	       " spd->res_15,      * 15 Reserved *");
1058 	printf("%-3d    : %02x %s\n", 16, spd->burstl,
1059 	       " spd->burstl,      * 16 Burst Lengths Supported *");
1060 	printf("%-3d    : %02x %s\n", 17, spd->nbanks,
1061 	       " spd->nbanks,      * 17 # of Banks on Each SDRAM Device *");
1062 	printf("%-3d    : %02x %s\n", 18, spd->cas_lat,
1063 	       " spd->cas_lat,     * 18 CAS# Latencies Supported *");
1064 	printf("%-3d    : %02x %s\n", 19, spd->mech_char,
1065 	       " spd->mech_char,   * 19 Mechanical Characteristics *");
1066 	printf("%-3d    : %02x %s\n", 20, spd->dimm_type,
1067 	       " spd->dimm_type,   * 20 DIMM type *");
1068 	printf("%-3d    : %02x %s\n", 21, spd->mod_attr,
1069 	       " spd->mod_attr,    * 21 SDRAM Module Attributes *");
1070 	printf("%-3d    : %02x %s\n", 22, spd->dev_attr,
1071 	       " spd->dev_attr,    * 22 SDRAM Device Attributes *");
1072 	printf("%-3d    : %02x %s\n", 23, spd->clk_cycle2,
1073 	       " spd->clk_cycle2,  * 23 Min SDRAM Cycle time at CL=X-1 *");
1074 	printf("%-3d    : %02x %s\n", 24, spd->clk_access2,
1075 	       " spd->clk_access2, * 24 SDRAM Access from Clock at CL=X-1 *");
1076 	printf("%-3d    : %02x %s\n", 25, spd->clk_cycle3,
1077 	       " spd->clk_cycle3,  * 25 Min SDRAM Cycle time at CL=X-2 *");
1078 	printf("%-3d    : %02x %s\n", 26, spd->clk_access3,
1079 	       " spd->clk_access3, * 26 Max Access from Clock at CL=X-2 *");
1080 	printf("%-3d    : %02x %s\n", 27, spd->trp,
1081 	       " spd->trp,         * 27 Min Row Precharge Time (tRP)*");
1082 	printf("%-3d    : %02x %s\n", 28, spd->trrd,
1083 	       " spd->trrd,        * 28 Min Row Active to Row Active (tRRD) *");
1084 	printf("%-3d    : %02x %s\n", 29, spd->trcd,
1085 	       " spd->trcd,        * 29 Min RAS to CAS Delay (tRCD) *");
1086 	printf("%-3d    : %02x %s\n", 30, spd->tras,
1087 	       " spd->tras,        * 30 Minimum RAS Pulse Width (tRAS) *");
1088 	printf("%-3d    : %02x %s\n", 31, spd->rank_dens,
1089 	       " spd->rank_dens,   * 31 Density of each rank on module *");
1090 	printf("%-3d    : %02x %s\n", 32, spd->ca_setup,
1091 	       " spd->ca_setup,    * 32 Cmd + Addr signal input setup time *");
1092 	printf("%-3d    : %02x %s\n", 33, spd->ca_hold,
1093 	       " spd->ca_hold,     * 33 Cmd and Addr signal input hold time *");
1094 	printf("%-3d    : %02x %s\n", 34, spd->data_setup,
1095 	       " spd->data_setup,  * 34 Data signal input setup time *");
1096 	printf("%-3d    : %02x %s\n", 35, spd->data_hold,
1097 	       " spd->data_hold,   * 35 Data signal input hold time *");
1098 	printf("%-3d    : %02x %s\n", 36, spd->twr,
1099 	       " spd->twr,         * 36 Write Recovery time tWR *");
1100 	printf("%-3d    : %02x %s\n", 37, spd->twtr,
1101 	       " spd->twtr,        * 37 Int write to read delay tWTR *");
1102 	printf("%-3d    : %02x %s\n", 38, spd->trtp,
1103 	       " spd->trtp,        * 38 Int read to precharge delay tRTP *");
1104 	printf("%-3d    : %02x %s\n", 39, spd->mem_probe,
1105 	       " spd->mem_probe,   * 39 Mem analysis probe characteristics *");
1106 	printf("%-3d    : %02x %s\n", 40, spd->trctrfc_ext,
1107 	       " spd->trctrfc_ext, * 40 Extensions to trc and trfc *");
1108 	printf("%-3d    : %02x %s\n", 41, spd->trc,
1109 	       " spd->trc,         * 41 Min Active to Auto refresh time tRC *");
1110 	printf("%-3d    : %02x %s\n", 42, spd->trfc,
1111 	       " spd->trfc,        * 42 Min Auto to Active period tRFC *");
1112 	printf("%-3d    : %02x %s\n", 43, spd->tckmax,
1113 	       " spd->tckmax,      * 43 Max device cycle time tCKmax *");
1114 	printf("%-3d    : %02x %s\n", 44, spd->tdqsq,
1115 	       " spd->tdqsq,       * 44 Max DQS to DQ skew *");
1116 	printf("%-3d    : %02x %s\n", 45, spd->tqhs,
1117 	       " spd->tqhs,        * 45 Max Read DataHold skew tQHS *");
1118 	printf("%-3d    : %02x %s\n", 46, spd->pll_relock,
1119 	       " spd->pll_relock,  * 46 PLL Relock time *");
1120 	printf("%-3d    : %02x %s\n", 47, spd->t_casemax,
1121 	       " spd->t_casemax,    * 47 t_casemax *");
1122 	printf("%-3d    : %02x %s\n", 48, spd->psi_ta_dram,
1123 	       " spd->psi_ta_dram,   * 48 Thermal Resistance of DRAM Package "
1124 	       "from Top (Case) to Ambient (Psi T-A DRAM) *");
1125 	printf("%-3d    : %02x %s\n", 49, spd->dt0_mode,
1126 	       " spd->dt0_mode,    * 49 DRAM Case Temperature Rise from "
1127 	       "Ambient due to Activate-Precharge/Mode Bits "
1128 	       "(DT0/Mode Bits) *)");
1129 	printf("%-3d    : %02x %s\n", 50, spd->dt2n_dt2q,
1130 	       " spd->dt2n_dt2q,   * 50 DRAM Case Temperature Rise from "
1131 	       "Ambient due to Precharge/Quiet Standby "
1132 	       "(DT2N/DT2Q) *");
1133 	printf("%-3d    : %02x %s\n", 51, spd->dt2p,
1134 	       " spd->dt2p,        * 51 DRAM Case Temperature Rise from "
1135 	       "Ambient due to Precharge Power-Down (DT2P) *");
1136 	printf("%-3d    : %02x %s\n", 52, spd->dt3n,
1137 	       " spd->dt3n,        * 52 DRAM Case Temperature Rise from "
1138 	       "Ambient due to Active Standby (DT3N) *");
1139 	printf("%-3d    : %02x %s\n", 53, spd->dt3pfast,
1140 	       " spd->dt3pfast,    * 53 DRAM Case Temperature Rise from "
1141 	       "Ambient due to Active Power-Down with Fast PDN Exit "
1142 	       "(DT3Pfast) *");
1143 	printf("%-3d    : %02x %s\n", 54, spd->dt3pslow,
1144 	       " spd->dt3pslow,    * 54 DRAM Case Temperature Rise from "
1145 	       "Ambient due to Active Power-Down with Slow PDN Exit "
1146 	       "(DT3Pslow) *");
1147 	printf("%-3d    : %02x %s\n", 55, spd->dt4r_dt4r4w,
1148 	       " spd->dt4r_dt4r4w, * 55 DRAM Case Temperature Rise from "
1149 	       "Ambient due to Page Open Burst Read/DT4R4W Mode Bit "
1150 	       "(DT4R/DT4R4W Mode Bit) *");
1151 	printf("%-3d    : %02x %s\n", 56, spd->dt5b,
1152 	       " spd->dt5b,        * 56 DRAM Case Temperature Rise from "
1153 	       "Ambient due to Burst Refresh (DT5B) *");
1154 	printf("%-3d    : %02x %s\n", 57, spd->dt7,
1155 	       " spd->dt7,         * 57 DRAM Case Temperature Rise from "
1156 	       "Ambient due to Bank Interleave Reads with "
1157 	       "Auto-Precharge (DT7) *");
1158 	printf("%-3d    : %02x %s\n", 58, spd->psi_ta_pll,
1159 	       " spd->psi_ta_pll,    * 58 Thermal Resistance of PLL Package form"
1160 	       " Top (Case) to Ambient (Psi T-A PLL) *");
1161 	printf("%-3d    : %02x %s\n", 59, spd->psi_ta_reg,
1162 	       " spd->psi_ta_reg,    * 59 Thermal Reisitance of Register Package"
1163 	       " from Top (Case) to Ambient (Psi T-A Register) *");
1164 	printf("%-3d    : %02x %s\n", 60, spd->dtpllactive,
1165 	       " spd->dtpllactive, * 60 PLL Case Temperature Rise from "
1166 	       "Ambient due to PLL Active (DT PLL Active) *");
1167 	printf("%-3d    : %02x %s\n", 61, spd->dtregact,
1168 	       " spd->dtregact,    "
1169 	       "* 61 Register Case Temperature Rise from Ambient due to "
1170 	       "Register Active/Mode Bit (DT Register Active/Mode Bit) *");
1171 	printf("%-3d    : %02x %s\n", 62, spd->spd_rev,
1172 	       " spd->spd_rev,     * 62 SPD Data Revision Code *");
1173 	printf("%-3d    : %02x %s\n", 63, spd->cksum,
1174 	       " spd->cksum,       * 63 Checksum for bytes 0-62 *");
1175 
1176 	printf("%-3d-%3d: ",  64, 71);
1177 
1178 	for (i = 0; i < 8; i++)
1179 		printf("%02x", spd->mid[i]);
1180 
1181 	printf("* 64 Mfr's JEDEC ID code per JEP-108E *\n");
1182 
1183 	printf("%-3d    : %02x %s\n", 72, spd->mloc,
1184 	       " spd->mloc,        * 72 Manufacturing Location *");
1185 
1186 	printf("%-3d-%3d: >>",  73, 90);
1187 	for (i = 0; i < 18; i++)
1188 		printf("%c", spd->mpart[i]);
1189 
1190 
1191 	printf("<<* 73 Manufacturer's Part Number *\n");
1192 
1193 	printf("%-3d-%3d: %02x %02x %s\n", 91, 92, spd->rev[0], spd->rev[1],
1194 	       "* 91 Revision Code *");
1195 	printf("%-3d-%3d: %02x %02x %s\n", 93, 94, spd->mdate[0], spd->mdate[1],
1196 	       "* 93 Manufacturing Date *");
1197 	printf("%-3d-%3d: ", 95, 98);
1198 
1199 	for (i = 0; i < 4; i++)
1200 		printf("%02x", spd->sernum[i]);
1201 
1202 	printf("* 95 Assembly Serial Number *\n");
1203 
1204 	printf("%-3d-%3d: ", 99, 127);
1205 	for (i = 0; i < 27; i++)
1206 		printf("%02x", spd->mspec[i]);
1207 
1208 
1209 	printf("* 99 Manufacturer Specific Data *\n");
1210 }
1211 #endif
1212 
1213 #ifdef CONFIG_SYS_FSL_DDR3
1214 void ddr3_spd_dump(const ddr3_spd_eeprom_t *spd)
1215 {
1216 	unsigned int i;
1217 
1218 	/* General Section: Bytes 0-59 */
1219 
1220 #define PRINT_NXS(x, y, z...) printf("%-3d    : %02x " z "\n", x, (u8)y);
1221 #define PRINT_NNXXS(n0, n1, x0, x1, s) \
1222 	printf("%-3d-%3d: %02x %02x " s "\n", n0, n1, x0, x1);
1223 
1224 	PRINT_NXS(0, spd->info_size_crc,
1225 		"info_size_crc  bytes written into serial memory, "
1226 		"CRC coverage");
1227 	PRINT_NXS(1, spd->spd_rev,
1228 		"spd_rev        SPD Revision");
1229 	PRINT_NXS(2, spd->mem_type,
1230 		"mem_type       Key Byte / DRAM Device Type");
1231 	PRINT_NXS(3, spd->module_type,
1232 		"module_type    Key Byte / Module Type");
1233 	PRINT_NXS(4, spd->density_banks,
1234 		"density_banks  SDRAM Density and Banks");
1235 	PRINT_NXS(5, spd->addressing,
1236 		"addressing     SDRAM Addressing");
1237 	PRINT_NXS(6, spd->module_vdd,
1238 		"module_vdd     Module Nominal Voltage, VDD");
1239 	PRINT_NXS(7, spd->organization,
1240 		"organization   Module Organization");
1241 	PRINT_NXS(8, spd->bus_width,
1242 		"bus_width      Module Memory Bus Width");
1243 	PRINT_NXS(9, spd->ftb_div,
1244 		"ftb_div        Fine Timebase (FTB) Dividend / Divisor");
1245 	PRINT_NXS(10, spd->mtb_dividend,
1246 		"mtb_dividend   Medium Timebase (MTB) Dividend");
1247 	PRINT_NXS(11, spd->mtb_divisor,
1248 		"mtb_divisor    Medium Timebase (MTB) Divisor");
1249 	PRINT_NXS(12, spd->tck_min,
1250 		  "tck_min        SDRAM Minimum Cycle Time");
1251 	PRINT_NXS(13, spd->res_13,
1252 		"res_13         Reserved");
1253 	PRINT_NXS(14, spd->caslat_lsb,
1254 		"caslat_lsb     CAS Latencies Supported, LSB");
1255 	PRINT_NXS(15, spd->caslat_msb,
1256 		"caslat_msb     CAS Latencies Supported, MSB");
1257 	PRINT_NXS(16, spd->taa_min,
1258 		  "taa_min        Min CAS Latency Time");
1259 	PRINT_NXS(17, spd->twr_min,
1260 		  "twr_min        Min Write REcovery Time");
1261 	PRINT_NXS(18, spd->trcd_min,
1262 		  "trcd_min       Min RAS# to CAS# Delay Time");
1263 	PRINT_NXS(19, spd->trrd_min,
1264 		  "trrd_min       Min Row Active to Row Active Delay Time");
1265 	PRINT_NXS(20, spd->trp_min,
1266 		  "trp_min        Min Row Precharge Delay Time");
1267 	PRINT_NXS(21, spd->tras_trc_ext,
1268 		  "tras_trc_ext   Upper Nibbles for tRAS and tRC");
1269 	PRINT_NXS(22, spd->tras_min_lsb,
1270 		  "tras_min_lsb   Min Active to Precharge Delay Time, LSB");
1271 	PRINT_NXS(23, spd->trc_min_lsb,
1272 		  "trc_min_lsb Min Active to Active/Refresh Delay Time, LSB");
1273 	PRINT_NXS(24, spd->trfc_min_lsb,
1274 		  "trfc_min_lsb   Min Refresh Recovery Delay Time LSB");
1275 	PRINT_NXS(25, spd->trfc_min_msb,
1276 		  "trfc_min_msb   Min Refresh Recovery Delay Time MSB");
1277 	PRINT_NXS(26, spd->twtr_min,
1278 		  "twtr_min Min Internal Write to Read Command Delay Time");
1279 	PRINT_NXS(27, spd->trtp_min,
1280 		  "trtp_min "
1281 		  "Min Internal Read to Precharge Command Delay Time");
1282 	PRINT_NXS(28, spd->tfaw_msb,
1283 		  "tfaw_msb       Upper Nibble for tFAW");
1284 	PRINT_NXS(29, spd->tfaw_min,
1285 		  "tfaw_min       Min Four Activate Window Delay Time");
1286 	PRINT_NXS(30, spd->opt_features,
1287 		"opt_features   SDRAM Optional Features");
1288 	PRINT_NXS(31, spd->therm_ref_opt,
1289 		"therm_ref_opt  SDRAM Thermal and Refresh Opts");
1290 	PRINT_NXS(32, spd->therm_sensor,
1291 		"therm_sensor  SDRAM Thermal Sensor");
1292 	PRINT_NXS(33, spd->device_type,
1293 		"device_type  SDRAM Device Type");
1294 	PRINT_NXS(34, spd->fine_tck_min,
1295 		  "fine_tck_min  Fine offset for tCKmin");
1296 	PRINT_NXS(35, spd->fine_taa_min,
1297 		  "fine_taa_min  Fine offset for tAAmin");
1298 	PRINT_NXS(36, spd->fine_trcd_min,
1299 		  "fine_trcd_min Fine offset for tRCDmin");
1300 	PRINT_NXS(37, spd->fine_trp_min,
1301 		  "fine_trp_min  Fine offset for tRPmin");
1302 	PRINT_NXS(38, spd->fine_trc_min,
1303 		  "fine_trc_min  Fine offset for tRCmin");
1304 
1305 	printf("%-3d-%3d: ",  39, 59);  /* Reserved, General Section */
1306 
1307 	for (i = 39; i <= 59; i++)
1308 		printf("%02x ", spd->res_39_59[i - 39]);
1309 
1310 	puts("\n");
1311 
1312 	switch (spd->module_type) {
1313 	case 0x02:  /* UDIMM */
1314 	case 0x03:  /* SO-DIMM */
1315 	case 0x04:  /* Micro-DIMM */
1316 	case 0x06:  /* Mini-UDIMM */
1317 		PRINT_NXS(60, spd->mod_section.unbuffered.mod_height,
1318 			"mod_height    (Unbuffered) Module Nominal Height");
1319 		PRINT_NXS(61, spd->mod_section.unbuffered.mod_thickness,
1320 			"mod_thickness (Unbuffered) Module Maximum Thickness");
1321 		PRINT_NXS(62, spd->mod_section.unbuffered.ref_raw_card,
1322 			"ref_raw_card  (Unbuffered) Reference Raw Card Used");
1323 		PRINT_NXS(63, spd->mod_section.unbuffered.addr_mapping,
1324 			"addr_mapping  (Unbuffered) Address mapping from "
1325 			"Edge Connector to DRAM");
1326 		break;
1327 	case 0x01:  /* RDIMM */
1328 	case 0x05:  /* Mini-RDIMM */
1329 		PRINT_NXS(60, spd->mod_section.registered.mod_height,
1330 			"mod_height    (Registered) Module Nominal Height");
1331 		PRINT_NXS(61, spd->mod_section.registered.mod_thickness,
1332 			"mod_thickness (Registered) Module Maximum Thickness");
1333 		PRINT_NXS(62, spd->mod_section.registered.ref_raw_card,
1334 			"ref_raw_card  (Registered) Reference Raw Card Used");
1335 		PRINT_NXS(63, spd->mod_section.registered.modu_attr,
1336 			"modu_attr     (Registered) DIMM Module Attributes");
1337 		PRINT_NXS(64, spd->mod_section.registered.thermal,
1338 			"thermal       (Registered) Thermal Heat "
1339 			"Spreader Solution");
1340 		PRINT_NXS(65, spd->mod_section.registered.reg_id_lo,
1341 			"reg_id_lo     (Registered) Register Manufacturer ID "
1342 			"Code, LSB");
1343 		PRINT_NXS(66, spd->mod_section.registered.reg_id_hi,
1344 			"reg_id_hi     (Registered) Register Manufacturer ID "
1345 			"Code, MSB");
1346 		PRINT_NXS(67, spd->mod_section.registered.reg_rev,
1347 			"reg_rev       (Registered) Register "
1348 			"Revision Number");
1349 		PRINT_NXS(68, spd->mod_section.registered.reg_type,
1350 			"reg_type      (Registered) Register Type");
1351 		for (i = 69; i <= 76; i++) {
1352 			printf("%-3d    : %02x rcw[%d]\n", i,
1353 				spd->mod_section.registered.rcw[i-69], i-69);
1354 		}
1355 		break;
1356 	default:
1357 		/* Module-specific Section, Unsupported Module Type */
1358 		printf("%-3d-%3d: ", 60, 116);
1359 
1360 		for (i = 60; i <= 116; i++)
1361 			printf("%02x", spd->mod_section.uc[i - 60]);
1362 
1363 		break;
1364 	}
1365 
1366 	/* Unique Module ID: Bytes 117-125 */
1367 	PRINT_NXS(117, spd->mmid_lsb, "Module MfgID Code LSB - JEP-106");
1368 	PRINT_NXS(118, spd->mmid_msb, "Module MfgID Code MSB - JEP-106");
1369 	PRINT_NXS(119, spd->mloc,     "Mfg Location");
1370 	PRINT_NNXXS(120, 121, spd->mdate[0], spd->mdate[1], "Mfg Date");
1371 
1372 	printf("%-3d-%3d: ", 122, 125);
1373 
1374 	for (i = 122; i <= 125; i++)
1375 		printf("%02x ", spd->sernum[i - 122]);
1376 	printf("   Module Serial Number\n");
1377 
1378 	/* CRC: Bytes 126-127 */
1379 	PRINT_NNXXS(126, 127, spd->crc[0], spd->crc[1], "  SPD CRC");
1380 
1381 	/* Other Manufacturer Fields and User Space: Bytes 128-255 */
1382 	printf("%-3d-%3d: ", 128, 145);
1383 	for (i = 128; i <= 145; i++)
1384 		printf("%02x ", spd->mpart[i - 128]);
1385 	printf("   Mfg's Module Part Number\n");
1386 
1387 	PRINT_NNXXS(146, 147, spd->mrev[0], spd->mrev[1],
1388 		"Module Revision code");
1389 
1390 	PRINT_NXS(148, spd->dmid_lsb, "DRAM MfgID Code LSB - JEP-106");
1391 	PRINT_NXS(149, spd->dmid_msb, "DRAM MfgID Code MSB - JEP-106");
1392 
1393 	printf("%-3d-%3d: ", 150, 175);
1394 	for (i = 150; i <= 175; i++)
1395 		printf("%02x ", spd->msd[i - 150]);
1396 	printf("   Mfg's Specific Data\n");
1397 
1398 	printf("%-3d-%3d: ", 176, 255);
1399 	for (i = 176; i <= 255; i++)
1400 		printf("%02x", spd->cust[i - 176]);
1401 	printf("   Mfg's Specific Data\n");
1402 
1403 }
1404 #endif
1405 
1406 #ifdef CONFIG_SYS_FSL_DDR4
1407 void ddr4_spd_dump(const struct ddr4_spd_eeprom_s *spd)
1408 {
1409 	unsigned int i;
1410 
1411 	/* General Section: Bytes 0-127 */
1412 
1413 #define PRINT_NXS(x, y, z...) printf("%-3d    : %02x " z "\n", x, (u8)y);
1414 #define PRINT_NNXXS(n0, n1, x0, x1, s) \
1415 	printf("%-3d-%3d: %02x %02x " s "\n", n0, n1, x0, x1);
1416 
1417 	PRINT_NXS(0, spd->info_size_crc,
1418 		  "info_size_crc  bytes written into serial memory, CRC coverage");
1419 	PRINT_NXS(1, spd->spd_rev,
1420 		  "spd_rev        SPD Revision");
1421 	PRINT_NXS(2, spd->mem_type,
1422 		  "mem_type       Key Byte / DRAM Device Type");
1423 	PRINT_NXS(3, spd->module_type,
1424 		  "module_type    Key Byte / Module Type");
1425 	PRINT_NXS(4, spd->density_banks,
1426 		  "density_banks  SDRAM Density and Banks");
1427 	PRINT_NXS(5, spd->addressing,
1428 		  "addressing     SDRAM Addressing");
1429 	PRINT_NXS(6, spd->package_type,
1430 		  "package_type   Package type");
1431 	PRINT_NXS(7, spd->opt_feature,
1432 		  "opt_feature    Optional features");
1433 	PRINT_NXS(8, spd->thermal_ref,
1434 		  "thermal_ref    Thermal and Refresh options");
1435 	PRINT_NXS(9, spd->oth_opt_features,
1436 		  "oth_opt_features Other SDRAM optional features");
1437 	PRINT_NXS(10, spd->res_10,
1438 		  "res_10         Reserved");
1439 	PRINT_NXS(11, spd->module_vdd,
1440 		  "module_vdd     Module Nominal Voltage, VDD");
1441 	PRINT_NXS(12, spd->organization,
1442 		  "organization Module Organization");
1443 	PRINT_NXS(13, spd->bus_width,
1444 		  "bus_width      Module Memory Bus Width");
1445 	PRINT_NXS(14, spd->therm_sensor,
1446 		  "therm_sensor   Module Thermal Sensor");
1447 	PRINT_NXS(15, spd->ext_type,
1448 		  "ext_type       Extended module type");
1449 	PRINT_NXS(16, spd->res_16,
1450 		  "res_16       Reserved");
1451 	PRINT_NXS(17, spd->timebases,
1452 		  "timebases    MTb and FTB");
1453 	PRINT_NXS(18, spd->tck_min,
1454 		  "tck_min      tCKAVGmin");
1455 	PRINT_NXS(19, spd->tck_max,
1456 		  "tck_max      TCKAVGmax");
1457 	PRINT_NXS(20, spd->caslat_b1,
1458 		  "caslat_b1    CAS latencies, 1st byte");
1459 	PRINT_NXS(21, spd->caslat_b2,
1460 		  "caslat_b2    CAS latencies, 2nd byte");
1461 	PRINT_NXS(22, spd->caslat_b3,
1462 		  "caslat_b3    CAS latencies, 3rd byte ");
1463 	PRINT_NXS(23, spd->caslat_b4,
1464 		  "caslat_b4    CAS latencies, 4th byte");
1465 	PRINT_NXS(24, spd->taa_min,
1466 		  "taa_min      Min CAS Latency Time");
1467 	PRINT_NXS(25, spd->trcd_min,
1468 		  "trcd_min     Min RAS# to CAS# Delay Time");
1469 	PRINT_NXS(26, spd->trp_min,
1470 		  "trp_min      Min Row Precharge Delay Time");
1471 	PRINT_NXS(27, spd->tras_trc_ext,
1472 		  "tras_trc_ext Upper Nibbles for tRAS and tRC");
1473 	PRINT_NXS(28, spd->tras_min_lsb,
1474 		  "tras_min_lsb tRASmin, lsb");
1475 	PRINT_NXS(29, spd->trc_min_lsb,
1476 		  "trc_min_lsb  tRCmin, lsb");
1477 	PRINT_NXS(30, spd->trfc1_min_lsb,
1478 		  "trfc1_min_lsb  Min Refresh Recovery Delay Time, LSB");
1479 	PRINT_NXS(31, spd->trfc1_min_msb,
1480 		  "trfc1_min_msb  Min Refresh Recovery Delay Time, MSB ");
1481 	PRINT_NXS(32, spd->trfc2_min_lsb,
1482 		  "trfc2_min_lsb  Min Refresh Recovery Delay Time, LSB");
1483 	PRINT_NXS(33, spd->trfc2_min_msb,
1484 		  "trfc2_min_msb  Min Refresh Recovery Delay Time, MSB");
1485 	PRINT_NXS(34, spd->trfc4_min_lsb,
1486 		  "trfc4_min_lsb Min Refresh Recovery Delay Time, LSB");
1487 	PRINT_NXS(35, spd->trfc4_min_msb,
1488 		  "trfc4_min_msb Min Refresh Recovery Delay Time, MSB");
1489 	PRINT_NXS(36, spd->tfaw_msb,
1490 		  "tfaw_msb      Upper Nibble for tFAW");
1491 	PRINT_NXS(37, spd->tfaw_min,
1492 		  "tfaw_min      tFAW, lsb");
1493 	PRINT_NXS(38, spd->trrds_min,
1494 		  "trrds_min     tRRD_Smin, MTB");
1495 	PRINT_NXS(39, spd->trrdl_min,
1496 		  "trrdl_min     tRRD_Lmin, MTB");
1497 	PRINT_NXS(40, spd->tccdl_min,
1498 		  "tccdl_min     tCCS_Lmin, MTB");
1499 
1500 	printf("%-3d-%3d: ", 41, 59);  /* Reserved, General Section */
1501 	for (i = 41; i <= 59; i++)
1502 		printf("%02x ", spd->res_41[i - 41]);
1503 
1504 	puts("\n");
1505 	printf("%-3d-%3d: ", 60, 77);
1506 	for (i = 60; i <= 77; i++)
1507 		printf("%02x ", spd->mapping[i - 60]);
1508 	puts("   mapping[] Connector to SDRAM bit map\n");
1509 
1510 	PRINT_NXS(117, spd->fine_tccdl_min,
1511 		  "fine_tccdl_min Fine offset for tCCD_Lmin");
1512 	PRINT_NXS(118, spd->fine_trrdl_min,
1513 		  "fine_trrdl_min Fine offset for tRRD_Lmin");
1514 	PRINT_NXS(119, spd->fine_trrds_min,
1515 		  "fine_trrds_min Fine offset for tRRD_Smin");
1516 	PRINT_NXS(120, spd->fine_trc_min,
1517 		  "fine_trc_min   Fine offset for tRCmin");
1518 	PRINT_NXS(121, spd->fine_trp_min,
1519 		  "fine_trp_min   Fine offset for tRPmin");
1520 	PRINT_NXS(122, spd->fine_trcd_min,
1521 		  "fine_trcd_min  Fine offset for tRCDmin");
1522 	PRINT_NXS(123, spd->fine_taa_min,
1523 		  "fine_taa_min   Fine offset for tAAmin");
1524 	PRINT_NXS(124, spd->fine_tck_max,
1525 		  "fine_tck_max   Fine offset for tCKAVGmax");
1526 	PRINT_NXS(125, spd->fine_tck_min,
1527 		  "fine_tck_min   Fine offset for tCKAVGmin");
1528 
1529 	/* CRC: Bytes 126-127 */
1530 	PRINT_NNXXS(126, 127, spd->crc[0], spd->crc[1], "  SPD CRC");
1531 
1532 	switch (spd->module_type) {
1533 	case 0x02:  /* UDIMM */
1534 	case 0x03:  /* SO-DIMM */
1535 		PRINT_NXS(128, spd->mod_section.unbuffered.mod_height,
1536 			  "mod_height    (Unbuffered) Module Nominal Height");
1537 		PRINT_NXS(129, spd->mod_section.unbuffered.mod_thickness,
1538 			  "mod_thickness (Unbuffered) Module Maximum Thickness");
1539 		PRINT_NXS(130, spd->mod_section.unbuffered.ref_raw_card,
1540 			  "ref_raw_card  (Unbuffered) Reference Raw Card Used");
1541 		PRINT_NXS(131, spd->mod_section.unbuffered.addr_mapping,
1542 			  "addr_mapping  (Unbuffered) Address mapping from Edge Connector to DRAM");
1543 		PRINT_NNXXS(254, 255, spd->mod_section.unbuffered.crc[0],
1544 			    spd->mod_section.unbuffered.crc[1], "  Module CRC");
1545 		break;
1546 	case 0x01:  /* RDIMM */
1547 		PRINT_NXS(128, spd->mod_section.registered.mod_height,
1548 			  "mod_height    (Registered) Module Nominal Height");
1549 		PRINT_NXS(129, spd->mod_section.registered.mod_thickness,
1550 			  "mod_thickness (Registered) Module Maximum Thickness");
1551 		PRINT_NXS(130, spd->mod_section.registered.ref_raw_card,
1552 			  "ref_raw_card  (Registered) Reference Raw Card Used");
1553 		PRINT_NXS(131, spd->mod_section.registered.modu_attr,
1554 			  "modu_attr     (Registered) DIMM Module Attributes");
1555 		PRINT_NXS(132, spd->mod_section.registered.thermal,
1556 			  "thermal       (Registered) Thermal Heat Spreader Solution");
1557 		PRINT_NXS(133, spd->mod_section.registered.reg_id_lo,
1558 			  "reg_id_lo     (Registered) Register Manufacturer ID Code, LSB");
1559 		PRINT_NXS(134, spd->mod_section.registered.reg_id_hi,
1560 			  "reg_id_hi     (Registered) Register Manufacturer ID Code, MSB");
1561 		PRINT_NXS(135, spd->mod_section.registered.reg_rev,
1562 			  "reg_rev       (Registered) Register Revision Number");
1563 		PRINT_NXS(136, spd->mod_section.registered.reg_map,
1564 			  "reg_map       (Registered) Address mapping");
1565 		PRINT_NNXXS(254, 255, spd->mod_section.registered.crc[0],
1566 			    spd->mod_section.registered.crc[1], "  Module CRC");
1567 		break;
1568 	case 0x04:  /* LRDIMM */
1569 		PRINT_NXS(128, spd->mod_section.loadreduced.mod_height,
1570 			  "mod_height    (Loadreduced) Module Nominal Height");
1571 		PRINT_NXS(129, spd->mod_section.loadreduced.mod_thickness,
1572 			  "mod_thickness (Loadreduced) Module Maximum Thickness");
1573 		PRINT_NXS(130, spd->mod_section.loadreduced.ref_raw_card,
1574 			  "ref_raw_card  (Loadreduced) Reference Raw Card Used");
1575 		PRINT_NXS(131, spd->mod_section.loadreduced.modu_attr,
1576 			  "modu_attr     (Loadreduced) DIMM Module Attributes");
1577 		PRINT_NXS(132, spd->mod_section.loadreduced.thermal,
1578 			  "thermal       (Loadreduced) Thermal Heat Spreader Solution");
1579 		PRINT_NXS(133, spd->mod_section.loadreduced.reg_id_lo,
1580 			  "reg_id_lo     (Loadreduced) Register Manufacturer ID Code, LSB");
1581 		PRINT_NXS(134, spd->mod_section.loadreduced.reg_id_hi,
1582 			  "reg_id_hi     (Loadreduced) Register Manufacturer ID Code, MSB");
1583 		PRINT_NXS(135, spd->mod_section.loadreduced.reg_rev,
1584 			  "reg_rev       (Loadreduced) Register Revision Number");
1585 		PRINT_NXS(136, spd->mod_section.loadreduced.reg_map,
1586 			  "reg_map       (Loadreduced) Address mapping");
1587 		PRINT_NXS(137, spd->mod_section.loadreduced.reg_drv,
1588 			  "reg_drv       (Loadreduced) Reg output drive strength");
1589 		PRINT_NXS(138, spd->mod_section.loadreduced.reg_drv_ck,
1590 			  "reg_drv_ck    (Loadreduced) Reg output drive strength for CK");
1591 		PRINT_NXS(139, spd->mod_section.loadreduced.data_buf_rev,
1592 			  "data_buf_rev  (Loadreduced) Data Buffer Revision Numbe");
1593 		PRINT_NXS(140, spd->mod_section.loadreduced.vrefqe_r0,
1594 			  "vrefqe_r0     (Loadreduced) DRAM VrefDQ for Package Rank 0");
1595 		PRINT_NXS(141, spd->mod_section.loadreduced.vrefqe_r1,
1596 			  "vrefqe_r1     (Loadreduced) DRAM VrefDQ for Package Rank 1");
1597 		PRINT_NXS(142, spd->mod_section.loadreduced.vrefqe_r2,
1598 			  "vrefqe_r2     (Loadreduced) DRAM VrefDQ for Package Rank 2");
1599 		PRINT_NXS(143, spd->mod_section.loadreduced.vrefqe_r3,
1600 			  "vrefqe_r3     (Loadreduced) DRAM VrefDQ for Package Rank 3");
1601 		PRINT_NXS(144, spd->mod_section.loadreduced.data_intf,
1602 			  "data_intf     (Loadreduced) Data Buffer VrefDQ for DRAM Interface");
1603 		PRINT_NXS(145, spd->mod_section.loadreduced.data_drv_1866,
1604 			  "data_drv_1866 (Loadreduced) Data Buffer MDQ Drive Strength and RTT");
1605 		PRINT_NXS(146, spd->mod_section.loadreduced.data_drv_2400,
1606 			  "data_drv_2400 (Loadreduced) Data Buffer MDQ Drive Strength and RTT");
1607 		PRINT_NXS(147, spd->mod_section.loadreduced.data_drv_3200,
1608 			  "data_drv_3200 (Loadreduced) Data Buffer MDQ Drive Strength and RTT");
1609 		PRINT_NXS(148, spd->mod_section.loadreduced.dram_drv,
1610 			  "dram_drv      (Loadreduced) DRAM Drive Strength");
1611 		PRINT_NXS(149, spd->mod_section.loadreduced.dram_odt_1866,
1612 			  "dram_odt_1866 (Loadreduced) DRAM ODT (RTT_WR, RTT_NOM)");
1613 		PRINT_NXS(150, spd->mod_section.loadreduced.dram_odt_2400,
1614 			  "dram_odt_2400 (Loadreduced) DRAM ODT (RTT_WR, RTT_NOM)");
1615 		PRINT_NXS(151, spd->mod_section.loadreduced.dram_odt_3200,
1616 			  "dram_odt_3200 (Loadreduced) DRAM ODT (RTT_WR, RTT_NOM)");
1617 		PRINT_NXS(152, spd->mod_section.loadreduced.dram_odt_park_1866,
1618 			  "dram_odt_park_1866 (Loadreduced) DRAM ODT (RTT_PARK)");
1619 		PRINT_NXS(153, spd->mod_section.loadreduced.dram_odt_park_2400,
1620 			  "dram_odt_park_2400 (Loadreduced) DRAM ODT (RTT_PARK)");
1621 		PRINT_NXS(154, spd->mod_section.loadreduced.dram_odt_park_3200,
1622 			  "dram_odt_park_3200 (Loadreduced) DRAM ODT (RTT_PARK)");
1623 		PRINT_NNXXS(254, 255, spd->mod_section.loadreduced.crc[0],
1624 			    spd->mod_section.loadreduced.crc[1],
1625 			    "  Module CRC");
1626 		break;
1627 	default:
1628 		/* Module-specific Section, Unsupported Module Type */
1629 		printf("%-3d-%3d: ", 128, 255);
1630 
1631 		for (i = 128; i <= 255; i++)
1632 			printf("%02x", spd->mod_section.uc[i - 128]);
1633 
1634 		break;
1635 	}
1636 
1637 	/* Unique Module ID: Bytes 320-383 */
1638 	PRINT_NXS(320, spd->mmid_lsb, "Module MfgID Code LSB - JEP-106");
1639 	PRINT_NXS(321, spd->mmid_msb, "Module MfgID Code MSB - JEP-106");
1640 	PRINT_NXS(322, spd->mloc,     "Mfg Location");
1641 	PRINT_NNXXS(323, 324, spd->mdate[0], spd->mdate[1], "Mfg Date");
1642 
1643 	printf("%-3d-%3d: ", 325, 328);
1644 
1645 	for (i = 325; i <= 328; i++)
1646 		printf("%02x ", spd->sernum[i - 325]);
1647 	printf("   Module Serial Number\n");
1648 
1649 	printf("%-3d-%3d: ", 329, 348);
1650 	for (i = 329; i <= 348; i++)
1651 		printf("%02x ", spd->mpart[i - 329]);
1652 	printf("   Mfg's Module Part Number\n");
1653 
1654 	PRINT_NXS(349, spd->mrev, "Module Revision code");
1655 	PRINT_NXS(350, spd->dmid_lsb, "DRAM MfgID Code LSB - JEP-106");
1656 	PRINT_NXS(351, spd->dmid_msb, "DRAM MfgID Code MSB - JEP-106");
1657 	PRINT_NXS(352, spd->stepping, "DRAM stepping");
1658 
1659 	printf("%-3d-%3d: ", 353, 381);
1660 	for (i = 353; i <= 381; i++)
1661 		printf("%02x ", spd->msd[i - 353]);
1662 	printf("   Mfg's Specific Data\n");
1663 }
1664 #endif
1665 
1666 static inline void generic_spd_dump(const generic_spd_eeprom_t *spd)
1667 {
1668 #if defined(CONFIG_SYS_FSL_DDR1)
1669 	ddr1_spd_dump(spd);
1670 #elif defined(CONFIG_SYS_FSL_DDR2)
1671 	ddr2_spd_dump(spd);
1672 #elif defined(CONFIG_SYS_FSL_DDR3)
1673 	ddr3_spd_dump(spd);
1674 #elif defined(CONFIG_SYS_FSL_DDR4)
1675 	ddr4_spd_dump(spd);
1676 #endif
1677 }
1678 
1679 static void fsl_ddr_printinfo(const fsl_ddr_info_t *pinfo,
1680 			unsigned int ctrl_mask,
1681 			unsigned int dimm_mask,
1682 			unsigned int do_mask)
1683 {
1684 	unsigned int i, j, retval;
1685 
1686 	/* STEP 1:  DIMM SPD data */
1687 	if (do_mask & STEP_GET_SPD) {
1688 		for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1689 			if (!(ctrl_mask & (1 << i)))
1690 				continue;
1691 
1692 			for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
1693 				if (!(dimm_mask & (1 << j)))
1694 					continue;
1695 
1696 				printf("SPD info:  Controller=%u "
1697 						"DIMM=%u\n", i, j);
1698 				generic_spd_dump(
1699 					&(pinfo->spd_installed_dimms[i][j]));
1700 				printf("\n");
1701 			}
1702 			printf("\n");
1703 		}
1704 		printf("\n");
1705 	}
1706 
1707 	/* STEP 2:  DIMM Parameters */
1708 	if (do_mask & STEP_COMPUTE_DIMM_PARMS) {
1709 		for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1710 			if (!(ctrl_mask & (1 << i)))
1711 				continue;
1712 			for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
1713 				if (!(dimm_mask & (1 << j)))
1714 					continue;
1715 				printf("DIMM parameters:  Controller=%u "
1716 						"DIMM=%u\n", i, j);
1717 				print_dimm_parameters(
1718 					&(pinfo->dimm_params[i][j]));
1719 				printf("\n");
1720 			}
1721 			printf("\n");
1722 		}
1723 		printf("\n");
1724 	}
1725 
1726 	/* STEP 3:  Common Parameters */
1727 	if (do_mask & STEP_COMPUTE_COMMON_PARMS) {
1728 		for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1729 			if (!(ctrl_mask & (1 << i)))
1730 				continue;
1731 			printf("\"lowest common\" DIMM parameters:  "
1732 					"Controller=%u\n", i);
1733 			print_lowest_common_dimm_parameters(
1734 				&pinfo->common_timing_params[i]);
1735 			printf("\n");
1736 		}
1737 		printf("\n");
1738 	}
1739 
1740 	/* STEP 4:  User Configuration Options */
1741 	if (do_mask & STEP_GATHER_OPTS) {
1742 		for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1743 			if (!(ctrl_mask & (1 << i)))
1744 				continue;
1745 			printf("User Config Options: Controller=%u\n", i);
1746 			print_memctl_options(&pinfo->memctl_opts[i]);
1747 			printf("\n");
1748 		}
1749 		printf("\n");
1750 	}
1751 
1752 	/* STEP 5:  Address assignment */
1753 	if (do_mask & STEP_ASSIGN_ADDRESSES) {
1754 		for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1755 			if (!(ctrl_mask & (1 << i)))
1756 				continue;
1757 			for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
1758 				printf("Address Assignment: Controller=%u "
1759 						"DIMM=%u\n", i, j);
1760 				printf("Don't have this functionality yet\n");
1761 			}
1762 			printf("\n");
1763 		}
1764 		printf("\n");
1765 	}
1766 
1767 	/* STEP 6:  computed controller register values */
1768 	if (do_mask & STEP_COMPUTE_REGS) {
1769 		for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1770 			if (!(ctrl_mask & (1 << i)))
1771 				continue;
1772 			printf("Computed Register Values: Controller=%u\n", i);
1773 			print_fsl_memctl_config_regs(
1774 				&pinfo->fsl_ddr_config_reg[i]);
1775 			retval = check_fsl_memctl_config_regs(
1776 				&pinfo->fsl_ddr_config_reg[i]);
1777 			if (retval) {
1778 				printf("check_fsl_memctl_config_regs "
1779 					"result = %u\n", retval);
1780 			}
1781 			printf("\n");
1782 		}
1783 		printf("\n");
1784 	}
1785 }
1786 
1787 struct data_strings {
1788 	const char *data_name;
1789 	unsigned int step_mask;
1790 	unsigned int dimm_number_required;
1791 };
1792 
1793 #define DATA_OPTIONS(name, step, dimm) {#name, step, dimm}
1794 
1795 static unsigned int fsl_ddr_parse_interactive_cmd(
1796 	char **argv,
1797 	int argc,
1798 	unsigned int *pstep_mask,
1799 	unsigned int *pctlr_mask,
1800 	unsigned int *pdimm_mask,
1801 	unsigned int *pdimm_number_required
1802 	 ) {
1803 
1804 	static const struct data_strings options[] = {
1805 		DATA_OPTIONS(spd, STEP_GET_SPD, 1),
1806 		DATA_OPTIONS(dimmparms, STEP_COMPUTE_DIMM_PARMS, 1),
1807 		DATA_OPTIONS(commonparms, STEP_COMPUTE_COMMON_PARMS, 0),
1808 		DATA_OPTIONS(opts, STEP_GATHER_OPTS, 0),
1809 		DATA_OPTIONS(addresses, STEP_ASSIGN_ADDRESSES, 0),
1810 		DATA_OPTIONS(regs, STEP_COMPUTE_REGS, 0),
1811 	};
1812 	static const unsigned int n_opts = ARRAY_SIZE(options);
1813 
1814 	unsigned int i, j;
1815 	unsigned int error = 0;
1816 
1817 	for (i = 1; i < argc; i++) {
1818 		unsigned int matched = 0;
1819 
1820 		for (j = 0; j < n_opts; j++) {
1821 			if (strcmp(options[j].data_name, argv[i]) != 0)
1822 				continue;
1823 			*pstep_mask |= options[j].step_mask;
1824 			*pdimm_number_required =
1825 				options[j].dimm_number_required;
1826 			matched = 1;
1827 			break;
1828 		}
1829 
1830 		if (matched)
1831 			continue;
1832 
1833 		if (argv[i][0] == 'c') {
1834 			char c = argv[i][1];
1835 			if (isdigit(c))
1836 				*pctlr_mask |= 1 << (c - '0');
1837 			continue;
1838 		}
1839 
1840 		if (argv[i][0] == 'd') {
1841 			char c = argv[i][1];
1842 			if (isdigit(c))
1843 				*pdimm_mask |= 1 << (c - '0');
1844 			continue;
1845 		}
1846 
1847 		printf("unknown arg %s\n", argv[i]);
1848 		*pstep_mask = 0;
1849 		error = 1;
1850 		break;
1851 	}
1852 
1853 	return error;
1854 }
1855 
1856 int fsl_ddr_interactive_env_var_exists(void)
1857 {
1858 	char buffer[CONFIG_SYS_CBSIZE];
1859 
1860 	if (getenv_f("ddr_interactive", buffer, CONFIG_SYS_CBSIZE) >= 0)
1861 		return 1;
1862 
1863 	return 0;
1864 }
1865 
1866 unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo, int var_is_set)
1867 {
1868 	unsigned long long ddrsize;
1869 	const char *prompt = "FSL DDR>";
1870 	char buffer[CONFIG_SYS_CBSIZE];
1871 	char buffer2[CONFIG_SYS_CBSIZE];
1872 	char *p = NULL;
1873 	char *argv[CONFIG_SYS_MAXARGS + 1];	/* NULL terminated */
1874 	int argc;
1875 	unsigned int next_step = STEP_GET_SPD;
1876 	const char *usage = {
1877 		"commands:\n"
1878 		"print      print SPD and intermediate computed data\n"
1879 		"reset      reboot machine\n"
1880 		"recompute  reload SPD and options to default and recompute regs\n"
1881 		"edit       modify spd, parameter, or option\n"
1882 		"compute    recompute registers from current next_step to end\n"
1883 		"copy       copy parameters\n"
1884 		"next_step  shows current next_step\n"
1885 		"help       this message\n"
1886 		"go         program the memory controller and continue with u-boot\n"
1887 	};
1888 
1889 	if (var_is_set) {
1890 		if (getenv_f("ddr_interactive", buffer2, CONFIG_SYS_CBSIZE) > 0) {
1891 			p = buffer2;
1892 		} else {
1893 			var_is_set = 0;
1894 		}
1895 	}
1896 
1897 	/*
1898 	 * The strategy for next_step is that it points to the next
1899 	 * step in the computation process that needs to be done.
1900 	 */
1901 	while (1) {
1902 		if (var_is_set) {
1903 			char *pend = strchr(p, ';');
1904 			if (pend) {
1905 				/* found command separator, copy sub-command */
1906 				*pend = '\0';
1907 				strcpy(buffer, p);
1908 				p = pend + 1;
1909 			} else {
1910 				/* separator not found, copy whole string */
1911 				strcpy(buffer, p);
1912 				p = NULL;
1913 				var_is_set = 0;
1914 			}
1915 		} else {
1916 			/*
1917 			 * No need to worry for buffer overflow here in
1918 			 * this function;  cli_readline() maxes out at
1919 			 * CFG_CBSIZE
1920 			 */
1921 			cli_readline_into_buffer(prompt, buffer, 0);
1922 		}
1923 		argc = cli_simple_parse_line(buffer, argv);
1924 		if (argc == 0)
1925 			continue;
1926 
1927 
1928 		if (strcmp(argv[0], "help") == 0) {
1929 			puts(usage);
1930 			continue;
1931 		}
1932 
1933 		if (strcmp(argv[0], "next_step") == 0) {
1934 			printf("next_step = 0x%02X (%s)\n",
1935 			       next_step,
1936 			       step_to_string(next_step));
1937 			continue;
1938 		}
1939 
1940 		if (strcmp(argv[0], "copy") == 0) {
1941 			unsigned int error = 0;
1942 			unsigned int step_mask = 0;
1943 			unsigned int src_ctlr_mask = 0;
1944 			unsigned int src_dimm_mask = 0;
1945 			unsigned int dimm_number_required = 0;
1946 			unsigned int src_ctlr_num = 0;
1947 			unsigned int src_dimm_num = 0;
1948 			unsigned int dst_ctlr_num = -1;
1949 			unsigned int dst_dimm_num = -1;
1950 			unsigned int i, num_dest_parms;
1951 
1952 			if (argc == 1) {
1953 				printf("copy <src c#> <src d#> <spd|dimmparms|commonparms|opts|addresses|regs> <dst c#> <dst d#>\n");
1954 				continue;
1955 			}
1956 
1957 			error = fsl_ddr_parse_interactive_cmd(
1958 				argv, argc,
1959 				&step_mask,
1960 				&src_ctlr_mask,
1961 				&src_dimm_mask,
1962 				&dimm_number_required
1963 			);
1964 
1965 			/* XXX: only dimm_number_required and step_mask will
1966 			   be used by this function.  Parse the controller and
1967 			   DIMM number separately because it is easier.  */
1968 
1969 			if (error)
1970 				continue;
1971 
1972 			/* parse source destination controller / DIMM */
1973 
1974 			num_dest_parms = dimm_number_required ? 2 : 1;
1975 
1976 			for (i = 0; i < argc; i++) {
1977 				if (argv[i][0] == 'c') {
1978 					char c = argv[i][1];
1979 					if (isdigit(c)) {
1980 						src_ctlr_num = (c - '0');
1981 						break;
1982 					}
1983 				}
1984 			}
1985 
1986 			for (i = 0; i < argc; i++) {
1987 				if (argv[i][0] == 'd') {
1988 					char c = argv[i][1];
1989 					if (isdigit(c)) {
1990 						src_dimm_num = (c - '0');
1991 						break;
1992 					}
1993 				}
1994 			}
1995 
1996 			/* parse destination controller / DIMM */
1997 
1998 			for (i = argc - 1; i >= argc - num_dest_parms; i--) {
1999 				if (argv[i][0] == 'c') {
2000 					char c = argv[i][1];
2001 					if (isdigit(c)) {
2002 						dst_ctlr_num = (c - '0');
2003 						break;
2004 					}
2005 				}
2006 			}
2007 
2008 			for (i = argc - 1; i >= argc - num_dest_parms; i--) {
2009 				if (argv[i][0] == 'd') {
2010 					char c = argv[i][1];
2011 					if (isdigit(c)) {
2012 						dst_dimm_num = (c - '0');
2013 						break;
2014 					}
2015 				}
2016 			}
2017 
2018 			/* TODO: validate inputs */
2019 
2020 			debug("src_ctlr_num = %u, src_dimm_num = %u, dst_ctlr_num = %u, dst_dimm_num = %u, step_mask = %x\n",
2021 				src_ctlr_num, src_dimm_num, dst_ctlr_num, dst_dimm_num, step_mask);
2022 
2023 
2024 			switch (step_mask) {
2025 
2026 			case STEP_GET_SPD:
2027 				memcpy(&(pinfo->spd_installed_dimms[dst_ctlr_num][dst_dimm_num]),
2028 					&(pinfo->spd_installed_dimms[src_ctlr_num][src_dimm_num]),
2029 					sizeof(pinfo->spd_installed_dimms[0][0]));
2030 				break;
2031 
2032 			case STEP_COMPUTE_DIMM_PARMS:
2033 				memcpy(&(pinfo->dimm_params[dst_ctlr_num][dst_dimm_num]),
2034 					&(pinfo->dimm_params[src_ctlr_num][src_dimm_num]),
2035 					sizeof(pinfo->dimm_params[0][0]));
2036 				break;
2037 
2038 			case STEP_COMPUTE_COMMON_PARMS:
2039 				memcpy(&(pinfo->common_timing_params[dst_ctlr_num]),
2040 					&(pinfo->common_timing_params[src_ctlr_num]),
2041 					sizeof(pinfo->common_timing_params[0]));
2042 				break;
2043 
2044 			case STEP_GATHER_OPTS:
2045 				memcpy(&(pinfo->memctl_opts[dst_ctlr_num]),
2046 					&(pinfo->memctl_opts[src_ctlr_num]),
2047 					sizeof(pinfo->memctl_opts[0]));
2048 				break;
2049 
2050 			/* someday be able to have addresses to copy addresses... */
2051 
2052 			case STEP_COMPUTE_REGS:
2053 				memcpy(&(pinfo->fsl_ddr_config_reg[dst_ctlr_num]),
2054 					&(pinfo->fsl_ddr_config_reg[src_ctlr_num]),
2055 					sizeof(pinfo->memctl_opts[0]));
2056 				break;
2057 
2058 			default:
2059 				printf("unexpected step_mask value\n");
2060 			}
2061 
2062 			continue;
2063 
2064 		}
2065 
2066 		if (strcmp(argv[0], "edit") == 0) {
2067 			unsigned int error = 0;
2068 			unsigned int step_mask = 0;
2069 			unsigned int ctlr_mask = 0;
2070 			unsigned int dimm_mask = 0;
2071 			char *p_element = NULL;
2072 			char *p_value = NULL;
2073 			unsigned int dimm_number_required = 0;
2074 			unsigned int ctrl_num;
2075 			unsigned int dimm_num;
2076 
2077 			if (argc == 1) {
2078 				/* Only the element and value must be last */
2079 				printf("edit <c#> <d#> "
2080 					"<spd|dimmparms|commonparms|opts|"
2081 					"addresses|regs> <element> <value>\n");
2082 				printf("for spd, specify byte number for "
2083 					"element\n");
2084 				continue;
2085 			}
2086 
2087 			error = fsl_ddr_parse_interactive_cmd(
2088 				argv, argc - 2,
2089 				&step_mask,
2090 				&ctlr_mask,
2091 				&dimm_mask,
2092 				&dimm_number_required
2093 			);
2094 
2095 			if (error)
2096 				continue;
2097 
2098 
2099 			/* Check arguments */
2100 
2101 			/* ERROR: If no steps were found */
2102 			if (step_mask == 0) {
2103 				printf("Error: No valid steps were specified "
2104 						"in argument.\n");
2105 				continue;
2106 			}
2107 
2108 			/* ERROR: If multiple steps were found */
2109 			if (step_mask & (step_mask - 1)) {
2110 				printf("Error: Multiple steps specified in "
2111 						"argument.\n");
2112 				continue;
2113 			}
2114 
2115 			/* ERROR: Controller not specified */
2116 			if (ctlr_mask == 0) {
2117 				printf("Error: controller number not "
2118 					"specified or no element and "
2119 					"value specified\n");
2120 				continue;
2121 			}
2122 
2123 			if (ctlr_mask & (ctlr_mask - 1)) {
2124 				printf("Error: multiple controllers "
2125 						"specified, %X\n", ctlr_mask);
2126 				continue;
2127 			}
2128 
2129 			/* ERROR: DIMM number not specified */
2130 			if (dimm_number_required && dimm_mask == 0) {
2131 				printf("Error: DIMM number number not "
2132 					"specified or no element and "
2133 					"value specified\n");
2134 				continue;
2135 			}
2136 
2137 			if (dimm_mask & (dimm_mask - 1)) {
2138 				printf("Error: multipled DIMMs specified\n");
2139 				continue;
2140 			}
2141 
2142 			p_element = argv[argc - 2];
2143 			p_value = argv[argc - 1];
2144 
2145 			ctrl_num = __ilog2(ctlr_mask);
2146 			dimm_num = __ilog2(dimm_mask);
2147 
2148 			switch (step_mask) {
2149 			case STEP_GET_SPD:
2150 				{
2151 					unsigned int element_num;
2152 					unsigned int value;
2153 
2154 					element_num = simple_strtoul(p_element,
2155 								     NULL, 0);
2156 					value = simple_strtoul(p_value,
2157 							       NULL, 0);
2158 					fsl_ddr_spd_edit(pinfo,
2159 							       ctrl_num,
2160 							       dimm_num,
2161 							       element_num,
2162 							       value);
2163 					next_step = STEP_COMPUTE_DIMM_PARMS;
2164 				}
2165 				break;
2166 
2167 			case STEP_COMPUTE_DIMM_PARMS:
2168 				fsl_ddr_dimm_parameters_edit(
2169 						 pinfo, ctrl_num, dimm_num,
2170 						 p_element, p_value);
2171 				next_step = STEP_COMPUTE_COMMON_PARMS;
2172 				break;
2173 
2174 			case STEP_COMPUTE_COMMON_PARMS:
2175 				lowest_common_dimm_parameters_edit(pinfo,
2176 						ctrl_num, p_element, p_value);
2177 				next_step = STEP_GATHER_OPTS;
2178 				break;
2179 
2180 			case STEP_GATHER_OPTS:
2181 				fsl_ddr_options_edit(pinfo, ctrl_num,
2182 							   p_element, p_value);
2183 				next_step = STEP_ASSIGN_ADDRESSES;
2184 				break;
2185 
2186 			case STEP_ASSIGN_ADDRESSES:
2187 				printf("editing of address assignment "
2188 						"not yet implemented\n");
2189 				break;
2190 
2191 			case STEP_COMPUTE_REGS:
2192 				{
2193 					fsl_ddr_regs_edit(pinfo,
2194 								ctrl_num,
2195 								p_element,
2196 								p_value);
2197 					next_step = STEP_PROGRAM_REGS;
2198 				}
2199 				break;
2200 
2201 			default:
2202 				printf("programming error\n");
2203 				while (1)
2204 					;
2205 				break;
2206 			}
2207 			continue;
2208 		}
2209 
2210 		if (strcmp(argv[0], "reset") == 0) {
2211 			/*
2212 			 * Reboot machine.
2213 			 * Args don't seem to matter because this
2214 			 * doesn't return
2215 			 */
2216 			do_reset(NULL, 0, 0, NULL);
2217 			printf("Reset didn't work\n");
2218 		}
2219 
2220 		if (strcmp(argv[0], "recompute") == 0) {
2221 			/*
2222 			 * Recalculate everything, starting with
2223 			 * loading SPD EEPROM from DIMMs
2224 			 */
2225 			next_step = STEP_GET_SPD;
2226 			ddrsize = fsl_ddr_compute(pinfo, next_step, 0);
2227 			continue;
2228 		}
2229 
2230 		if (strcmp(argv[0], "compute") == 0) {
2231 			/*
2232 			 * Compute rest of steps starting at
2233 			 * the current next_step/
2234 			 */
2235 			ddrsize = fsl_ddr_compute(pinfo, next_step, 0);
2236 			continue;
2237 		}
2238 
2239 		if (strcmp(argv[0], "print") == 0) {
2240 			unsigned int error = 0;
2241 			unsigned int step_mask = 0;
2242 			unsigned int ctlr_mask = 0;
2243 			unsigned int dimm_mask = 0;
2244 			unsigned int dimm_number_required = 0;
2245 
2246 			if (argc == 1) {
2247 				printf("print [c<n>] [d<n>] [spd] [dimmparms] "
2248 				  "[commonparms] [opts] [addresses] [regs]\n");
2249 				continue;
2250 			}
2251 
2252 			error = fsl_ddr_parse_interactive_cmd(
2253 				argv, argc,
2254 				&step_mask,
2255 				&ctlr_mask,
2256 				&dimm_mask,
2257 				&dimm_number_required
2258 			);
2259 
2260 			if (error)
2261 				continue;
2262 
2263 			/* If no particular controller was found, print all */
2264 			if (ctlr_mask == 0)
2265 				ctlr_mask = 0xFF;
2266 
2267 			/* If no particular dimm was found, print all dimms. */
2268 			if (dimm_mask == 0)
2269 				dimm_mask = 0xFF;
2270 
2271 			/* If no steps were found, print all steps. */
2272 			if (step_mask == 0)
2273 				step_mask = STEP_ALL;
2274 
2275 			fsl_ddr_printinfo(pinfo, ctlr_mask,
2276 						dimm_mask, step_mask);
2277 			continue;
2278 		}
2279 
2280 		if (strcmp(argv[0], "go") == 0) {
2281 			if (next_step)
2282 				ddrsize = fsl_ddr_compute(pinfo, next_step, 0);
2283 			break;
2284 		}
2285 
2286 		printf("unknown command %s\n", argv[0]);
2287 	}
2288 
2289 	debug("end of memory = %llu\n", (u64)ddrsize);
2290 
2291 	return ddrsize;
2292 }
2293