Regression detecting memory size on PPC440EPx

Mike Nuss mike at terascala.com
Tue Oct 6 02:44:07 EST 2009


(top-posting corrected)

Mikhail Zolotaryov wrote:
> Mike Nuss wrote:
>> There was a fix a while back called "Correct memory size calculation
>> for Denali based boards" that corrected the data width detection in
>> the 4xx bootwrapper. 
>> 
>> This seems to have had the unintended consequence of exposing another
>> bug in the same code.  I have a board very similar to Sequoia, except
>> that it uses a DDR2 DIMM module.  It uses a single 256MB DIMM.  After
>> upgrading to the latest kernel, which includes the previously
>> mentioned fix, U-Boot works fine, but the kernel detects 512MB
>> instead, and of course, the kernel panics. 
>> 
>> The error seems to be in the calculation of row bits.  U-Boot's SPD
>> detection says that the DIMM uses 13 bits, but I added some
>> printf()s to the bootwrapper, and it is setting row to 14 instead. 
>> I'm not too clear on how this code works; it calculates the row bits
>> by subtracting the row from max_row, and maybe max_row is wrong?
>
> Hi Mike,
> 
> Address width calculation is based on the DDR-controller configuration
> set by the bootloader. It would be helpful for further discussion if
> you could send DDR0_00..DDR0_44 register values and memory
> configuration used (no of banks, bank size, I/O width) to check
> calculations. Thanks. 
> 
> P.S. Sequoia board also has DDR2 SDRAM from Micron.
> 
> Best regards,
> Mikhail Zolotaryov

Thanks for your reply.

Here is the dump from U-Boot during intialization with DEBUG turned on
in the denali code:

  Register Dump:
        DDR0_00 = 0x0000190A        DDR0_01 = 0x010000FF
        DDR0_02 = 0x020C0E00        DDR0_03 = 0x02030602
        DDR0_04 = 0x0A020200        DDR0_05 = 0x02020308
        DDR0_06 = 0x0102C812        DDR0_07 = 0x000D0100
        DDR0_08 = 0x02C80001        DDR0_09 = 0x00011D5F
        DDR0_10 = 0x00000100        DDR0_11 = 0x0022C800
        DDR0_12 = 0x00000003        DDR0_14 = 0x00000000
        DDR0_17 = 0x19000000        DDR0_18 = 0x19191919
        DDR0_19 = 0x19191919        DDR0_20 = 0x0B0B0B0B
        DDR0_21 = 0x0B0B0B0B        DDR0_22 = 0x00267F0B
        DDR0_23 = 0x00000000        DDR0_24 = 0x01020001
        DDR0_25 = 0x20410000        DDR0_26 = 0x2DB40514
        DDR0_27 = 0x00008236        DDR0_28 = 0x00000000
        DDR0_31 = 0x00000000        DDR0_32 = 0x00000000
        DDR0_33 = 0x00000000        DDR0_34 = 0x00000000
        DDR0_35 = 0x00000000        DDR0_36 = 0x00000000
        DDR0_37 = 0x00000000        DDR0_38 = 0x00000000
        DDR0_39 = 0x00000000        DDR0_40 = 0x00000000
        DDR0_41 = 0x00000000        DDR0_42 = 0x00000006
        DDR0_43 = 0x030A0200        DDR0_44 = 0x00000003
dram_size = 268435456

  Register Dump:
        DDR0_00 = 0x00C0190A        DDR0_01 = 0x010000FF
        DDR0_02 = 0x020C0E01        DDR0_03 = 0x02030602
        DDR0_04 = 0x0A020200        DDR0_05 = 0x02020308
        DDR0_06 = 0x0102C812        DDR0_07 = 0x000D0100
        DDR0_08 = 0x02C80001        DDR0_09 = 0x00011D5E
        DDR0_10 = 0x00000100        DDR0_11 = 0x0022C800
        DDR0_12 = 0x00000003        DDR0_14 = 0x00000000
        DDR0_17 = 0x1E014800        DDR0_18 = 0x1E1E1E1E
        DDR0_19 = 0x1E1E1E1E        DDR0_20 = 0x0B0B0B0B
        DDR0_21 = 0x0B0B0B0B        DDR0_22 = 0x00267E0B
        DDR0_23 = 0x00000000        DDR0_24 = 0x01020001
        DDR0_25 = 0x20410000        DDR0_26 = 0x2DB40514
        DDR0_27 = 0x00008236        DDR0_28 = 0x00000000
        DDR0_31 = 0x00000000        DDR0_32 = 0x00000000
        DDR0_33 = 0x00000000        DDR0_34 = 0x00000000
        DDR0_35 = 0x00000000        DDR0_36 = 0x00000000
        DDR0_37 = 0x00000000        DDR0_38 = 0x00000000
        DDR0_39 = 0x00000000        DDR0_40 = 0x00000000
        DDR0_41 = 0x00000000        DDR0_42 = 0x00000006
        DDR0_43 = 0x030A0200        DDR0_44 = 0x00000003
Zeroing SDRAM...Completed
256 MB (ECC not enabled, 333 MHz, CL3)


Here is the memory configuration:
SPD data revision            1.2
Bytes used                   0x80
Serial memory size           0x100
Memory type                  DDR2
Row address bits             13
Column address bits          10
Number of ranks              1
Module data width            64 bits
Interface signal levels      SSTL 1.8 V
SDRAM cycle time             3.0 ns
SDRAM access time            0.45 ns
EDC configuration            None
Self refresh, rate           7.8 us
SDRAM width (primary)        16
Burst length(s)              8 4
Number of banks              4
CAS latency(s)               5 4 3
Module attributes:
  0 PLLs on DIMM
  Supports 50 ohm ODT
  Supports weak driver
SDRAM cycle time (2nd highest CAS latency)        3.75 ns
SDRAM access from clock (2nd highest CAS latency) 0.45 ns
SDRAM cycle time (3rd highest CAS latency)        5.0 ns
SDRAM access from clock (3rd highest CAS latency) 0.45 ns
Minimum row precharge        15.00 ns
Row active to row active min 10.00 ns
RAS to CAS delay min         15.00 ns
Minimum RAS pulse width      45 ns
Density of each row          256 MiB
Command and Address setup    0.20 ns
Command and Address hold     0.27 ns
Data signal input setup      0.10 ns
Data signal input hold       0.17 ns
Manufacturer's JEDEC ID      2C 00 00 00 00 00 00 00
Manufacturing Location       08
Manufacturer's Part Number   34 48 54 46 33 32 36 34 48 59 2D 36 36 37
44 33 20 20
Revision Code                03 00
Manufacturing Date           07 32
Assembly Serial Number       D3 23 09 9E


Here is the bootwrapper output on startup (everything except the last
line is from printf()s added by me):

real_cs:1
cs:1
dpath bytes:8
row:14
col:10
banks:4
memsize:536870912
memsize (errata):536866816
Memory <- <0x0 0x0 0x1ffff000> (511MB)

Note 511MB is obviously wrong. "row" differs from "Row address bits"
from U-Boot, which is where I guess the problem lies.

Thanks,
Mike


More information about the Linuxppc-dev mailing list