uboot/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c
<<
>>
Prefs
   1/*
   2 * Copyright 2010-2012 Freescale Semiconductor, Inc.
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public License
   6 * Version 2 or any later versionas published by the Free Software Foundation.
   7 */
   8
   9/*
  10 * Generic driver for Freescale DDR/DDR2/DDR3 memory controller.
  11 * Based on code from spd_sdram.c
  12 * Author: James Yang [at freescale.com]
  13 *         York Sun [at freescale.com]
  14 */
  15
  16#include <common.h>
  17#include <linux/ctype.h>
  18#include <asm/types.h>
  19
  20#include <asm/fsl_ddr_sdram.h>
  21#include "ddr.h"
  22
  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[] = {
 155                COMMON_TIMING(tCKmin_X_ps),
 156                COMMON_TIMING(tCKmax_ps),
 157                COMMON_TIMING(tCKmax_max_ps),
 158                COMMON_TIMING(tRCD_ps),
 159                COMMON_TIMING(tRP_ps),
 160                COMMON_TIMING(tRAS_ps),
 161                COMMON_TIMING(tWR_ps),
 162                COMMON_TIMING(tWTR_ps),
 163                COMMON_TIMING(tRFC_ps),
 164                COMMON_TIMING(tRRD_ps),
 165                COMMON_TIMING(tRC_ps),
 166                COMMON_TIMING(refresh_rate_ps),
 167                COMMON_TIMING(tIS_ps),
 168                COMMON_TIMING(tIH_ps),
 169                COMMON_TIMING(tDS_ps),
 170                COMMON_TIMING(tDH_ps),
 171                COMMON_TIMING(tRTP_ps),
 172                COMMON_TIMING(tDQSQ_max_ps),
 173                COMMON_TIMING(tQHS_ps),
 174                COMMON_TIMING(ndimms_present),
 175                COMMON_TIMING(lowest_common_SPD_caslat),
 176                COMMON_TIMING(highest_common_derated_caslat),
 177                COMMON_TIMING(additive_latency),
 178                COMMON_TIMING(all_DIMMs_burst_lengths_bitmask),
 179                COMMON_TIMING(all_DIMMs_registered),
 180                COMMON_TIMING(all_DIMMs_unbuffered),
 181                COMMON_TIMING(all_DIMMs_ECC_capable),
 182                COMMON_TIMING(total_mem),
 183                COMMON_TIMING(base_address),
 184        };
 185        static const unsigned int n_opts = ARRAY_SIZE(options);
 186
 187        if (handle_option_table(options, n_opts, p, optname_str, value_str))
 188                return;
 189
 190        printf("Error: couldn't find option string %s\n", optname_str);
 191}
 192
 193#define DIMM_PARM(x) {#x, offsetof(dimm_params_t, x), \
 194        sizeof((dimm_params_t *)0)->x, 0}
 195
 196static void fsl_ddr_dimm_parameters_edit(fsl_ddr_info_t *pinfo,
 197                                   unsigned int ctrl_num,
 198                                   unsigned int dimm_num,
 199                                   const char *optname_str,
 200                                   const char *value_str)
 201{
 202        dimm_params_t *p = &(pinfo->dimm_params[ctrl_num][dimm_num]);
 203
 204        static const struct options_string options[] = {
 205                DIMM_PARM(n_ranks),
 206                DIMM_PARM(data_width),
 207                DIMM_PARM(primary_sdram_width),
 208                DIMM_PARM(ec_sdram_width),
 209                DIMM_PARM(registered_dimm),
 210
 211                DIMM_PARM(n_row_addr),
 212                DIMM_PARM(n_col_addr),
 213                DIMM_PARM(edc_config),
 214                DIMM_PARM(n_banks_per_sdram_device),
 215                DIMM_PARM(burst_lengths_bitmask),
 216                DIMM_PARM(row_density),
 217
 218                DIMM_PARM(tCKmin_X_ps),
 219                DIMM_PARM(tCKmin_X_minus_1_ps),
 220                DIMM_PARM(tCKmin_X_minus_2_ps),
 221                DIMM_PARM(tCKmax_ps),
 222
 223                DIMM_PARM(caslat_X),
 224                DIMM_PARM(caslat_X_minus_1),
 225                DIMM_PARM(caslat_X_minus_2),
 226
 227                DIMM_PARM(caslat_lowest_derated),
 228
 229                DIMM_PARM(tRCD_ps),
 230                DIMM_PARM(tRP_ps),
 231                DIMM_PARM(tRAS_ps),
 232                DIMM_PARM(tWR_ps),
 233                DIMM_PARM(tWTR_ps),
 234                DIMM_PARM(tRFC_ps),
 235                DIMM_PARM(tRRD_ps),
 236                DIMM_PARM(tRC_ps),
 237                DIMM_PARM(refresh_rate_ps),
 238
 239                DIMM_PARM(tIS_ps),
 240                DIMM_PARM(tIH_ps),
 241                DIMM_PARM(tDS_ps),
 242                DIMM_PARM(tDH_ps),
 243                DIMM_PARM(tRTP_ps),
 244                DIMM_PARM(tDQSQ_max_ps),
 245                DIMM_PARM(tQHS_ps),
 246
 247                DIMM_PARM(rank_density),
 248                DIMM_PARM(capacity),
 249                DIMM_PARM(base_address),
 250        };
 251
 252        static const unsigned int n_opts = ARRAY_SIZE(options);
 253
 254        if (handle_option_table(options, n_opts, p, optname_str, value_str))
 255                return;
 256
 257        printf("couldn't find option string %s\n", optname_str);
 258}
 259
 260static void print_dimm_parameters(const dimm_params_t *pdimm)
 261{
 262        static const struct options_string options[] = {
 263                DIMM_PARM(n_ranks),
 264                DIMM_PARM(data_width),
 265                DIMM_PARM(primary_sdram_width),
 266                DIMM_PARM(ec_sdram_width),
 267                DIMM_PARM(registered_dimm),
 268
 269                DIMM_PARM(n_row_addr),
 270                DIMM_PARM(n_col_addr),
 271                DIMM_PARM(edc_config),
 272                DIMM_PARM(n_banks_per_sdram_device),
 273
 274                DIMM_PARM(tCKmin_X_ps),
 275                DIMM_PARM(tCKmin_X_minus_1_ps),
 276                DIMM_PARM(tCKmin_X_minus_2_ps),
 277                DIMM_PARM(tCKmax_ps),
 278
 279                DIMM_PARM(caslat_X),
 280                DIMM_PARM(tAA_ps),
 281                DIMM_PARM(caslat_X_minus_1),
 282                DIMM_PARM(caslat_X_minus_2),
 283                DIMM_PARM(caslat_lowest_derated),
 284
 285                DIMM_PARM(tRCD_ps),
 286                DIMM_PARM(tRP_ps),
 287                DIMM_PARM(tRAS_ps),
 288                DIMM_PARM(tWR_ps),
 289                DIMM_PARM(tWTR_ps),
 290                DIMM_PARM(tRFC_ps),
 291                DIMM_PARM(tRRD_ps),
 292                DIMM_PARM(tRC_ps),
 293                DIMM_PARM(refresh_rate_ps),
 294
 295                DIMM_PARM(tIS_ps),
 296                DIMM_PARM(tIH_ps),
 297                DIMM_PARM(tDS_ps),
 298                DIMM_PARM(tDH_ps),
 299                DIMM_PARM(tRTP_ps),
 300                DIMM_PARM(tDQSQ_max_ps),
 301                DIMM_PARM(tQHS_ps),
 302        };
 303        static const unsigned int n_opts = ARRAY_SIZE(options);
 304
 305        if (pdimm->n_ranks == 0) {
 306                printf("DIMM not present\n");
 307                return;
 308        }
 309        printf("DIMM organization parameters:\n");
 310        printf("module part name = %s\n", pdimm->mpart);
 311        printf("rank_density = %llu bytes (%llu megabytes)\n",
 312               pdimm->rank_density, pdimm->rank_density / 0x100000);
 313        printf("capacity = %llu bytes (%llu megabytes)\n",
 314               pdimm->capacity, pdimm->capacity / 0x100000);
 315        printf("burst_lengths_bitmask = %02X\n",
 316               pdimm->burst_lengths_bitmask);
 317        printf("base_addresss = %llu (%08llX %08llX)\n",
 318               pdimm->base_address,
 319               (pdimm->base_address >> 32),
 320               pdimm->base_address & 0xFFFFFFFF);
 321        print_option_table(options, n_opts, pdimm);
 322}
 323
 324static void print_lowest_common_dimm_parameters(
 325                const common_timing_params_t *plcd_dimm_params)
 326{
 327        static const struct options_string options[] = {
 328                COMMON_TIMING(tCKmax_max_ps),
 329                COMMON_TIMING(tRCD_ps),
 330                COMMON_TIMING(tRP_ps),
 331                COMMON_TIMING(tRAS_ps),
 332                COMMON_TIMING(tWR_ps),
 333                COMMON_TIMING(tWTR_ps),
 334                COMMON_TIMING(tRFC_ps),
 335                COMMON_TIMING(tRRD_ps),
 336                COMMON_TIMING(tRC_ps),
 337                COMMON_TIMING(refresh_rate_ps),
 338                COMMON_TIMING(tIS_ps),
 339                COMMON_TIMING(tDS_ps),
 340                COMMON_TIMING(tDH_ps),
 341                COMMON_TIMING(tRTP_ps),
 342                COMMON_TIMING(tDQSQ_max_ps),
 343                COMMON_TIMING(tQHS_ps),
 344                COMMON_TIMING(lowest_common_SPD_caslat),
 345                COMMON_TIMING(highest_common_derated_caslat),
 346                COMMON_TIMING(additive_latency),
 347                COMMON_TIMING(ndimms_present),
 348                COMMON_TIMING(all_DIMMs_registered),
 349                COMMON_TIMING(all_DIMMs_unbuffered),
 350                COMMON_TIMING(all_DIMMs_ECC_capable),
 351        };
 352        static const unsigned int n_opts = ARRAY_SIZE(options);
 353
 354        /* Clock frequencies */
 355        printf("tCKmin_X_ps = %u (%u MHz)\n",
 356               plcd_dimm_params->tCKmin_X_ps,
 357               picos_to_mhz(plcd_dimm_params->tCKmin_X_ps));
 358        printf("tCKmax_ps = %u (%u MHz)\n",
 359               plcd_dimm_params->tCKmax_ps,
 360               picos_to_mhz(plcd_dimm_params->tCKmax_ps));
 361        printf("all_DIMMs_burst_lengths_bitmask = %02X\n",
 362               plcd_dimm_params->all_DIMMs_burst_lengths_bitmask);
 363
 364        print_option_table(options, n_opts, plcd_dimm_params);
 365
 366        printf("total_mem = %llu (%llu megabytes)\n",
 367               plcd_dimm_params->total_mem,
 368               plcd_dimm_params->total_mem / 0x100000);
 369        printf("base_address = %llu (%llu megabytes)\n",
 370               plcd_dimm_params->base_address,
 371               plcd_dimm_params->base_address / 0x100000);
 372}
 373
 374#define CTRL_OPTIONS(x) {#x, offsetof(memctl_options_t, x), \
 375        sizeof((memctl_options_t *)0)->x, 0}
 376#define CTRL_OPTIONS_CS(x, y) {"cs" #x "_" #y, \
 377        offsetof(memctl_options_t, cs_local_opts[x].y), \
 378        sizeof((memctl_options_t *)0)->cs_local_opts[x].y, 0}
 379
 380static void fsl_ddr_options_edit(fsl_ddr_info_t *pinfo,
 381                           unsigned int ctl_num,
 382                           const char *optname_str,
 383                           const char *value_str)
 384{
 385        memctl_options_t *p = &(pinfo->memctl_opts[ctl_num]);
 386        /*
 387         * This array all on the stack and *computed* each time this
 388         * function is rung.
 389         */
 390        static const struct options_string options[] = {
 391                CTRL_OPTIONS_CS(0, odt_rd_cfg),
 392                CTRL_OPTIONS_CS(0, odt_wr_cfg),
 393#if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
 394                CTRL_OPTIONS_CS(1, odt_rd_cfg),
 395                CTRL_OPTIONS_CS(1, odt_wr_cfg),
 396#endif
 397#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 398                CTRL_OPTIONS_CS(2, odt_rd_cfg),
 399                CTRL_OPTIONS_CS(2, odt_wr_cfg),
 400#endif
 401#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 402                CTRL_OPTIONS_CS(3, odt_rd_cfg),
 403                CTRL_OPTIONS_CS(3, odt_wr_cfg),
 404#endif
 405#if defined(CONFIG_FSL_DDR3)
 406                CTRL_OPTIONS_CS(0, odt_rtt_norm),
 407                CTRL_OPTIONS_CS(0, odt_rtt_wr),
 408#if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
 409                CTRL_OPTIONS_CS(1, odt_rtt_norm),
 410                CTRL_OPTIONS_CS(1, odt_rtt_wr),
 411#endif
 412#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 413                CTRL_OPTIONS_CS(2, odt_rtt_norm),
 414                CTRL_OPTIONS_CS(2, odt_rtt_wr),
 415#endif
 416#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 417                CTRL_OPTIONS_CS(3, odt_rtt_norm),
 418                CTRL_OPTIONS_CS(3, odt_rtt_wr),
 419#endif
 420#endif
 421                CTRL_OPTIONS(memctl_interleaving),
 422                CTRL_OPTIONS(memctl_interleaving_mode),
 423                CTRL_OPTIONS(ba_intlv_ctl),
 424                CTRL_OPTIONS(ECC_mode),
 425                CTRL_OPTIONS(ECC_init_using_memctl),
 426                CTRL_OPTIONS(DQS_config),
 427                CTRL_OPTIONS(self_refresh_in_sleep),
 428                CTRL_OPTIONS(dynamic_power),
 429                CTRL_OPTIONS(data_bus_width),
 430                CTRL_OPTIONS(burst_length),
 431                CTRL_OPTIONS(cas_latency_override),
 432                CTRL_OPTIONS(cas_latency_override_value),
 433                CTRL_OPTIONS(use_derated_caslat),
 434                CTRL_OPTIONS(additive_latency_override),
 435                CTRL_OPTIONS(additive_latency_override_value),
 436                CTRL_OPTIONS(clk_adjust),
 437                CTRL_OPTIONS(cpo_override),
 438                CTRL_OPTIONS(write_data_delay),
 439                CTRL_OPTIONS(half_strength_driver_enable),
 440
 441                /*
 442                 * These can probably be changed to 2T_EN and 3T_EN
 443                 * (using a leading numerical character) without problem
 444                 */
 445                CTRL_OPTIONS(twoT_en),
 446                CTRL_OPTIONS(threeT_en),
 447                CTRL_OPTIONS(ap_en),
 448                CTRL_OPTIONS(bstopre),
 449                CTRL_OPTIONS(wrlvl_override),
 450                CTRL_OPTIONS(wrlvl_sample),
 451                CTRL_OPTIONS(wrlvl_start),
 452                CTRL_OPTIONS(rcw_override),
 453                CTRL_OPTIONS(rcw_1),
 454                CTRL_OPTIONS(rcw_2),
 455                CTRL_OPTIONS(ddr_cdr1),
 456                CTRL_OPTIONS(ddr_cdr2),
 457                CTRL_OPTIONS(tCKE_clock_pulse_width_ps),
 458                CTRL_OPTIONS(tFAW_window_four_activates_ps),
 459                CTRL_OPTIONS(trwt_override),
 460                CTRL_OPTIONS(trwt),
 461        };
 462
 463        static const unsigned int n_opts = ARRAY_SIZE(options);
 464
 465        if (handle_option_table(options, n_opts, p,
 466                                        optname_str, value_str))
 467                return;
 468
 469        printf("couldn't find option string %s\n", optname_str);
 470}
 471
 472#define CFG_REGS(x) {#x, offsetof(fsl_ddr_cfg_regs_t, x), \
 473        sizeof((fsl_ddr_cfg_regs_t *)0)->x, 1}
 474#define CFG_REGS_CS(x, y) {"cs" #x "_" #y, \
 475        offsetof(fsl_ddr_cfg_regs_t, cs[x].y), \
 476        sizeof((fsl_ddr_cfg_regs_t *)0)->cs[x].y, 1}
 477
 478static void print_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr)
 479{
 480        unsigned int i;
 481        static const struct options_string options[] = {
 482                CFG_REGS_CS(0, bnds),
 483                CFG_REGS_CS(0, config),
 484                CFG_REGS_CS(0, config_2),
 485#if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
 486                CFG_REGS_CS(1, bnds),
 487                CFG_REGS_CS(1, config),
 488                CFG_REGS_CS(1, config_2),
 489#endif
 490#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 491                CFG_REGS_CS(2, bnds),
 492                CFG_REGS_CS(2, config),
 493                CFG_REGS_CS(2, config_2),
 494#endif
 495#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 496                CFG_REGS_CS(3, bnds),
 497                CFG_REGS_CS(3, config),
 498                CFG_REGS_CS(3, config_2),
 499#endif
 500                CFG_REGS(timing_cfg_3),
 501                CFG_REGS(timing_cfg_0),
 502                CFG_REGS(timing_cfg_1),
 503                CFG_REGS(timing_cfg_2),
 504                CFG_REGS(ddr_sdram_cfg),
 505                CFG_REGS(ddr_sdram_cfg_2),
 506                CFG_REGS(ddr_sdram_mode),
 507                CFG_REGS(ddr_sdram_mode_2),
 508                CFG_REGS(ddr_sdram_mode_3),
 509                CFG_REGS(ddr_sdram_mode_4),
 510                CFG_REGS(ddr_sdram_mode_5),
 511                CFG_REGS(ddr_sdram_mode_6),
 512                CFG_REGS(ddr_sdram_mode_7),
 513                CFG_REGS(ddr_sdram_mode_8),
 514                CFG_REGS(ddr_sdram_interval),
 515                CFG_REGS(ddr_data_init),
 516                CFG_REGS(ddr_sdram_clk_cntl),
 517                CFG_REGS(ddr_init_addr),
 518                CFG_REGS(ddr_init_ext_addr),
 519                CFG_REGS(timing_cfg_4),
 520                CFG_REGS(timing_cfg_5),
 521                CFG_REGS(ddr_zq_cntl),
 522                CFG_REGS(ddr_wrlvl_cntl),
 523                CFG_REGS(ddr_wrlvl_cntl_2),
 524                CFG_REGS(ddr_wrlvl_cntl_3),
 525                CFG_REGS(ddr_sr_cntr),
 526                CFG_REGS(ddr_sdram_rcw_1),
 527                CFG_REGS(ddr_sdram_rcw_2),
 528                CFG_REGS(ddr_cdr1),
 529                CFG_REGS(ddr_cdr2),
 530                CFG_REGS(err_disable),
 531                CFG_REGS(err_int_en),
 532                CFG_REGS(ddr_eor),
 533        };
 534        static const unsigned int n_opts = ARRAY_SIZE(options);
 535
 536        print_option_table(options, n_opts, ddr);
 537
 538        for (i = 0; i < 32; i++)
 539                printf("debug_%02d = 0x%08X\n", i+1, ddr->debug[i]);
 540}
 541
 542static void fsl_ddr_regs_edit(fsl_ddr_info_t *pinfo,
 543                        unsigned int ctrl_num,
 544                        const char *regname,
 545                        const char *value_str)
 546{
 547        unsigned int i;
 548        fsl_ddr_cfg_regs_t *ddr;
 549        char buf[20];
 550        static const struct options_string options[] = {
 551                CFG_REGS_CS(0, bnds),
 552                CFG_REGS_CS(0, config),
 553                CFG_REGS_CS(0, config_2),
 554#if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
 555                CFG_REGS_CS(1, bnds),
 556                CFG_REGS_CS(1, config),
 557                CFG_REGS_CS(1, config_2),
 558#endif
 559#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 560                CFG_REGS_CS(2, bnds),
 561                CFG_REGS_CS(2, config),
 562                CFG_REGS_CS(2, config_2),
 563#endif
 564#if (CONFIG_CHIP_SELECTS_PER_CTRL > 3)
 565                CFG_REGS_CS(3, bnds),
 566                CFG_REGS_CS(3, config),
 567                CFG_REGS_CS(3, config_2),
 568#endif
 569                CFG_REGS(timing_cfg_3),
 570                CFG_REGS(timing_cfg_0),
 571                CFG_REGS(timing_cfg_1),
 572                CFG_REGS(timing_cfg_2),
 573                CFG_REGS(ddr_sdram_cfg),
 574                CFG_REGS(ddr_sdram_cfg_2),
 575                CFG_REGS(ddr_sdram_mode),
 576                CFG_REGS(ddr_sdram_mode_2),
 577                CFG_REGS(ddr_sdram_mode_3),
 578                CFG_REGS(ddr_sdram_mode_4),
 579                CFG_REGS(ddr_sdram_mode_5),
 580                CFG_REGS(ddr_sdram_mode_6),
 581                CFG_REGS(ddr_sdram_mode_7),
 582                CFG_REGS(ddr_sdram_mode_8),
 583                CFG_REGS(ddr_sdram_interval),
 584                CFG_REGS(ddr_data_init),
 585                CFG_REGS(ddr_sdram_clk_cntl),
 586                CFG_REGS(ddr_init_addr),
 587                CFG_REGS(ddr_init_ext_addr),
 588                CFG_REGS(timing_cfg_4),
 589                CFG_REGS(timing_cfg_5),
 590                CFG_REGS(ddr_zq_cntl),
 591                CFG_REGS(ddr_wrlvl_cntl),
 592                CFG_REGS(ddr_wrlvl_cntl_2),
 593                CFG_REGS(ddr_wrlvl_cntl_3),
 594                CFG_REGS(ddr_sr_cntr),
 595                CFG_REGS(ddr_sdram_rcw_1),
 596                CFG_REGS(ddr_sdram_rcw_2),
 597                CFG_REGS(ddr_cdr1),
 598                CFG_REGS(ddr_cdr2),
 599                CFG_REGS(err_disable),
 600                CFG_REGS(err_int_en),
 601                CFG_REGS(ddr_sdram_rcw_2),
 602                CFG_REGS(ddr_sdram_rcw_2),
 603                CFG_REGS(ddr_eor),
 604        };
 605        static const unsigned int n_opts = ARRAY_SIZE(options);
 606
 607        debug("fsl_ddr_regs_edit: ctrl_num = %u, "
 608                "regname = %s, value = %s\n",
 609                ctrl_num, regname, value_str);
 610        if (ctrl_num > CONFIG_NUM_DDR_CONTROLLERS)
 611                return;
 612
 613        ddr = &(pinfo->fsl_ddr_config_reg[ctrl_num]);
 614
 615        if (handle_option_table(options, n_opts, ddr, regname, value_str))
 616                return;
 617
 618        for (i = 0; i < 32; i++) {
 619                unsigned int value = simple_strtoul(value_str, NULL, 0);
 620                sprintf(buf, "debug_%u", i + 1);
 621                if (strcmp(buf, regname) == 0) {
 622                        ddr->debug[i] = value;
 623                        return;
 624                }
 625        }
 626        printf("Error: couldn't find register string %s\n", regname);
 627}
 628
 629#define CTRL_OPTIONS_HEX(x) {#x, offsetof(memctl_options_t, x), \
 630        sizeof((memctl_options_t *)0)->x, 1}
 631
 632static void print_memctl_options(const memctl_options_t *popts)
 633{
 634        static const struct options_string options[] = {
 635                CTRL_OPTIONS_CS(0, odt_rd_cfg),
 636                CTRL_OPTIONS_CS(0, odt_wr_cfg),
 637#if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
 638                CTRL_OPTIONS_CS(1, odt_rd_cfg),
 639                CTRL_OPTIONS_CS(1, odt_wr_cfg),
 640#endif
 641#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 642                CTRL_OPTIONS_CS(2, odt_rd_cfg),
 643                CTRL_OPTIONS_CS(2, odt_wr_cfg),
 644#endif
 645#if (CONFIG_CHIP_SELECTS_PER_CTRL > 3)
 646                CTRL_OPTIONS_CS(3, odt_rd_cfg),
 647                CTRL_OPTIONS_CS(3, odt_wr_cfg),
 648#endif
 649#if defined(CONFIG_FSL_DDR3)
 650                CTRL_OPTIONS_CS(0, odt_rtt_norm),
 651                CTRL_OPTIONS_CS(0, odt_rtt_wr),
 652#if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
 653                CTRL_OPTIONS_CS(1, odt_rtt_norm),
 654                CTRL_OPTIONS_CS(1, odt_rtt_wr),
 655#endif
 656#if (CONFIG_CHIP_SELECTS_PER_CTRL > 2)
 657                CTRL_OPTIONS_CS(2, odt_rtt_norm),
 658                CTRL_OPTIONS_CS(2, odt_rtt_wr),
 659#endif
 660#if (CONFIG_CHIP_SELECTS_PER_CTRL > 3)
 661                CTRL_OPTIONS_CS(3, odt_rtt_norm),
 662                CTRL_OPTIONS_CS(3, odt_rtt_wr),
 663#endif
 664#endif
 665                CTRL_OPTIONS(memctl_interleaving),
 666                CTRL_OPTIONS(memctl_interleaving_mode),
 667                CTRL_OPTIONS_HEX(ba_intlv_ctl),
 668                CTRL_OPTIONS(ECC_mode),
 669                CTRL_OPTIONS(ECC_init_using_memctl),
 670                CTRL_OPTIONS(DQS_config),
 671                CTRL_OPTIONS(self_refresh_in_sleep),
 672                CTRL_OPTIONS(dynamic_power),
 673                CTRL_OPTIONS(data_bus_width),
 674                CTRL_OPTIONS(burst_length),
 675                CTRL_OPTIONS(cas_latency_override),
 676                CTRL_OPTIONS(cas_latency_override_value),
 677                CTRL_OPTIONS(use_derated_caslat),
 678                CTRL_OPTIONS(additive_latency_override),
 679                CTRL_OPTIONS(additive_latency_override_value),
 680                CTRL_OPTIONS(clk_adjust),
 681                CTRL_OPTIONS(cpo_override),
 682                CTRL_OPTIONS(write_data_delay),
 683                CTRL_OPTIONS(half_strength_driver_enable),
 684                /*
 685                 * These can probably be changed to 2T_EN and 3T_EN
 686                 * (using a leading numerical character) without problem
 687                 */
 688                CTRL_OPTIONS(twoT_en),
 689                CTRL_OPTIONS(threeT_en),
 690                CTRL_OPTIONS(registered_dimm_en),
 691                CTRL_OPTIONS(ap_en),
 692                CTRL_OPTIONS(bstopre),
 693                CTRL_OPTIONS(wrlvl_override),
 694                CTRL_OPTIONS(wrlvl_sample),
 695                CTRL_OPTIONS(wrlvl_start),
 696                CTRL_OPTIONS(rcw_override),
 697                CTRL_OPTIONS(rcw_1),
 698                CTRL_OPTIONS(rcw_2),
 699                CTRL_OPTIONS_HEX(ddr_cdr1),
 700                CTRL_OPTIONS_HEX(ddr_cdr2),
 701                CTRL_OPTIONS(tCKE_clock_pulse_width_ps),
 702                CTRL_OPTIONS(tFAW_window_four_activates_ps),
 703                CTRL_OPTIONS(trwt_override),
 704                CTRL_OPTIONS(trwt),
 705        };
 706        static const unsigned int n_opts = ARRAY_SIZE(options);
 707
 708        print_option_table(options, n_opts, popts);
 709}
 710
 711#ifdef CONFIG_FSL_DDR1
 712void ddr1_spd_dump(const ddr1_spd_eeprom_t *spd)
 713{
 714        unsigned int i;
 715
 716        printf("%-3d    : %02x %s\n", 0, spd->info_size,
 717               " spd->info_size,   *  0 # bytes written into serial memory *");
 718        printf("%-3d    : %02x %s\n", 1, spd->chip_size,
 719               " spd->chip_size,   *  1 Total # bytes of SPD memory device *");
 720        printf("%-3d    : %02x %s\n", 2, spd->mem_type,
 721               " spd->mem_type,    *  2 Fundamental memory type *");
 722        printf("%-3d    : %02x %s\n", 3, spd->nrow_addr,
 723               " spd->nrow_addr,   *  3 # of Row Addresses on this assembly *");
 724        printf("%-3d    : %02x %s\n", 4, spd->ncol_addr,
 725               " spd->ncol_addr,   *  4 # of Column Addrs on this assembly *");
 726        printf("%-3d    : %02x %s\n", 5, spd->nrows,
 727               " spd->nrows        *  5 # of DIMM Banks *");
 728        printf("%-3d    : %02x %s\n", 6, spd->dataw_lsb,
 729               " spd->dataw_lsb,   *  6 Data Width lsb of this assembly *");
 730        printf("%-3d    : %02x %s\n", 7, spd->dataw_msb,
 731               " spd->dataw_msb,   *  7 Data Width msb of this assembly *");
 732        printf("%-3d    : %02x %s\n", 8, spd->voltage,
 733               " spd->voltage,     *  8 Voltage intf std of this assembly *");
 734        printf("%-3d    : %02x %s\n", 9, spd->clk_cycle,
 735               " spd->clk_cycle,   *  9 SDRAM Cycle time at CL=X *");
 736        printf("%-3d    : %02x %s\n", 10, spd->clk_access,
 737               " spd->clk_access,  * 10 SDRAM Access from Clock at CL=X *");
 738        printf("%-3d    : %02x %s\n", 11, spd->config,
 739               " spd->config,      * 11 DIMM Configuration type *");
 740        printf("%-3d    : %02x %s\n", 12, spd->refresh,
 741               " spd->refresh,     * 12 Refresh Rate/Type *");
 742        printf("%-3d    : %02x %s\n", 13, spd->primw,
 743               " spd->primw,       * 13 Primary SDRAM Width *");
 744        printf("%-3d    : %02x %s\n", 14, spd->ecw,
 745               " spd->ecw,         * 14 Error Checking SDRAM width *");
 746        printf("%-3d    : %02x %s\n", 15, spd->min_delay,
 747               " spd->min_delay,   * 15 Back to Back Random Access *");
 748        printf("%-3d    : %02x %s\n", 16, spd->burstl,
 749               " spd->burstl,      * 16 Burst Lengths Supported *");
 750        printf("%-3d    : %02x %s\n", 17, spd->nbanks,
 751               " spd->nbanks,      * 17 # of Banks on Each SDRAM Device *");
 752        printf("%-3d    : %02x %s\n", 18, spd->cas_lat,
 753               " spd->cas_lat,     * 18 CAS# Latencies Supported *");
 754        printf("%-3d    : %02x %s\n", 19, spd->cs_lat,
 755               " spd->cs_lat,      * 19 Chip Select Latency *");
 756        printf("%-3d    : %02x %s\n", 20, spd->write_lat,
 757               " spd->write_lat,   * 20 Write Latency/Recovery *");
 758        printf("%-3d    : %02x %s\n", 21, spd->mod_attr,
 759               " spd->mod_attr,    * 21 SDRAM Module Attributes *");
 760        printf("%-3d    : %02x %s\n", 22, spd->dev_attr,
 761               " spd->dev_attr,    * 22 SDRAM Device Attributes *");
 762        printf("%-3d    : %02x %s\n", 23, spd->clk_cycle2,
 763               " spd->clk_cycle2,  * 23 Min SDRAM Cycle time at CL=X-1 *");
 764        printf("%-3d    : %02x %s\n", 24, spd->clk_access2,
 765               " spd->clk_access2, * 24 SDRAM Access from Clock at CL=X-1 *");
 766        printf("%-3d    : %02x %s\n", 25, spd->clk_cycle3,
 767               " spd->clk_cycle3,  * 25 Min SDRAM Cycle time at CL=X-2 *");
 768        printf("%-3d    : %02x %s\n", 26, spd->clk_access3,
 769               " spd->clk_access3, * 26 Max Access from Clock at CL=X-2 *");
 770        printf("%-3d    : %02x %s\n", 27, spd->trp,
 771               " spd->trp,         * 27 Min Row Precharge Time (tRP)*");
 772        printf("%-3d    : %02x %s\n", 28, spd->trrd,
 773               " spd->trrd,        * 28 Min Row Active to Row Active (tRRD) *");
 774        printf("%-3d    : %02x %s\n", 29, spd->trcd,
 775               " spd->trcd,        * 29 Min RAS to CAS Delay (tRCD) *");
 776        printf("%-3d    : %02x %s\n", 30, spd->tras,
 777               " spd->tras,        * 30 Minimum RAS Pulse Width (tRAS) *");
 778        printf("%-3d    : %02x %s\n", 31, spd->bank_dens,
 779               " spd->bank_dens,   * 31 Density of each bank on module *");
 780        printf("%-3d    : %02x %s\n", 32, spd->ca_setup,
 781               " spd->ca_setup,    * 32 Cmd + Addr signal input setup time *");
 782        printf("%-3d    : %02x %s\n", 33, spd->ca_hold,
 783               " spd->ca_hold,     * 33 Cmd and Addr signal input hold time *");
 784        printf("%-3d    : %02x %s\n", 34, spd->data_setup,
 785               " spd->data_setup,  * 34 Data signal input setup time *");
 786        printf("%-3d    : %02x %s\n", 35, spd->data_hold,
 787               " spd->data_hold,   * 35 Data signal input hold time *");
 788        printf("%-3d    : %02x %s\n", 36, spd->res_36_40[0],
 789               " spd->res_36_40[0], * 36 Reserved / tWR *");
 790        printf("%-3d    : %02x %s\n", 37, spd->res_36_40[1],
 791               " spd->res_36_40[1], * 37 Reserved / tWTR *");
 792        printf("%-3d    : %02x %s\n", 38, spd->res_36_40[2],
 793               " spd->res_36_40[2], * 38 Reserved / tRTP *");
 794        printf("%-3d    : %02x %s\n", 39, spd->res_36_40[3],
 795               " spd->res_36_40[3], * 39 Reserved / mem_probe *");
 796        printf("%-3d    : %02x %s\n", 40, spd->res_36_40[4],
 797               " spd->res_36_40[4], * 40 Reserved / trc,trfc extensions *");
 798        printf("%-3d    : %02x %s\n", 41, spd->trc,
 799               " spd->trc,         * 41 Min Active to Auto refresh time tRC *");
 800        printf("%-3d    : %02x %s\n", 42, spd->trfc,
 801               " spd->trfc,        * 42 Min Auto to Active period tRFC *");
 802        printf("%-3d    : %02x %s\n", 43, spd->tckmax,
 803               " spd->tckmax,      * 43 Max device cycle time tCKmax *");
 804        printf("%-3d    : %02x %s\n", 44, spd->tdqsq,
 805               " spd->tdqsq,       * 44 Max DQS to DQ skew *");
 806        printf("%-3d    : %02x %s\n", 45, spd->tqhs,
 807               " spd->tqhs,        * 45 Max Read DataHold skew tQHS *");
 808        printf("%-3d    : %02x %s\n", 46, spd->res_46,
 809               " spd->res_46,  * 46 Reserved/ PLL Relock time *");
 810        printf("%-3d    : %02x %s\n", 47, spd->dimm_height,
 811               " spd->dimm_height  * 47 SDRAM DIMM Height *");
 812
 813        printf("%-3d-%3d: ",  48, 61);
 814
 815        for (i = 0; i < 14; i++)
 816                printf("%02x", spd->res_48_61[i]);
 817
 818        printf(" * 48-61 IDD in SPD and Reserved space *\n");
 819
 820        printf("%-3d    : %02x %s\n", 62, spd->spd_rev,
 821               " spd->spd_rev,     * 62 SPD Data Revision Code *");
 822        printf("%-3d    : %02x %s\n", 63, spd->cksum,
 823               " spd->cksum,       * 63 Checksum for bytes 0-62 *");
 824        printf("%-3d-%3d: ",  64, 71);
 825
 826        for (i = 0; i < 8; i++)
 827                printf("%02x", spd->mid[i]);
 828
 829        printf("* 64 Mfr's JEDEC ID code per JEP-108E *\n");
 830        printf("%-3d    : %02x %s\n", 72, spd->mloc,
 831               " spd->mloc,        * 72 Manufacturing Location *");
 832
 833        printf("%-3d-%3d: >>",  73, 90);
 834
 835        for (i = 0; i < 18; i++)
 836                printf("%c", spd->mpart[i]);
 837
 838        printf("<<* 73 Manufacturer's Part Number *\n");
 839
 840        printf("%-3d-%3d: %02x %02x %s\n", 91, 92, spd->rev[0], spd->rev[1],
 841               "* 91 Revision Code *");
 842        printf("%-3d-%3d: %02x %02x %s\n", 93, 94, spd->mdate[0], spd->mdate[1],
 843               "* 93 Manufacturing Date *");
 844        printf("%-3d-%3d: ", 95, 98);
 845
 846        for (i = 0; i < 4; i++)
 847                printf("%02x", spd->sernum[i]);
 848
 849        printf("* 95 Assembly Serial Number *\n");
 850
 851        printf("%-3d-%3d: ", 99, 127);
 852
 853        for (i = 0; i < 27; i++)
 854                printf("%02x", spd->mspec[i]);
 855
 856        printf("* 99 Manufacturer Specific Data *\n");
 857}
 858#endif
 859
 860#ifdef CONFIG_FSL_DDR2
 861void ddr2_spd_dump(const ddr2_spd_eeprom_t *spd)
 862{
 863        unsigned int i;
 864
 865        printf("%-3d    : %02x %s\n", 0, spd->info_size,
 866               " spd->info_size,   *  0 # bytes written into serial memory *");
 867        printf("%-3d    : %02x %s\n", 1, spd->chip_size,
 868               " spd->chip_size,   *  1 Total # bytes of SPD memory device *");
 869        printf("%-3d    : %02x %s\n", 2, spd->mem_type,
 870               " spd->mem_type,    *  2 Fundamental memory type *");
 871        printf("%-3d    : %02x %s\n", 3, spd->nrow_addr,
 872               " spd->nrow_addr,   *  3 # of Row Addresses on this assembly *");
 873        printf("%-3d    : %02x %s\n", 4, spd->ncol_addr,
 874               " spd->ncol_addr,   *  4 # of Column Addrs on this assembly *");
 875        printf("%-3d    : %02x %s\n", 5, spd->mod_ranks,
 876               " spd->mod_ranks    *  5 # of Module Rows on this assembly *");
 877        printf("%-3d    : %02x %s\n", 6, spd->dataw,
 878               " spd->dataw,       *  6 Data Width of this assembly *");
 879        printf("%-3d    : %02x %s\n", 7, spd->res_7,
 880               " spd->res_7,       *  7 Reserved *");
 881        printf("%-3d    : %02x %s\n", 8, spd->voltage,
 882               " spd->voltage,     *  8 Voltage intf std of this assembly *");
 883        printf("%-3d    : %02x %s\n", 9, spd->clk_cycle,
 884               " spd->clk_cycle,   *  9 SDRAM Cycle time at CL=X *");
 885        printf("%-3d    : %02x %s\n", 10, spd->clk_access,
 886               " spd->clk_access,  * 10 SDRAM Access from Clock at CL=X *");
 887        printf("%-3d    : %02x %s\n", 11, spd->config,
 888               " spd->config,      * 11 DIMM Configuration type *");
 889        printf("%-3d    : %02x %s\n", 12, spd->refresh,
 890               " spd->refresh,     * 12 Refresh Rate/Type *");
 891        printf("%-3d    : %02x %s\n", 13, spd->primw,
 892               " spd->primw,       * 13 Primary SDRAM Width *");
 893        printf("%-3d    : %02x %s\n", 14, spd->ecw,
 894               " spd->ecw,         * 14 Error Checking SDRAM width *");
 895        printf("%-3d    : %02x %s\n", 15, spd->res_15,
 896               " spd->res_15,      * 15 Reserved *");
 897        printf("%-3d    : %02x %s\n", 16, spd->burstl,
 898               " spd->burstl,      * 16 Burst Lengths Supported *");
 899        printf("%-3d    : %02x %s\n", 17, spd->nbanks,
 900               " spd->nbanks,      * 17 # of Banks on Each SDRAM Device *");
 901        printf("%-3d    : %02x %s\n", 18, spd->cas_lat,
 902               " spd->cas_lat,     * 18 CAS# Latencies Supported *");
 903        printf("%-3d    : %02x %s\n", 19, spd->mech_char,
 904               " spd->mech_char,   * 19 Mechanical Characteristics *");
 905        printf("%-3d    : %02x %s\n", 20, spd->dimm_type,
 906               " spd->dimm_type,   * 20 DIMM type *");
 907        printf("%-3d    : %02x %s\n", 21, spd->mod_attr,
 908               " spd->mod_attr,    * 21 SDRAM Module Attributes *");
 909        printf("%-3d    : %02x %s\n", 22, spd->dev_attr,
 910               " spd->dev_attr,    * 22 SDRAM Device Attributes *");
 911        printf("%-3d    : %02x %s\n", 23, spd->clk_cycle2,
 912               " spd->clk_cycle2,  * 23 Min SDRAM Cycle time at CL=X-1 *");
 913        printf("%-3d    : %02x %s\n", 24, spd->clk_access2,
 914               " spd->clk_access2, * 24 SDRAM Access from Clock at CL=X-1 *");
 915        printf("%-3d    : %02x %s\n", 25, spd->clk_cycle3,
 916               " spd->clk_cycle3,  * 25 Min SDRAM Cycle time at CL=X-2 *");
 917        printf("%-3d    : %02x %s\n", 26, spd->clk_access3,
 918               " spd->clk_access3, * 26 Max Access from Clock at CL=X-2 *");
 919        printf("%-3d    : %02x %s\n", 27, spd->trp,
 920               " spd->trp,         * 27 Min Row Precharge Time (tRP)*");
 921        printf("%-3d    : %02x %s\n", 28, spd->trrd,
 922               " spd->trrd,        * 28 Min Row Active to Row Active (tRRD) *");
 923        printf("%-3d    : %02x %s\n", 29, spd->trcd,
 924               " spd->trcd,        * 29 Min RAS to CAS Delay (tRCD) *");
 925        printf("%-3d    : %02x %s\n", 30, spd->tras,
 926               " spd->tras,        * 30 Minimum RAS Pulse Width (tRAS) *");
 927        printf("%-3d    : %02x %s\n", 31, spd->rank_dens,
 928               " spd->rank_dens,   * 31 Density of each rank on module *");
 929        printf("%-3d    : %02x %s\n", 32, spd->ca_setup,
 930               " spd->ca_setup,    * 32 Cmd + Addr signal input setup time *");
 931        printf("%-3d    : %02x %s\n", 33, spd->ca_hold,
 932               " spd->ca_hold,     * 33 Cmd and Addr signal input hold time *");
 933        printf("%-3d    : %02x %s\n", 34, spd->data_setup,
 934               " spd->data_setup,  * 34 Data signal input setup time *");
 935        printf("%-3d    : %02x %s\n", 35, spd->data_hold,
 936               " spd->data_hold,   * 35 Data signal input hold time *");
 937        printf("%-3d    : %02x %s\n", 36, spd->twr,
 938               " spd->twr,         * 36 Write Recovery time tWR *");
 939        printf("%-3d    : %02x %s\n", 37, spd->twtr,
 940               " spd->twtr,        * 37 Int write to read delay tWTR *");
 941        printf("%-3d    : %02x %s\n", 38, spd->trtp,
 942               " spd->trtp,        * 38 Int read to precharge delay tRTP *");
 943        printf("%-3d    : %02x %s\n", 39, spd->mem_probe,
 944               " spd->mem_probe,   * 39 Mem analysis probe characteristics *");
 945        printf("%-3d    : %02x %s\n", 40, spd->trctrfc_ext,
 946               " spd->trctrfc_ext, * 40 Extensions to trc and trfc *");
 947        printf("%-3d    : %02x %s\n", 41, spd->trc,
 948               " spd->trc,         * 41 Min Active to Auto refresh time tRC *");
 949        printf("%-3d    : %02x %s\n", 42, spd->trfc,
 950               " spd->trfc,        * 42 Min Auto to Active period tRFC *");
 951        printf("%-3d    : %02x %s\n", 43, spd->tckmax,
 952               " spd->tckmax,      * 43 Max device cycle time tCKmax *");
 953        printf("%-3d    : %02x %s\n", 44, spd->tdqsq,
 954               " spd->tdqsq,       * 44 Max DQS to DQ skew *");
 955        printf("%-3d    : %02x %s\n", 45, spd->tqhs,
 956               " spd->tqhs,        * 45 Max Read DataHold skew tQHS *");
 957        printf("%-3d    : %02x %s\n", 46, spd->pll_relock,
 958               " spd->pll_relock,  * 46 PLL Relock time *");
 959        printf("%-3d    : %02x %s\n", 47, spd->Tcasemax,
 960               " spd->Tcasemax,    * 47 Tcasemax *");
 961        printf("%-3d    : %02x %s\n", 48, spd->psiTAdram,
 962               " spd->psiTAdram,   * 48 Thermal Resistance of DRAM Package "
 963               "from Top (Case) to Ambient (Psi T-A DRAM) *");
 964        printf("%-3d    : %02x %s\n", 49, spd->dt0_mode,
 965               " spd->dt0_mode,    * 49 DRAM Case Temperature Rise from "
 966               "Ambient due to Activate-Precharge/Mode Bits "
 967               "(DT0/Mode Bits) *)");
 968        printf("%-3d    : %02x %s\n", 50, spd->dt2n_dt2q,
 969               " spd->dt2n_dt2q,   * 50 DRAM Case Temperature Rise from "
 970               "Ambient due to Precharge/Quiet Standby "
 971               "(DT2N/DT2Q) *");
 972        printf("%-3d    : %02x %s\n", 51, spd->dt2p,
 973               " spd->dt2p,        * 51 DRAM Case Temperature Rise from "
 974               "Ambient due to Precharge Power-Down (DT2P) *");
 975        printf("%-3d    : %02x %s\n", 52, spd->dt3n,
 976               " spd->dt3n,        * 52 DRAM Case Temperature Rise from "
 977               "Ambient due to Active Standby (DT3N) *");
 978        printf("%-3d    : %02x %s\n", 53, spd->dt3pfast,
 979               " spd->dt3pfast,    * 53 DRAM Case Temperature Rise from "
 980               "Ambient due to Active Power-Down with Fast PDN Exit "
 981               "(DT3Pfast) *");
 982        printf("%-3d    : %02x %s\n", 54, spd->dt3pslow,
 983               " spd->dt3pslow,    * 54 DRAM Case Temperature Rise from "
 984               "Ambient due to Active Power-Down with Slow PDN Exit "
 985               "(DT3Pslow) *");
 986        printf("%-3d    : %02x %s\n", 55, spd->dt4r_dt4r4w,
 987               " spd->dt4r_dt4r4w, * 55 DRAM Case Temperature Rise from "
 988               "Ambient due to Page Open Burst Read/DT4R4W Mode Bit "
 989               "(DT4R/DT4R4W Mode Bit) *");
 990        printf("%-3d    : %02x %s\n", 56, spd->dt5b,
 991               " spd->dt5b,        * 56 DRAM Case Temperature Rise from "
 992               "Ambient due to Burst Refresh (DT5B) *");
 993        printf("%-3d    : %02x %s\n", 57, spd->dt7,
 994               " spd->dt7,         * 57 DRAM Case Temperature Rise from "
 995               "Ambient due to Bank Interleave Reads with "
 996               "Auto-Precharge (DT7) *");
 997        printf("%-3d    : %02x %s\n", 58, spd->psiTApll,
 998               " spd->psiTApll,    * 58 Thermal Resistance of PLL Package form"
 999               " Top (Case) to Ambient (Psi T-A PLL) *");
1000        printf("%-3d    : %02x %s\n", 59, spd->psiTAreg,
1001               " spd->psiTAreg,    * 59 Thermal Reisitance of Register Package"
1002               " from Top (Case) to Ambient (Psi T-A Register) *");
1003        printf("%-3d    : %02x %s\n", 60, spd->dtpllactive,
1004               " spd->dtpllactive, * 60 PLL Case Temperature Rise from "
1005               "Ambient due to PLL Active (DT PLL Active) *");
1006        printf("%-3d    : %02x %s\n", 61, spd->dtregact,
1007               " spd->dtregact,    "
1008               "* 61 Register Case Temperature Rise from Ambient due to "
1009               "Register Active/Mode Bit (DT Register Active/Mode Bit) *");
1010        printf("%-3d    : %02x %s\n", 62, spd->spd_rev,
1011               " spd->spd_rev,     * 62 SPD Data Revision Code *");
1012        printf("%-3d    : %02x %s\n", 63, spd->cksum,
1013               " spd->cksum,       * 63 Checksum for bytes 0-62 *");
1014
1015        printf("%-3d-%3d: ",  64, 71);
1016
1017        for (i = 0; i < 8; i++)
1018                printf("%02x", spd->mid[i]);
1019
1020        printf("* 64 Mfr's JEDEC ID code per JEP-108E *\n");
1021
1022        printf("%-3d    : %02x %s\n", 72, spd->mloc,
1023               " spd->mloc,        * 72 Manufacturing Location *");
1024
1025        printf("%-3d-%3d: >>",  73, 90);
1026        for (i = 0; i < 18; i++)
1027                printf("%c", spd->mpart[i]);
1028
1029
1030        printf("<<* 73 Manufacturer's Part Number *\n");
1031
1032        printf("%-3d-%3d: %02x %02x %s\n", 91, 92, spd->rev[0], spd->rev[1],
1033               "* 91 Revision Code *");
1034        printf("%-3d-%3d: %02x %02x %s\n", 93, 94, spd->mdate[0], spd->mdate[1],
1035               "* 93 Manufacturing Date *");
1036        printf("%-3d-%3d: ", 95, 98);
1037
1038        for (i = 0; i < 4; i++)
1039                printf("%02x", spd->sernum[i]);
1040
1041        printf("* 95 Assembly Serial Number *\n");
1042
1043        printf("%-3d-%3d: ", 99, 127);
1044        for (i = 0; i < 27; i++)
1045                printf("%02x", spd->mspec[i]);
1046
1047
1048        printf("* 99 Manufacturer Specific Data *\n");
1049}
1050#endif
1051
1052#ifdef CONFIG_FSL_DDR3
1053void ddr3_spd_dump(const ddr3_spd_eeprom_t *spd)
1054{
1055        unsigned int i;
1056
1057        /* General Section: Bytes 0-59 */
1058
1059#define PRINT_NXS(x, y, z...) printf("%-3d    : %02x " z "\n", x, (u8)y);
1060#define PRINT_NNXXS(n0, n1, x0, x1, s) \
1061        printf("%-3d-%3d: %02x %02x " s "\n", n0, n1, x0, x1);
1062
1063        PRINT_NXS(0, spd->info_size_crc,
1064                "info_size_crc  bytes written into serial memory, "
1065                "CRC coverage");
1066        PRINT_NXS(1, spd->spd_rev,
1067                "spd_rev        SPD Revision");
1068        PRINT_NXS(2, spd->mem_type,
1069                "mem_type       Key Byte / DRAM Device Type");
1070        PRINT_NXS(3, spd->module_type,
1071                "module_type    Key Byte / Module Type");
1072        PRINT_NXS(4, spd->density_banks,
1073                "density_banks  SDRAM Density and Banks");
1074        PRINT_NXS(5, spd->addressing,
1075                "addressing     SDRAM Addressing");
1076        PRINT_NXS(6, spd->module_vdd,
1077                "module_vdd     Module Nominal Voltage, VDD");
1078        PRINT_NXS(7, spd->organization,
1079                "organization   Module Organization");
1080        PRINT_NXS(8, spd->bus_width,
1081                "bus_width      Module Memory Bus Width");
1082        PRINT_NXS(9, spd->ftb_div,
1083                "ftb_div        Fine Timebase (FTB) Dividend / Divisor");
1084        PRINT_NXS(10, spd->mtb_dividend,
1085                "mtb_dividend   Medium Timebase (MTB) Dividend");
1086        PRINT_NXS(11, spd->mtb_divisor,
1087                "mtb_divisor    Medium Timebase (MTB) Divisor");
1088        PRINT_NXS(12, spd->tCK_min,
1089                "tCK_min        SDRAM Minimum Cycle Time");
1090        PRINT_NXS(13, spd->res_13,
1091                "res_13         Reserved");
1092        PRINT_NXS(14, spd->caslat_lsb,
1093                "caslat_lsb     CAS Latencies Supported, LSB");
1094        PRINT_NXS(15, spd->caslat_msb,
1095                "caslat_msb     CAS Latencies Supported, MSB");
1096        PRINT_NXS(16, spd->tAA_min,
1097                "tAA_min        Min CAS Latency Time");
1098        PRINT_NXS(17, spd->tWR_min,
1099                "tWR_min        Min Write REcovery Time");
1100        PRINT_NXS(18, spd->tRCD_min,
1101                "tRCD_min       Min RAS# to CAS# Delay Time");
1102        PRINT_NXS(19, spd->tRRD_min,
1103                "tRRD_min       Min Row Active to Row Active Delay Time");
1104        PRINT_NXS(20, spd->tRP_min,
1105                "tRP_min        Min Row Precharge Delay Time");
1106        PRINT_NXS(21, spd->tRAS_tRC_ext,
1107                "tRAS_tRC_ext   Upper Nibbles for tRAS and tRC");
1108        PRINT_NXS(22, spd->tRAS_min_lsb,
1109                "tRAS_min_lsb   Min Active to Precharge Delay Time, LSB");
1110        PRINT_NXS(23, spd->tRC_min_lsb,
1111                "tRC_min_lsb    Min Active to Active/Refresh Delay Time, LSB");
1112        PRINT_NXS(24, spd->tRFC_min_lsb,
1113                "tRFC_min_lsb   Min Refresh Recovery Delay Time LSB");
1114        PRINT_NXS(25, spd->tRFC_min_msb,
1115                "tRFC_min_msb   Min Refresh Recovery Delay Time MSB");
1116        PRINT_NXS(26, spd->tWTR_min,
1117                "tWTR_min       Min Internal Write to Read Command Delay Time");
1118        PRINT_NXS(27, spd->tRTP_min,
1119                "tRTP_min "
1120                "Min Internal Read to Precharge Command Delay Time");
1121        PRINT_NXS(28, spd->tFAW_msb,
1122                "tFAW_msb       Upper Nibble for tFAW");
1123        PRINT_NXS(29, spd->tFAW_min,
1124                "tFAW_min       Min Four Activate Window Delay Time");
1125        PRINT_NXS(30, spd->opt_features,
1126                "opt_features   SDRAM Optional Features");
1127        PRINT_NXS(31, spd->therm_ref_opt,
1128                "therm_ref_opt  SDRAM Thermal and Refresh Opts");
1129        PRINT_NXS(32, spd->therm_sensor,
1130                "therm_sensor  SDRAM Thermal Sensor");
1131        PRINT_NXS(33, spd->device_type,
1132                "device_type  SDRAM Device Type");
1133        PRINT_NXS(34, spd->fine_tCK_min,
1134                "fine_tCK_min  Fine offset for tCKmin");
1135        PRINT_NXS(35, spd->fine_tAA_min,
1136                "fine_tAA_min  Fine offset for tAAmin");
1137        PRINT_NXS(36, spd->fine_tRCD_min,
1138                "fine_tRCD_min Fine offset for tRCDmin");
1139        PRINT_NXS(37, spd->fine_tRP_min,
1140                "fine_tRP_min  Fine offset for tRPmin");
1141        PRINT_NXS(38, spd->fine_tRC_min,
1142                "fine_tRC_min  Fine offset for tRCmin");
1143
1144        printf("%-3d-%3d: ",  39, 59);  /* Reserved, General Section */
1145
1146        for (i = 39; i <= 59; i++)
1147                printf("%02x ", spd->res_39_59[i - 39]);
1148
1149        puts("\n");
1150
1151        switch (spd->module_type) {
1152        case 0x02:  /* UDIMM */
1153        case 0x03:  /* SO-DIMM */
1154        case 0x04:  /* Micro-DIMM */
1155        case 0x06:  /* Mini-UDIMM */
1156                PRINT_NXS(60, spd->mod_section.unbuffered.mod_height,
1157                        "mod_height    (Unbuffered) Module Nominal Height");
1158                PRINT_NXS(61, spd->mod_section.unbuffered.mod_thickness,
1159                        "mod_thickness (Unbuffered) Module Maximum Thickness");
1160                PRINT_NXS(62, spd->mod_section.unbuffered.ref_raw_card,
1161                        "ref_raw_card  (Unbuffered) Reference Raw Card Used");
1162                PRINT_NXS(63, spd->mod_section.unbuffered.addr_mapping,
1163                        "addr_mapping  (Unbuffered) Address mapping from "
1164                        "Edge Connector to DRAM");
1165                break;
1166        case 0x01:  /* RDIMM */
1167        case 0x05:  /* Mini-RDIMM */
1168                PRINT_NXS(60, spd->mod_section.registered.mod_height,
1169                        "mod_height    (Registered) Module Nominal Height");
1170                PRINT_NXS(61, spd->mod_section.registered.mod_thickness,
1171                        "mod_thickness (Registered) Module Maximum Thickness");
1172                PRINT_NXS(62, spd->mod_section.registered.ref_raw_card,
1173                        "ref_raw_card  (Registered) Reference Raw Card Used");
1174                PRINT_NXS(63, spd->mod_section.registered.modu_attr,
1175                        "modu_attr     (Registered) DIMM Module Attributes");
1176                PRINT_NXS(64, spd->mod_section.registered.thermal,
1177                        "thermal       (Registered) Thermal Heat "
1178                        "Spreader Solution");
1179                PRINT_NXS(65, spd->mod_section.registered.reg_id_lo,
1180                        "reg_id_lo     (Registered) Register Manufacturer ID "
1181                        "Code, LSB");
1182                PRINT_NXS(66, spd->mod_section.registered.reg_id_hi,
1183                        "reg_id_hi     (Registered) Register Manufacturer ID "
1184                        "Code, MSB");
1185                PRINT_NXS(67, spd->mod_section.registered.reg_rev,
1186                        "reg_rev       (Registered) Register "
1187                        "Revision Number");
1188                PRINT_NXS(68, spd->mod_section.registered.reg_type,
1189                        "reg_type      (Registered) Register Type");
1190                for (i = 69; i <= 76; i++) {
1191                        printf("%-3d    : %02x rcw[%d]\n", i,
1192                                spd->mod_section.registered.rcw[i-69], i-69);
1193                }
1194                break;
1195        default:
1196                /* Module-specific Section, Unsupported Module Type */
1197                printf("%-3d-%3d: ", 60, 116);
1198
1199                for (i = 60; i <= 116; i++)
1200                        printf("%02x", spd->mod_section.uc[i - 60]);
1201
1202                break;
1203        }
1204
1205        /* Unique Module ID: Bytes 117-125 */
1206        PRINT_NXS(117, spd->mmid_lsb, "Module MfgID Code LSB - JEP-106");
1207        PRINT_NXS(118, spd->mmid_msb, "Module MfgID Code MSB - JEP-106");
1208        PRINT_NXS(119, spd->mloc,     "Mfg Location");
1209        PRINT_NNXXS(120, 121, spd->mdate[0], spd->mdate[1], "Mfg Date");
1210
1211        printf("%-3d-%3d: ", 122, 125);
1212
1213        for (i = 122; i <= 125; i++)
1214                printf("%02x ", spd->sernum[i - 122]);
1215        printf("   Module Serial Number\n");
1216
1217        /* CRC: Bytes 126-127 */
1218        PRINT_NNXXS(126, 127, spd->crc[0], spd->crc[1], "  SPD CRC");
1219
1220        /* Other Manufacturer Fields and User Space: Bytes 128-255 */
1221        printf("%-3d-%3d: ", 128, 145);
1222        for (i = 128; i <= 145; i++)
1223                printf("%02x ", spd->mpart[i - 128]);
1224        printf("   Mfg's Module Part Number\n");
1225
1226        PRINT_NNXXS(146, 147, spd->mrev[0], spd->mrev[1],
1227                "Module Revision code");
1228
1229        PRINT_NXS(148, spd->dmid_lsb, "DRAM MfgID Code LSB - JEP-106");
1230        PRINT_NXS(149, spd->dmid_msb, "DRAM MfgID Code MSB - JEP-106");
1231
1232        printf("%-3d-%3d: ", 150, 175);
1233        for (i = 150; i <= 175; i++)
1234                printf("%02x ", spd->msd[i - 150]);
1235        printf("   Mfg's Specific Data\n");
1236
1237        printf("%-3d-%3d: ", 176, 255);
1238        for (i = 176; i <= 255; i++)
1239                printf("%02x", spd->cust[i - 176]);
1240        printf("   Mfg's Specific Data\n");
1241
1242}
1243#endif
1244
1245static inline void generic_spd_dump(const generic_spd_eeprom_t *spd)
1246{
1247#if defined(CONFIG_FSL_DDR1)
1248        ddr1_spd_dump(spd);
1249#elif defined(CONFIG_FSL_DDR2)
1250        ddr2_spd_dump(spd);
1251#elif defined(CONFIG_FSL_DDR3)
1252        ddr3_spd_dump(spd);
1253#endif
1254}
1255
1256static void fsl_ddr_printinfo(const fsl_ddr_info_t *pinfo,
1257                        unsigned int ctrl_mask,
1258                        unsigned int dimm_mask,
1259                        unsigned int do_mask)
1260{
1261        unsigned int i, j, retval;
1262
1263        /* STEP 1:  DIMM SPD data */
1264        if (do_mask & STEP_GET_SPD) {
1265                for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1266                        if (!(ctrl_mask & (1 << i)))
1267                                continue;
1268
1269                        for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
1270                                if (!(dimm_mask & (1 << j)))
1271                                        continue;
1272
1273                                printf("SPD info:  Controller=%u "
1274                                                "DIMM=%u\n", i, j);
1275                                generic_spd_dump(
1276                                        &(pinfo->spd_installed_dimms[i][j]));
1277                                printf("\n");
1278                        }
1279                        printf("\n");
1280                }
1281                printf("\n");
1282        }
1283
1284        /* STEP 2:  DIMM Parameters */
1285        if (do_mask & STEP_COMPUTE_DIMM_PARMS) {
1286                for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1287                        if (!(ctrl_mask & (1 << i)))
1288                                continue;
1289                        for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
1290                                if (!(dimm_mask & (1 << j)))
1291                                        continue;
1292                                printf("DIMM parameters:  Controller=%u "
1293                                                "DIMM=%u\n", i, j);
1294                                print_dimm_parameters(
1295                                        &(pinfo->dimm_params[i][j]));
1296                                printf("\n");
1297                        }
1298                        printf("\n");
1299                }
1300                printf("\n");
1301        }
1302
1303        /* STEP 3:  Common Parameters */
1304        if (do_mask & STEP_COMPUTE_COMMON_PARMS) {
1305                for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1306                        if (!(ctrl_mask & (1 << i)))
1307                                continue;
1308                        printf("\"lowest common\" DIMM parameters:  "
1309                                        "Controller=%u\n", i);
1310                        print_lowest_common_dimm_parameters(
1311                                &pinfo->common_timing_params[i]);
1312                        printf("\n");
1313                }
1314                printf("\n");
1315        }
1316
1317        /* STEP 4:  User Configuration Options */
1318        if (do_mask & STEP_GATHER_OPTS) {
1319                for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1320                        if (!(ctrl_mask & (1 << i)))
1321                                continue;
1322                        printf("User Config Options: Controller=%u\n", i);
1323                        print_memctl_options(&pinfo->memctl_opts[i]);
1324                        printf("\n");
1325                }
1326                printf("\n");
1327        }
1328
1329        /* STEP 5:  Address assignment */
1330        if (do_mask & STEP_ASSIGN_ADDRESSES) {
1331                for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1332                        if (!(ctrl_mask & (1 << i)))
1333                                continue;
1334                        for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
1335                                printf("Address Assignment: Controller=%u "
1336                                                "DIMM=%u\n", i, j);
1337                                printf("Don't have this functionality yet\n");
1338                        }
1339                        printf("\n");
1340                }
1341                printf("\n");
1342        }
1343
1344        /* STEP 6:  computed controller register values */
1345        if (do_mask & STEP_COMPUTE_REGS) {
1346                for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
1347                        if (!(ctrl_mask & (1 << i)))
1348                                continue;
1349                        printf("Computed Register Values: Controller=%u\n", i);
1350                        print_fsl_memctl_config_regs(
1351                                &pinfo->fsl_ddr_config_reg[i]);
1352                        retval = check_fsl_memctl_config_regs(
1353                                &pinfo->fsl_ddr_config_reg[i]);
1354                        if (retval) {
1355                                printf("check_fsl_memctl_config_regs "
1356                                        "result = %u\n", retval);
1357                        }
1358                        printf("\n");
1359                }
1360                printf("\n");
1361        }
1362}
1363
1364struct data_strings {
1365        const char *data_name;
1366        unsigned int step_mask;
1367        unsigned int dimm_number_required;
1368};
1369
1370#define DATA_OPTIONS(name, step, dimm) {#name, step, dimm}
1371
1372static unsigned int fsl_ddr_parse_interactive_cmd(
1373        char **argv,
1374        int argc,
1375        unsigned int *pstep_mask,
1376        unsigned int *pctlr_mask,
1377        unsigned int *pdimm_mask,
1378        unsigned int *pdimm_number_required
1379         ) {
1380
1381        static const struct data_strings options[] = {
1382                DATA_OPTIONS(spd, STEP_GET_SPD, 1),
1383                DATA_OPTIONS(dimmparms, STEP_COMPUTE_DIMM_PARMS, 1),
1384                DATA_OPTIONS(commonparms, STEP_COMPUTE_COMMON_PARMS, 0),
1385                DATA_OPTIONS(opts, STEP_GATHER_OPTS, 0),
1386                DATA_OPTIONS(addresses, STEP_ASSIGN_ADDRESSES, 0),
1387                DATA_OPTIONS(regs, STEP_COMPUTE_REGS, 0),
1388        };
1389        static const unsigned int n_opts = ARRAY_SIZE(options);
1390
1391        unsigned int i, j;
1392        unsigned int error = 0;
1393
1394        for (i = 1; i < argc; i++) {
1395                unsigned int matched = 0;
1396
1397                for (j = 0; j < n_opts; j++) {
1398                        if (strcmp(options[j].data_name, argv[i]) != 0)
1399                                continue;
1400                        *pstep_mask |= options[j].step_mask;
1401                        *pdimm_number_required =
1402                                options[j].dimm_number_required;
1403                        matched = 1;
1404                        break;
1405                }
1406
1407                if (matched)
1408                        continue;
1409
1410                if (argv[i][0] == 'c') {
1411                        char c = argv[i][1];
1412                        if (isdigit(c))
1413                                *pctlr_mask |= 1 << (c - '0');
1414                        continue;
1415                }
1416
1417                if (argv[i][0] == 'd') {
1418                        char c = argv[i][1];
1419                        if (isdigit(c))
1420                                *pdimm_mask |= 1 << (c - '0');
1421                        continue;
1422                }
1423
1424                printf("unknown arg %s\n", argv[i]);
1425                *pstep_mask = 0;
1426                error = 1;
1427                break;
1428        }
1429
1430        return error;
1431}
1432
1433int fsl_ddr_interactive_env_var_exists(void)
1434{
1435        char buffer[CONFIG_SYS_CBSIZE];
1436
1437        if (getenv_f("ddr_interactive", buffer, CONFIG_SYS_CBSIZE) >= 0)
1438                return 1;
1439
1440        return 0;
1441}
1442
1443unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo, int var_is_set)
1444{
1445        unsigned long long ddrsize;
1446        const char *prompt = "FSL DDR>";
1447        char buffer[CONFIG_SYS_CBSIZE];
1448        char buffer2[CONFIG_SYS_CBSIZE];
1449        char *p = NULL;
1450        char *argv[CONFIG_SYS_MAXARGS + 1];     /* NULL terminated */
1451        int argc;
1452        unsigned int next_step = STEP_GET_SPD;
1453        const char *usage = {
1454                "commands:\n"
1455                "print      print SPD and intermediate computed data\n"
1456                "reset      reboot machine\n"
1457                "recompute  reload SPD and options to default and recompute regs\n"
1458                "edit       modify spd, parameter, or option\n"
1459                "compute    recompute registers from current next_step to end\n"
1460                "copy       copy parameters\n"
1461                "next_step  shows current next_step\n"
1462                "help       this message\n"
1463                "go         program the memory controller and continue with u-boot\n"
1464        };
1465
1466        if (var_is_set) {
1467                if (getenv_f("ddr_interactive", buffer2, CONFIG_SYS_CBSIZE) > 0) {
1468                        p = buffer2;
1469                } else {
1470                        var_is_set = 0;
1471                }
1472        }
1473
1474        /*
1475         * The strategy for next_step is that it points to the next
1476         * step in the computation process that needs to be done.
1477         */
1478        while (1) {
1479                if (var_is_set) {
1480                        char *pend = strchr(p, ';');
1481                        if (pend) {
1482                                /* found command separator, copy sub-command */
1483                                *pend = '\0';
1484                                strcpy(buffer, p);
1485                                p = pend + 1;
1486                        } else {
1487                                /* separator not found, copy whole string */
1488                                strcpy(buffer, p);
1489                                p = NULL;
1490                                var_is_set = 0;
1491                        }
1492                } else {
1493                        /*
1494                         * No need to worry for buffer overflow here in
1495                         * this function;  readline() maxes out at CFG_CBSIZE
1496                         */
1497                        readline_into_buffer(prompt, buffer, 0);
1498                }
1499                argc = parse_line(buffer, argv);
1500                if (argc == 0)
1501                        continue;
1502
1503
1504                if (strcmp(argv[0], "help") == 0) {
1505                        puts(usage);
1506                        continue;
1507                }
1508
1509                if (strcmp(argv[0], "next_step") == 0) {
1510                        printf("next_step = 0x%02X (%s)\n",
1511                               next_step,
1512                               step_to_string(next_step));
1513                        continue;
1514                }
1515
1516                if (strcmp(argv[0], "copy") == 0) {
1517                        unsigned int error = 0;
1518                        unsigned int step_mask = 0;
1519                        unsigned int src_ctlr_mask = 0;
1520                        unsigned int src_dimm_mask = 0;
1521                        unsigned int dimm_number_required = 0;
1522                        unsigned int src_ctlr_num = 0;
1523                        unsigned int src_dimm_num = 0;
1524                        unsigned int dst_ctlr_num = -1;
1525                        unsigned int dst_dimm_num = -1;
1526                        unsigned int i, num_dest_parms;
1527
1528                        if (argc == 1) {
1529                                printf("copy <src c#> <src d#> <spd|dimmparms|commonparms|opts|addresses|regs> <dst c#> <dst d#>\n");
1530                                continue;
1531                        }
1532
1533                        error = fsl_ddr_parse_interactive_cmd(
1534                                argv, argc,
1535                                &step_mask,
1536                                &src_ctlr_mask,
1537                                &src_dimm_mask,
1538                                &dimm_number_required
1539                        );
1540
1541                        /* XXX: only dimm_number_required and step_mask will
1542                           be used by this function.  Parse the controller and
1543                           DIMM number separately because it is easier.  */
1544
1545                        if (error)
1546                                continue;
1547
1548                        /* parse source destination controller / DIMM */
1549
1550                        num_dest_parms = dimm_number_required ? 2 : 1;
1551
1552                        for (i = 0; i < argc; i++) {
1553                                if (argv[i][0] == 'c') {
1554                                        char c = argv[i][1];
1555                                        if (isdigit(c)) {
1556                                                src_ctlr_num = (c - '0');
1557                                                break;
1558                                        }
1559                                }
1560                        }
1561
1562                        for (i = 0; i < argc; i++) {
1563                                if (argv[i][0] == 'd') {
1564                                        char c = argv[i][1];
1565                                        if (isdigit(c)) {
1566                                                src_dimm_num = (c - '0');
1567                                                break;
1568                                        }
1569                                }
1570                        }
1571
1572                        /* parse destination controller / DIMM */
1573
1574                        for (i = argc - 1; i >= argc - num_dest_parms; i--) {
1575                                if (argv[i][0] == 'c') {
1576                                        char c = argv[i][1];
1577                                        if (isdigit(c)) {
1578                                                dst_ctlr_num = (c - '0');
1579                                                break;
1580                                        }
1581                                }
1582                        }
1583
1584                        for (i = argc - 1; i >= argc - num_dest_parms; i--) {
1585                                if (argv[i][0] == 'd') {
1586                                        char c = argv[i][1];
1587                                        if (isdigit(c)) {
1588                                                dst_dimm_num = (c - '0');
1589                                                break;
1590                                        }
1591                                }
1592                        }
1593
1594                        /* TODO: validate inputs */
1595
1596                        debug("src_ctlr_num = %u, src_dimm_num = %u, dst_ctlr_num = %u, dst_dimm_num = %u, step_mask = %x\n",
1597                                src_ctlr_num, src_dimm_num, dst_ctlr_num, dst_dimm_num, step_mask);
1598
1599
1600                        switch (step_mask) {
1601
1602                        case STEP_GET_SPD:
1603                                memcpy(&(pinfo->spd_installed_dimms[dst_ctlr_num][dst_dimm_num]),
1604                                        &(pinfo->spd_installed_dimms[src_ctlr_num][src_dimm_num]),
1605                                        sizeof(pinfo->spd_installed_dimms[0][0]));
1606                                break;
1607
1608                        case STEP_COMPUTE_DIMM_PARMS:
1609                                memcpy(&(pinfo->dimm_params[dst_ctlr_num][dst_dimm_num]),
1610                                        &(pinfo->dimm_params[src_ctlr_num][src_dimm_num]),
1611                                        sizeof(pinfo->dimm_params[0][0]));
1612                                break;
1613
1614                        case STEP_COMPUTE_COMMON_PARMS:
1615                                memcpy(&(pinfo->common_timing_params[dst_ctlr_num]),
1616                                        &(pinfo->common_timing_params[src_ctlr_num]),
1617                                        sizeof(pinfo->common_timing_params[0]));
1618                                break;
1619
1620                        case STEP_GATHER_OPTS:
1621                                memcpy(&(pinfo->memctl_opts[dst_ctlr_num]),
1622                                        &(pinfo->memctl_opts[src_ctlr_num]),
1623                                        sizeof(pinfo->memctl_opts[0]));
1624                                break;
1625
1626                        /* someday be able to have addresses to copy addresses... */
1627
1628                        case STEP_COMPUTE_REGS:
1629                                memcpy(&(pinfo->fsl_ddr_config_reg[dst_ctlr_num]),
1630                                        &(pinfo->fsl_ddr_config_reg[src_ctlr_num]),
1631                                        sizeof(pinfo->memctl_opts[0]));
1632                                break;
1633
1634                        default:
1635                                printf("unexpected step_mask value\n");
1636                        }
1637
1638                        continue;
1639
1640                }
1641
1642                if (strcmp(argv[0], "edit") == 0) {
1643                        unsigned int error = 0;
1644                        unsigned int step_mask = 0;
1645                        unsigned int ctlr_mask = 0;
1646                        unsigned int dimm_mask = 0;
1647                        char *p_element = NULL;
1648                        char *p_value = NULL;
1649                        unsigned int dimm_number_required = 0;
1650                        unsigned int ctrl_num;
1651                        unsigned int dimm_num;
1652
1653                        if (argc == 1) {
1654                                /* Only the element and value must be last */
1655                                printf("edit <c#> <d#> "
1656                                        "<spd|dimmparms|commonparms|opts|"
1657                                        "addresses|regs> <element> <value>\n");
1658                                printf("for spd, specify byte number for "
1659                                        "element\n");
1660                                continue;
1661                        }
1662
1663                        error = fsl_ddr_parse_interactive_cmd(
1664                                argv, argc - 2,
1665                                &step_mask,
1666                                &ctlr_mask,
1667                                &dimm_mask,
1668                                &dimm_number_required
1669                        );
1670
1671                        if (error)
1672                                continue;
1673
1674
1675                        /* Check arguments */
1676
1677                        /* ERROR: If no steps were found */
1678                        if (step_mask == 0) {
1679                                printf("Error: No valid steps were specified "
1680                                                "in argument.\n");
1681                                continue;
1682                        }
1683
1684                        /* ERROR: If multiple steps were found */
1685                        if (step_mask & (step_mask - 1)) {
1686                                printf("Error: Multiple steps specified in "
1687                                                "argument.\n");
1688                                continue;
1689                        }
1690
1691                        /* ERROR: Controller not specified */
1692                        if (ctlr_mask == 0) {
1693                                printf("Error: controller number not "
1694                                        "specified or no element and "
1695                                        "value specified\n");
1696                                continue;
1697                        }
1698
1699                        if (ctlr_mask & (ctlr_mask - 1)) {
1700                                printf("Error: multiple controllers "
1701                                                "specified, %X\n", ctlr_mask);
1702                                continue;
1703                        }
1704
1705                        /* ERROR: DIMM number not specified */
1706                        if (dimm_number_required && dimm_mask == 0) {
1707                                printf("Error: DIMM number number not "
1708                                        "specified or no element and "
1709                                        "value specified\n");
1710                                continue;
1711                        }
1712
1713                        if (dimm_mask & (dimm_mask - 1)) {
1714                                printf("Error: multipled DIMMs specified\n");
1715                                continue;
1716                        }
1717
1718                        p_element = argv[argc - 2];
1719                        p_value = argv[argc - 1];
1720
1721                        ctrl_num = __ilog2(ctlr_mask);
1722                        dimm_num = __ilog2(dimm_mask);
1723
1724                        switch (step_mask) {
1725                        case STEP_GET_SPD:
1726                                {
1727                                        unsigned int element_num;
1728                                        unsigned int value;
1729
1730                                        element_num = simple_strtoul(p_element,
1731                                                                     NULL, 0);
1732                                        value = simple_strtoul(p_value,
1733                                                               NULL, 0);
1734                                        fsl_ddr_spd_edit(pinfo,
1735                                                               ctrl_num,
1736                                                               dimm_num,
1737                                                               element_num,
1738                                                               value);
1739                                        next_step = STEP_COMPUTE_DIMM_PARMS;
1740                                }
1741                                break;
1742
1743                        case STEP_COMPUTE_DIMM_PARMS:
1744                                fsl_ddr_dimm_parameters_edit(
1745                                                 pinfo, ctrl_num, dimm_num,
1746                                                 p_element, p_value);
1747                                next_step = STEP_COMPUTE_COMMON_PARMS;
1748                                break;
1749
1750                        case STEP_COMPUTE_COMMON_PARMS:
1751                                lowest_common_dimm_parameters_edit(pinfo,
1752                                                ctrl_num, p_element, p_value);
1753                                next_step = STEP_GATHER_OPTS;
1754                                break;
1755
1756                        case STEP_GATHER_OPTS:
1757                                fsl_ddr_options_edit(pinfo, ctrl_num,
1758                                                           p_element, p_value);
1759                                next_step = STEP_ASSIGN_ADDRESSES;
1760                                break;
1761
1762                        case STEP_ASSIGN_ADDRESSES:
1763                                printf("editing of address assignment "
1764                                                "not yet implemented\n");
1765                                break;
1766
1767                        case STEP_COMPUTE_REGS:
1768                                {
1769                                        fsl_ddr_regs_edit(pinfo,
1770                                                                ctrl_num,
1771                                                                p_element,
1772                                                                p_value);
1773                                        next_step = STEP_PROGRAM_REGS;
1774                                }
1775                                break;
1776
1777                        default:
1778                                printf("programming error\n");
1779                                while (1)
1780                                        ;
1781                                break;
1782                        }
1783                        continue;
1784                }
1785
1786                if (strcmp(argv[0], "reset") == 0) {
1787                        /*
1788                         * Reboot machine.
1789                         * Args don't seem to matter because this
1790                         * doesn't return
1791                         */
1792                        do_reset(NULL, 0, 0, NULL);
1793                        printf("Reset didn't work\n");
1794                }
1795
1796                if (strcmp(argv[0], "recompute") == 0) {
1797                        /*
1798                         * Recalculate everything, starting with
1799                         * loading SPD EEPROM from DIMMs
1800                         */
1801                        next_step = STEP_GET_SPD;
1802                        ddrsize = fsl_ddr_compute(pinfo, next_step, 0);
1803                        continue;
1804                }
1805
1806                if (strcmp(argv[0], "compute") == 0) {
1807                        /*
1808                         * Compute rest of steps starting at
1809                         * the current next_step/
1810                         */
1811                        ddrsize = fsl_ddr_compute(pinfo, next_step, 0);
1812                        continue;
1813                }
1814
1815                if (strcmp(argv[0], "print") == 0) {
1816                        unsigned int error = 0;
1817                        unsigned int step_mask = 0;
1818                        unsigned int ctlr_mask = 0;
1819                        unsigned int dimm_mask = 0;
1820                        unsigned int dimm_number_required = 0;
1821
1822                        if (argc == 1) {
1823                                printf("print [c<n>] [d<n>] [spd] [dimmparms] "
1824                                  "[commonparms] [opts] [addresses] [regs]\n");
1825                                continue;
1826                        }
1827
1828                        error = fsl_ddr_parse_interactive_cmd(
1829                                argv, argc,
1830                                &step_mask,
1831                                &ctlr_mask,
1832                                &dimm_mask,
1833                                &dimm_number_required
1834                        );
1835
1836                        if (error)
1837                                continue;
1838
1839                        /* If no particular controller was found, print all */
1840                        if (ctlr_mask == 0)
1841                                ctlr_mask = 0xFF;
1842
1843                        /* If no particular dimm was found, print all dimms. */
1844                        if (dimm_mask == 0)
1845                                dimm_mask = 0xFF;
1846
1847                        /* If no steps were found, print all steps. */
1848                        if (step_mask == 0)
1849                                step_mask = STEP_ALL;
1850
1851                        fsl_ddr_printinfo(pinfo, ctlr_mask,
1852                                                dimm_mask, step_mask);
1853                        continue;
1854                }
1855
1856                if (strcmp(argv[0], "go") == 0) {
1857                        if (next_step)
1858                                ddrsize = fsl_ddr_compute(pinfo, next_step, 0);
1859                        break;
1860                }
1861
1862                printf("unknown command %s\n", argv[0]);
1863        }
1864
1865        debug("end of memory = %llu\n", (u64)ddrsize);
1866
1867        return ddrsize;
1868}
1869