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