Dear York Sun,

In message <1292630381-23022-6-git-send-email-york...@freescale.com> you wrote:
> Added fsl_ddr_get_version() function to for DDR3 to poll DDRC IP version
> (major, minor, errata) to determine if unique mode registers are available.
> If true, always use unique mode registers. Dynamic ODT is enabled if needed.
> The table is documented in doc/README.fsl-ddr. This function may also need
> to be extend for future other platforms if such a feature exists.
> 
> Enable address parity and RCW by default for RDIMMs.
> 
> Change default output driver impedance from 34 ohm to 40ohm. Make it 34ohm for
> quad-rank RDIMMs.
...
> +static void set_ddr_sdram_mode_3(fsl_ddr_cfg_regs_t *ddr,
> +                             const memctl_options_t *popts)
> +{
> +     u16 esdmode;            /* Extended SDRAM mode */
> +     u16 sdmode;             /* SDRAM mode */
> +     u32 rtt;
> +
> +     sdmode = ddr->ddr_sdram_mode & 0xFFFF;
> +     esdmode = (ddr->ddr_sdram_mode >> 16) & 0xFFFF;
> +
> +     if (popts->rtt_override)
> +             rtt = popts->rtt_override_value;
> +     else
> +             rtt = popts->cs_local_opts[1].odt_rtt_norm;
> +
> +     esdmode &= 0xFDBB;      /* clear bit 9,6,2 */
> +     esdmode |= (0
> +             | ((rtt & 0x4) << 7)   /* rtt field is split */
> +             | ((rtt & 0x2) << 5)   /* rtt field is split */
> +             | ((rtt & 0x1) << 2)  /* rtt field is split */
> +             );
> +
> +     ddr->ddr_sdram_mode_3 = (0
> +                            | ((esdmode & 0xFFFF) << 16)
> +                            | ((sdmode & 0xFFFF) << 0)
> +                            );
> +     debug("FSLDDR: ddr_sdram_mode_3 = 0x%08x\n", ddr->ddr_sdram_mode_3);
> +}
...
> +static void set_ddr_sdram_mode_5(fsl_ddr_cfg_regs_t *ddr,
> +                             const memctl_options_t *popts)
> +{
> +     u16 esdmode;            /* Extended SDRAM mode */
> +     u16 sdmode;             /* SDRAM mode */
> +     u32 rtt;
> +
> +     sdmode = ddr->ddr_sdram_mode & 0xFFFF;
> +     esdmode = (ddr->ddr_sdram_mode >> 16) & 0xFFFF;
> +
> +     if (popts->rtt_override)
> +             rtt = popts->rtt_override_value;
> +     else
> +             rtt = popts->cs_local_opts[2].odt_rtt_norm;
> +
> +     esdmode &= 0xFDBB;      /* clear bit 9,6,2 */
> +     esdmode |= (0
> +             | ((rtt & 0x4) << 7)   /* rtt field is split */
> +             | ((rtt & 0x2) << 5)   /* rtt field is split */
> +             | ((rtt & 0x1) << 2)  /* rtt field is split */
> +             );
> +
> +     ddr->ddr_sdram_mode_5 = (0
> +                            | ((esdmode & 0xFFFF) << 16)
> +                            | ((sdmode & 0xFFFF) << 0)
> +                            );
> +     debug("FSLDDR: ddr_sdram_mode_5 = 0x%08x\n", ddr->ddr_sdram_mode_5);
> +}

Seems the only difference between these functions is the index into
the array?

