[U-Boot] RAM burst mode problem

Mikhail Zaturenskiy mzaturenskiy.st at gmail.com
Wed Sep 2 23:58:07 CEST 2009


> Hello, I am working on a board similar to the EP88xC and am having
> trouble getting the sdram_table[] setup with the correct values (at
> least I think that's the problem).
>
> The board words fine if i burst-inhibit memc_or1 so I know single
> read/write works, but if I remove burst-inhibit, it results in a crash
> when U-Boot transfers itself from flash to RAM and jumps to the
> relocated code.
>
> My board uses the MPC875 processor and MT48LC16M16A2 for the RAM. The
> following is my current SDRAM table:
>
> static uint sdram_table[] = {
>        /* Single read  (offset 0x00 in UPM RAM) */
>        0x0F03C004, 0x0FFFC004, 0x00FCC004, 0x0FFFC000,
>        0x0FF30004, 0x0FFFC004, 0xFFFFC005, 0xFFFFC005,
>
>        /* Burst read   (offset 0x08 in UPM RAM) */
>        0x0F03C004, 0x0FFFC004, 0x00FCC004, 0x00FFC000,
>        0x00FFC000, 0x00FFC000, 0x00FFC000, 0x00FFC000,
>        0x00FFC000, 0x00FFC000, 0x0FF30000, 0x0FFFC004,
>        0xFFFFC005, 0xFFFFC005, 0xFFFFC005, 0xFFFFC005,
>
>        /* Single write (offset 0x18 in UPM RAM) */
>        0x0F03C004, 0x0FFFC004, 0x00FC0004, 0x0FFFC002,
>        0x0FF30004, 0X0FFFC004, 0xFFFFC005, 0xFFFFC005,
>
>        /* Burst write  (offset 0x20 in UPM RAM) */
>        0x0F03C004, 0x0FFFC004, 0x00FC0004, 0X00FFC000,
>        0x00FFC000, 0x00FFC000, 0x00FFC000, 0X00FFC000,
>        0x00FFC000, 0x00FFC000, 0x0FF30002, 0x0FFFC004,
>        0xFFFFC005, 0xFFFFC005, 0xFFFFC005, 0xFFFFC005,
>
>        /* Refresh      (offset 0x30 in UPM RAM) */
>        0x0FF0C004, 0x0FFFC004, 0x0FFFC004, 0x0FFFC004,
>        0xFFFFC005, 0x0FA30004, 0x0FFFC004, 0x0FF0C084,
>        0x0FFFC004, 0x0FFFC004, 0x0FFFC004, 0x0FFFC084,
>
>        /* Exception    (offset 0x3C in UPM RAM) */
>        0x0FFFC004, 0x0FF00004, 0x0FFFC004, 0xFFFFC005
> };
>
> And the following is my ram init function:
>
> phys_size_t initdram (int board_type)
> {
>        long int msize;
>        volatile immap_t     *immap  = (volatile immap_t *)CONFIG_SYS_IMMR;
>        volatile memctl8xx_t *memctl = &immap->im_memctl;
>
>        upmconfig(UPMA, sdram_table, sizeof(sdram_table) / sizeof(uint));
>
>        /* Configure SDRAM refresh */
>        memctl->memc_mptpr = MPTPR_PTP_DIV2; /* BRGCLK/2 */
>
>        memctl->memc_mamr = (65 << 24) | CONFIG_SYS_MAMR; /* No refresh */
>        udelay(100);
>
>        /* Run MRS pattern from location 0x35 */ // MZ - was 0x36
>        memctl->memc_mar = 0x46; // MZ - was 0x88
>        memctl->memc_mcr = 0x80002235; // MZ - was 0x80002236
>        udelay(100);
>
>        memctl->memc_mamr |=  MAMR_PTAE; /* Enable refresh */
>        memctl->memc_or1   = ~(CONFIG_SYS_SDRAM_MAX_SIZE - 1) | OR_CSNT_SAM;
> //      memctl->memc_or1   = ~(CONFIG_SYS_SDRAM_MAX_SIZE - 1) | OR_CSNT_SAM
> | OR_BI; // MZ - temp, burst inhibit
>        memctl->memc_br1   =  CONFIG_SYS_SDRAM_BASE | BR_PS_16 | BR_MS_UPMA | BR_V;
>
>        msize = get_ram_size(CONFIG_SYS_SDRAM_BASE, CONFIG_SYS_SDRAM_MAX_SIZE);
>        memctl->memc_or1  |= ~(msize - 1);
>
>        return msize;
> }
>
> Also attached is a spreadsheet which illustrates the RAM timing.
>
> Is there something wrong with my RAM table? Am I missing any flags?
> Something else wrong?
>
> Any ideas/suggestions are appreciated. Again, sorry for the first
> poorly-formatted post.
>
> Thank you,
> Mikhail Zaturenskiy
>

Anyone?


More information about the U-Boot mailing list