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