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