[U-Boot] mx6: spl: Rename ncs as ranks and move it to mx6_ddr3_cfg

Tim Harvey tharvey at gateworks.com
Sun Aug 10 09:47:11 CEST 2014


On Sat, Aug 9, 2014 at 7:08 AM, Nikolay Dimitrov <picmaster at mail.bg> wrote:
> Hi guys,
>
> I'm working on adding SO-DIMM SPL support on a custom imx6 board, so I'm
> thinking on the idea of which DDR3 settings belong to the controller and
> which belong to the DDR3 memory module/chips.
>
> My proposal is to rename the struct member "ncs" to "ranks" (as per JEDEC)
> and to move it as part of the DDR3 module description (be it an external
> so-dimm module or on-board DDR ICs), and not part of the MMDC description.
> This way the "ranks" value can be loaded from the SO-DIMM SPD or hard-coded
> as in Tim's case for the Ventana board.
>
> The code for my board is out of the official tree, so I'm showing my idea on
> Tim's Ventana SPL code:
>
>
> diff --git a/arch/arm/cpu/armv7/mx6/ddr.c b/arch/arm/cpu/armv7/mx6/ddr.c
> index 0434211..0d3580b 100644
> --- a/arch/arm/cpu/armv7/mx6/ddr.c
> +++ b/arch/arm/cpu/armv7/mx6/ddr.c
> @@ -340,7 +340,7 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *i,
>         debug("trrd=%d\n", trrd);
>         debug("txpr=%d\n", txpr);
>         debug("CS0_END=%d\n", CS0_END);
> -       debug("ncs=%d\n", i->ncs);
> +       debug("ranks=%d\n", m->ranks);
>         debug("Rtt_wr=%d\n", i->rtt_wr);
>         debug("Rtt_nom=%d\n", i->rtt_nom);
>         debug("SRT=%d\n", m->SRT);
> @@ -437,11 +437,11 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *i,
>         /* Step 7: Enable MMDC with desired chip select */
>         reg = mmdc0->mdctl |
>               (1 << 31) |                       /* SDE_0 for CS0 */
> -             ((i->ncs == 2) ? 1 : 0) << 30;    /* SDE_1 for CS1 */
> +             ((m->ranks == 2) ? 1 : 0) << 30;  /* SDE_1 for CS1 */
>         mmdc0->mdctl = reg;
>
>         /* Step 8: Write Mode Registers to Init DDR3 devices */
> -       for (cs = 0; cs < i->ncs; cs++) {
> +       for (cs = 0; cs < m->ranks; cs++) {
>                 /* MR2 */
>                 reg = (i->rtt_wr & 3) << 9 | (m->SRT & 1) << 7 |
>                       ((tcwl - 3) & 3) << 3;
> diff --git a/arch/arm/include/asm/arch-mx6/mx6-ddr.h
> b/arch/arm/include/asm/arch-mx6/mx6-ddr.h
> index 5ebabfa..2b9649c 100644
> --- a/arch/arm/include/asm/arch-mx6/mx6-ddr.h
> +++ b/arch/arm/include/asm/arch-mx6/mx6-ddr.h
> @@ -191,13 +191,13 @@ struct mx6_ddr3_cfg {
>         u16 trcmin;     /* tRC min (ns*100) */
>         u16 trasmin;    /* tRAS min (ns*100) */
>         u8 SRT;         /* self-refresh temperature: 0=normal, 1=extended */
> +       u8 ranks;       /* ranks (chip-selects) of the DDR3 memory (1,2) */
>  };
>
>  /* System Information: Varies per board design, layout, and term choices */
>  struct mx6_ddr_sysinfo {
>         u8 dsize;       /* size of bus (in dwords: 0=16bit,1=32bit,2=64bit)
> */
>         u8 cs_density;  /* density per chip select (Gb) */
> -       u8 ncs;         /* number chip selects used (1|2) */
>         char cs1_mirror;/* enable address mirror (0|1) */
>         char bi_on;     /* Bank interleaving enable */
>         u8 rtt_nom;     /* Rtt_Nom (DDR3_RTT_*) */
> diff --git a/board/gateworks/gw_ventana/gw_ventana_spl.c
> b/board/gateworks/gw_ventana/gw_ventana_spl.c
> index e943879..93be270 100644
> --- a/board/gateworks/gw_ventana/gw_ventana_spl.c
> +++ b/board/gateworks/gw_ventana/gw_ventana_spl.c
> @@ -199,6 +199,7 @@ static struct mx6_ddr3_cfg mt41k128m16jt_125 = {
>         .trcd = 1375,
>         .trcmin = 4875,
>         .trasmin = 3500,
> +       .ranks = 1
>  };
>
>  /* GW54xx specific calibration */
> @@ -309,8 +310,6 @@ static void spl_dram_init(int width, int size, int
> board_model)
>                 .dsize = width/32,
>                 /* config for full 4GB range so that get_mem_size() works */
>                 .cs_density = 32, /* 32Gb per CS */
> -               /* single chip select */
> -               .ncs = 1,
>                 .cs1_mirror = 0,
>                 .rtt_wr = 1 /*DDR3_RTT_60_OHM*/,        /* RTT_Wr = RZQ/4 */
>  #ifdef RTT_NOM_120OHM
>
>
> Please excuse me if this way to show ideas is not the appropriate one, just
> tell me how to do it better and I'll do my best.
>
> Kind regards,
> Nikolay

Hi Nikolay,

The ncs field is a 'system' property detailing how many chip selects
your board supports. I suppose in your case you are saying you have a
SO-DIMM that you route both chip selects to and the SO-DIMM SPD tells
you whether it uses 1 or 2 of them.

Nikita may have comments on this as he's using board configurations
with multiple chip selects - I haven't needed that myself yet (but
will soon) so I've cc'd him.

Tim


More information about the U-Boot mailing list