> +static void set_ddr_sdram_mode_4(fsl_ddr_cfg_regs_t *ddr,
> +                             const memctl_options_t *popts)
> +{
> +     u16 esdmode2 = 0;       /* Extended SDRAM mode 2 */
> +     u16 esdmode3 = 0;       /* Extended SDRAM mode 3 */
> +     u32 rtt_wr = 0;         /* Dynamic ODT off */
> +
> +     esdmode2 = (ddr->ddr_sdram_mode_2 >> 16) & 0xFFFF;
> +     esdmode3 = ddr->ddr_sdram_mode_2 & 0xFFFF;
> +
> +     if (popts->rtt_override)
> +             rtt_wr = popts->rtt_wr_override_value;
> +     else
> +             rtt_wr = popts->cs_local_opts[1].odt_rtt_wr;
> +
> +     esdmode2 &= 0xF9FF;     /* clear bit 10, 9 */
> +     esdmode2 |= (rtt_wr & 0x3) << 9;
> +     ddr->ddr_sdram_mode_4 = (0
> +                              | ((esdmode2 & 0xFFFF) << 16)
> +                              | ((esdmode3 & 0xFFFF) << 0)
> +                              );
> +     debug("FSLDDR: ddr_sdram_mode_4 = 0x%08x\n", ddr->ddr_sdram_mode_4);
> +}
...
> +static void set_ddr_sdram_mode_6(fsl_ddr_cfg_regs_t *ddr,
> +                             const memctl_options_t *popts)
> +{
> +     u16 esdmode2 = 0;       /* Extended SDRAM mode 2 */
> +     u16 esdmode3 = 0;       /* Extended SDRAM mode 3 */
> +     u32 rtt_wr = 0;         /* Dynamic ODT off */
> +
> +     esdmode2 = (ddr->ddr_sdram_mode_2 >> 16) & 0xFFFF;
> +     esdmode3 = ddr->ddr_sdram_mode_2 & 0xFFFF;
> +
> +     if (popts->rtt_override)
> +             rtt_wr = popts->rtt_wr_override_value;
> +     else
> +             rtt_wr = popts->cs_local_opts[2].odt_rtt_wr;
> +
> +     esdmode2 &= 0xF9FF;     /* clear bit 10, 9 */
> +     esdmode2 |= (rtt_wr & 0x3) << 9;
> +     ddr->ddr_sdram_mode_6 = (0
> +                              | ((esdmode2 & 0xFFFF) << 16)
> +                              | ((esdmode3 & 0xFFFF) << 0)
> +                              );
> +     debug("FSLDDR: ddr_sdram_mode_6 = 0x%08x\n", ddr->ddr_sdram_mode_6);
> +}

Same here.

> +static void set_ddr_sdram_mode_7(fsl_ddr_cfg_regs_t *ddr,
> +                             const memctl_options_t *popts)
> +{
> +     u16 esdmode;            /* Extended SDRAM mode */
> +     u16 sdmode;             /* SDRAM mode */
> +     u32 rtt;
> +
> +     sdmode = ddr->ddr_sdram_mode & 0xFFFF;
> +     esdmode = (ddr->ddr_sdram_mode >> 16) & 0xFFFF;
> +
> +     if (popts->rtt_override)
> +             rtt = popts->rtt_override_value;
> +     else
> +             rtt = popts->cs_local_opts[3].odt_rtt_norm;
> +
> +     esdmode &= 0xFDBB;      /* clear bit 9,6,2 */
> +     esdmode |= (0
> +             | ((rtt & 0x4) << 7)   /* rtt field is split */
> +             | ((rtt & 0x2) << 5)   /* rtt field is split */
> +             | ((rtt & 0x1) << 2)  /* rtt field is split */
> +             );
> +
> +     ddr->ddr_sdram_mode_7 = (0
> +                            | ((esdmode & 0xFFFF) << 16)
> +                            | ((sdmode & 0xFFFF) << 0)
> +                            );
> +     debug("FSLDDR: ddr_sdram_mode_7 = 0x%08x\n", ddr->ddr_sdram_mode_7);
> +}
> +
> +static void set_ddr_sdram_mode_8(fsl_ddr_cfg_regs_t *ddr,
> +                             const memctl_options_t *popts)
> +{
> +     u16 esdmode2 = 0;       /* Extended SDRAM mode 2 */
> +     u16 esdmode3 = 0;       /* Extended SDRAM mode 3 */
> +     u32 rtt_wr = 0; /* Rtt_WR - dynamic ODT off */
> +
> +     esdmode2 = (ddr->ddr_sdram_mode_2 >> 16) & 0xFFFF;
> +     esdmode3 = ddr->ddr_sdram_mode_2 & 0xFFFF;
> +
> +     if (popts->rtt_override)
> +             rtt_wr = popts->rtt_wr_override_value;
> +     else
> +             rtt_wr = popts->cs_local_opts[3].odt_rtt_wr;
> +
> +     esdmode2 &= 0xF9FF;     /* clear bit 10, 9 */
> +     esdmode2 |= (rtt_wr & 0x3) << 9;
> +     ddr->ddr_sdram_mode_8 = (0
> +                              | ((esdmode2 & 0xFFFF) << 16)
> +                              | ((esdmode3 & 0xFFFF) << 0)
> +                              );
> +     debug("FSLDDR: ddr_sdram_mode_8 = 0x%08x\n", ddr->ddr_sdram_mode_8);
> +}

And two more copies...

Please do not duplicate code.


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
There are very few personal problems that cannot be solved through  a
suitable application of high explosives.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to