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