[U-Boot] Memory size detection on P1011

York Sun yorksun at freescale.com
Thu May 5 15:29:28 CEST 2011


Felix,

On Thu, 2011-05-05 at 16:17 +0300, Felix Radensky wrote:
> Hi,
> 
> I'm working on a custom board based on P1011.
> There are 2 board flavours, with either 128MB or 256MB of soldered
> DDR2 SDRAM. Having u-boot image per board works fine, but I'd like
> to have a single image and use get_ram_size() to detect memory size
> at runtime. So far I had no luck.
> 
> The only significant difference between memory devices on these boards
> is the number of banks: 4 banks on 128MB board and 8 banks on 256MB
> board.
> 
> The memory size detection logic is loosely based on the code in
> boards/tqc/tqm85xx/sdram.c, but I use fsl_ddr_set_memctl_regs()
> to configure DDR controller registers and enable the controller.
> The sequence is:
> 
> 1. Configure TLBs for 2GB DDR
> 2. Configure LAWs for 2GB DDR
> 3. Configure DDR controller registers and enable DDR controller,
>      CS0_BNDS is set to 256MB.
> 4. Iterate over possible memory sizes starting from the largest.
>      Each iteration configures CS0_CONFIG (sets number of banks, rows 
> and columns)
>      and runs get_ram_size()
> 
> What I observe on 128MB board, is that only 32KB of RAM is detected in 
> both
> first and second iteration. So it seems that setting number of banks 
> to 8 on
> 4-bank devices is fatal, and cannot be changed even if CS0_CONFIG is 
> modified.
> 
> I've tried to rerun DDR controller initialization sequence with new 
> CS0_CONFIG
> value, but that just hangs the board. I've also tried to disable DDR 
> controller via
> RORDEVDISR register and then enable it and reconfigure DDR. That also 
> leads
> to hang.
> 
> I hope Freescale gurus on the list can help me to find a solution.
> 
> Thanks in advance.
> 

I don't think get_ram_size works for your case. If you want to test the
DDR to find the correct size, you have to initialize the DDR first. But
you cannot do this correctly without knowing the number of banks. You
may be able to blindly set the bank number and test the DDR to catch the
error if there is any, but you have to run this code somewhere else, for
example, in the flash (before relocation).

There might be another way. Do you have any board ID to distinguish
these two kinds?

York





More information about the U-Boot mailing list