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