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