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