Table of interleaving 2-4 controllers ===================================== +--------------+-----------------------------------------------------------+ |Configuration | Memory Controller | | | 1 2 3 4 | |--------------+--------------+--------------+-----------------------------+ | Two memory | Not Intlv'ed | Not Intlv'ed | | | complexes +--------------+--------------+ | | | 2-way Intlv'ed | | |--------------+--------------+--------------+--------------+ | | | Not Intlv'ed | Not Intlv'ed | Not Intlv'ed | | | Three memory +--------------+--------------+--------------+ | | complexes | 2-way Intlv'ed | Not Intlv'ed | | | +-----------------------------+--------------+ | | | 3-way Intlv'ed | | +--------------+--------------+--------------+--------------+--------------+ | | Not Intlv'ed | Not Intlv'ed | Not Intlv'ed | Not Intlv'ed | | Four memory +--------------+--------------+--------------+--------------+ | complexes | 2-way Intlv'ed | 2-way Intlv'ed | | +-----------------------------+-----------------------------+ | | 4-way Intlv'ed | +--------------+-----------------------------------------------------------+ Table of 2-way interleaving modes supported in cpu/8xxx/ddr/ ====================================================== +-------------+---------------------------------------------------------+ | | Rank Interleaving | | +--------+-----------+-----------+------------+-----------+ |Memory | | | | 2x2 | 4x1 | |Controller | None | 2x1 lower | 2x1 upper | {CS0+CS1}, | {CS0+CS1+ | |Interleaving | | {CS0+CS1} | {CS2+CS3} | {CS2+CS3} | CS2+CS3} | +-------------+--------+-----------+-----------+------------+-----------+ |None | Yes | Yes | Yes | Yes | Yes | +-------------+--------+-----------+-----------+------------+-----------+ |Cacheline | Yes | Yes | No | No, Only(*)| Yes | | |CS0 Only| | | {CS0+CS1} | | +-------------+--------+-----------+-----------+------------+-----------+ |Page | Yes | Yes | No | No, Only(*)| Yes | | |CS0 Only| | | {CS0+CS1} | | +-------------+--------+-----------+-----------+------------+-----------+ |Bank | Yes | Yes | No | No, Only(*)| Yes | | |CS0 Only| | | {CS0+CS1} | | +-------------+--------+-----------+-----------+------------+-----------+ |Superbank | No | Yes | No | No, Only(*)| Yes | | | | | | {CS0+CS1} | | +-------------+--------+-----------+-----------+------------+-----------+ (*) Although the hardware can be configured with memory controller interleaving using "2x2" rank interleaving, it only interleaves {CS0+CS1} from each controller. {CS2+CS3} on each controller are only rank interleaved on that controller. For memory controller interleaving, identical DIMMs are suggested. Software doesn't check the size or organization of interleaved DIMMs. The ways to configure the ddr interleaving mode ============================================== 1. In board header file(e.g.MPC8572DS.h), add default interleaving setting under "CONFIG_EXTRA_ENV_SETTINGS", like: #define CONFIG_EXTRA_ENV_SETTINGS \ "hwconfig=fsl_ddr:ctlr_intlv=bank" \ ...... 2. Run U-Boot "setenv" command to configure the memory interleaving mode. Either numerical or string value is accepted. # disable memory controller interleaving setenv hwconfig "fsl_ddr:ctlr_intlv=null" # cacheline interleaving setenv hwconfig "fsl_ddr:ctlr_intlv=cacheline" # page interleaving setenv hwconfig "fsl_ddr:ctlr_intlv=page" # bank interleaving setenv hwconfig "fsl_ddr:ctlr_intlv=bank" # superbank setenv hwconfig "fsl_ddr:ctlr_intlv=superbank" # 1KB 3-way interleaving setenv hwconfig "fsl_ddr:ctlr_intlv=3way_1KB" # 4KB 3-way interleaving setenv hwconfig "fsl_ddr:ctlr_intlv=3way_4KB" # 8KB 3-way interleaving setenv hwconfig "fsl_ddr:ctlr_intlv=3way_8KB" # disable bank (chip-select) interleaving setenv hwconfig "fsl_ddr:bank_intlv=null" # bank(chip-select) interleaving cs0+cs1 setenv hwconfig "fsl_ddr:bank_intlv=cs0_cs1" # bank(chip-select) interleaving cs2+cs3 setenv hwconfig "fsl_ddr:bank_intlv=cs2_cs3" # bank(chip-select) interleaving (cs0+cs1) and (cs2+cs3) (2x2) setenv hwconfig "fsl_ddr:bank_intlv=cs0_cs1_and_cs2_cs3" # bank(chip-select) interleaving (cs0+cs1+cs2+cs3) (4x1) setenv hwconfig "fsl_ddr:bank_intlv=cs0_cs1_cs2_cs3" # bank(chip-select) interleaving (auto) setenv hwconfig "fsl_ddr:bank_intlv=auto" This auto mode only select from cs0_cs1_cs2_cs3, cs0_cs1, null dependings on DIMMs. Memory controller address hashing ================================== If the DDR controller supports address hashing, it can be enabled by hwconfig. Syntax is: hwconfig=fsl_ddr:addr_hash=true Memory controller ECC on/off ============================ If ECC is enabled in board configuratoin file, i.e. #define CONFIG_DDR_ECC, ECC can be turned on/off by hwconfig. Syntax is hwconfig=fsl_ddr:ecc=off Memory address parity on/off ============================ address parity can be turned on/off by hwconfig. Syntax is: hwconfig=fsl_ddr:parity=on Memory testing options for mpc85xx ================================== 1. Memory test can be done once U-Boot prompt comes up using mtest, or 2. Memory test can be done with Power-On-Self-Test function, activated at compile time. In order to enable the POST memory test, CONFIG_POST needs to be defined in board configuraiton header file. By default, POST memory test performs a fast test. A slow test can be enabled by changing the flag at compiling time. To test memory bigger than 2GB, 36BIT support is needed. Memory is tested within a 2GB window. TLBs are used to map the virtual 2GB window to physical address so that all physical memory can be tested. Combination of hwconfig ======================= Hwconfig can be combined with multiple parameters, for example, on a supported platform hwconfig=fsl_ddr:addr_hash=true,ctlr_intlv=cacheline,bank_intlv=cs0_cs1_cs2_cs3,ecc=on Table for dynamic ODT for DDR3 ============================== For single-slot system with quad-rank DIMM and dual-slot system, dynamic ODT may be needed, depending on the configuration. The numbers in the following tables are in Ohms. * denotes dynamic ODT Two slots system +-----------------------+----------+---------------+-----------------------------+-----------------------------+ | Configuration | |DRAM controller| Slot 1 | Slot 2 | +-----------+-----------+----------+-------+-------+--------------+--------------+--------------+--------------+ | | | | | | Rank 1 | Rank 2 | Rank 1 | Rank 2 | + Slot 1 | Slot 2 |Write/Read| Write | Read |-------+------+-------+------+-------+------+-------+------+ | | | | | | Write | Read | Write | Read | Write | Read | Write | Read | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 1 | off | 75 | 120 | off | off | off | off | off | 30 | 30 | | Dual Rank | Dual Rank |----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 2 | off | 75 | off | off | 30 | 30 | 120 | off | off | off | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 1 | off | 75 | 120 | off | off | off | 20 | 20 | | | | Dual Rank |Single Rank|----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 2 | off | 75 | off | off | 20 | 20 | 120 *| off | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 1 | off | 75 | 120 *| off | | | off | off | 20 | 20 | |Single Rank| Dual Rank |----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 2 | off | 75 | 20 | 20 | | | 120 | off | off | off | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 1 | off | 75 | 120 *| off | | | 30 | 30 | | | |Single Rank|Single Rank|----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 2 | off | 75 | 30 | 30 | | | 120 *| off | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | Dual Rank | Empty | Slot 1 | off | 75 | 40 | off | off | off | | | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | Empty | Dual Rank | Slot 2 | off | 75 | | | | | 40 | off | off | off | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ |Single Rank| Empty | Slot 1 | off | 75 | 40 | off | | | | | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | Empty |Single Rank| Slot 2 | off | 75 | | | | | 40 | off | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ Single slot system +-------------+------------+---------------+-----------------------------+-----------------------------+ | | |DRAM controller| Rank 1 | Rank 2 | Rank 3 | Rank 4 | |Configuration| Write/Read |-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Write | Read | Write | Read | Write | Read | Write | Read | Write | Read | +-------------+------------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | R1 | off | 75 | 120 *| off | off | off | 20 | 20 | off | off | | |------------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | R2 | off | 75 | off | 20 | 120 | off | 20 | 20 | off | off | | Quad Rank |------------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | R3 | off | 75 | 20 | 20 | off | off | 120 *| off | off | off | | |------------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | R4 | off | 75 | 20 | 20 | off | off | off | 20 | 120 | off | +-------------+------------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | R1 | off | 75 | 40 | off | off | off | | Dual Rank |------------+-------+-------+-------+------+-------+------+ | | R2 | off | 75 | 40 | off | off | off | +-------------+------------+-------+-------+-------+------+-------+------+ | Single Rank | R1 | off | 75 | 40 | off | +-------------+------------+-------+-------+-------+------+ Reference http://www.xrosstalkmag.com/mag_issues/xrosstalk_oct08_final.pdf http://download.micron.com/pdf/technotes/ddr3/tn4108_ddr3_design_guide.pdf Table for ODT for DDR2 ====================== Two slots system +-----------------------+----------+---------------+-----------------------------+-----------------------------+ | Configuration | |DRAM controller| Slot 1 | Slot 2 | +-----------+-----------+----------+-------+-------+--------------+--------------+--------------+--------------+ | | | | | | Rank 1 | Rank 2 | Rank 1 | Rank 2 | + Slot 1 | Slot 2 |Write/Read| Write | Read |-------+------+-------+------+-------+------+-------+------+ | | | | | | Write | Read | Write | Read | Write | Read | Write | Read | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 1 | off | 150 | off | off | off | off | 75 | 75 | off | off | | Dual Rank | Dual Rank |----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 2 | off | 150 | 75 | 75 | off | off | off | off | off | off | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 1 | off | 150 | off | off | off | off | 75 | 75 | | | | Dual Rank |Single Rank|----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 2 | off | 150 | 75 | 75 | off | off | off | off | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 1 | off | 150 | off | off | | | 75 | 75 | off | off | |Single Rank| Dual Rank |----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 2 | off | 150 | 75 | 75 | | | off | off | off | off | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 1 | off | 150 | off | off | | | 75 | 75 | | | |Single Rank|Single Rank|----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | | | Slot 2 | off | 150 | 75 | 75 | | | off | off | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | Dual Rank | Empty | Slot 1 | off | 75 | 150 | off | off | off | | | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | Empty | Dual Rank | Slot 2 | off | 75 | | | | | 150 | off | off | off | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ |Single Rank| Empty | Slot 1 | off | 75 | 150 | off | | | | | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ | Empty |Single Rank| Slot 2 | off | 75 | | | | | 150 | off | | | +-----------+-----------+----------+-------+-------+-------+------+-------+------+-------+------+-------+------+ Single slot system +-------------+------------+---------------+-----------------------------+ | | |DRAM controller| Rank 1 | Rank 2 | |Configuration| Write/Read |-------+-------+-------+------+-------+------+ | | | Write | Read | Write | Read | Write | Read | +-------------+------------+-------+-------+-------+------+-------+------+ | | R1 | off | 75 | 150 | off | off | off | | Dual Rank |------------+-------+-------+-------+------+-------+------+ | | R2 | off | 75 | 150 | off | off | off | +-------------+------------+-------+-------+-------+------+-------+------+ | Single Rank | R1 | off | 75 | 150 | off | +-------------+------------+-------+-------+-------+------+ Reference http://www.samsung.com/global/business/semiconductor/products/dram/downloads/applicationnote/ddr2_odt_control_200603.pdf Interactive DDR debugging =========================== For DDR parameter tuning up and debugging, the interactive DDR debugger can be activated by setting the environment variable "ddr_interactive" to any value. (The value of ddr_interactive may have a meaning in the future, but, for now, the presence of the variable will cause the debugger to run.) Once activated, U-Boot will show the prompt "FSL DDR>" before enabling the DDR controller. The available commands are printed by typing "help". Another way to enter the interactive DDR debugger without setting the environment variable is to send the 'd' character early during the boot process. To save booting time, no additional delay is added, so the window to send the key press is very short -- basically, it is the time before the memory controller code starts to run. For example, when rebooting from within U-Boot, the user must press 'd' IMMEDIATELY after hitting enter to initiate a 'reset' command. In case of power on/reset, the user can hold down the 'd' key while applying power or hitting the board's reset button. The example flow of using interactive debugging is type command "compute" to calculate the parameters from the default type command "print" with arguments to show SPD, options, registers type command "edit" with arguments to change any if desired type command "copy" with arguments to copy controller/dimm settings type command "go" to continue calculation and enable DDR controller Additional commands to restart the debugging are: type command "reset" to reset the board type command "recompute" to reload SPD and start over Note, check "next_step" to show the flow. For example, after edit opts, the next_step is STEP_ASSIGN_ADDRESSES. After editing registers, the next_step is STEP_PROGRAM_REGS. Upon issuing command "go", the debugger will program the DDR controller with the current setting without further calculation and then exit to resume the booting of the machine. The detail syntax for each commands are print [c<n>] [d<n>] [spd] [dimmparms] [commonparms] [opts] [addresses] [regs] c<n> - the controller number, eg. c0, c1 d<n> - the DIMM number, eg. d0, d1 spd - print SPD data dimmparms - DIMM parameters, calculated from SPD commonparms - lowest common parameters for all DIMMs opts - options addresses - address assignment (not implemented yet) regs - controller registers edit <c#> <d#> <spd|dimmparms|commonparms|opts|addresses|regs> <element> <value> c<n> - the controller number, eg. c0, c1 d<n> - the DIMM number, eg. d0, d1 spd - print SPD data dimmparms - DIMM parameters, calculated from SPD commonparms - lowest common parameters for all DIMMs opts - options addresses - address assignment (not implemented yet) regs - controller registers <element> - name of the modified element byte number if the object is SPD <value> - decimal or heximal (prefixed with 0x) numbers copy <src c#> <src d#> <spd|dimmparms|commonparms|opts|addresses|regs> <dst c#> <dst d#> same as for "edit" command DIMM numbers ignored for commonparms, opts, and regs reset no arguement - reset the board recompute no argument - reload SPD and start over compute no argument - recompute from current next_step next_step no argument - show current next_step help no argument - print a list of all commands go no argument - program memory controller(s) and continue with U-Boot Examples of debugging flow FSL DDR>compute Detected UDIMM UG51U6400N8SU-ACF FSL DDR>print print [c<n>] [d<n>] [spd] [dimmparms] [commonparms] [opts] [addresses] [regs] FSL DDR>print dimmparms DIMM parameters: Controller=0 DIMM=0 DIMM organization parameters: module part name = UG51U6400N8SU-ACF rank_density = 2147483648 bytes (2048 megabytes) capacity = 4294967296 bytes (4096 megabytes) burst_lengths_bitmask = 0C base_addresss = 0 (00000000 00000000) n_ranks = 2 data_width = 64 primary_sdram_width = 64 ec_sdram_width = 0 registered_dimm = 0 n_row_addr = 15 n_col_addr = 10 edc_config = 0 n_banks_per_sdram_device = 8 tCKmin_X_ps = 1500 tCKmin_X_minus_1_ps = 0 tCKmin_X_minus_2_ps = 0 tCKmax_ps = 0 caslat_X = 960 tAA_ps = 13125 caslat_X_minus_1 = 0 caslat_X_minus_2 = 0 caslat_lowest_derated = 0 tRCD_ps = 13125 tRP_ps = 13125 tRAS_ps = 36000 tWR_ps = 15000 tWTR_ps = 7500 tRFC_ps = 160000 tRRD_ps = 6000 tRC_ps = 49125 refresh_rate_ps = 7800000 tIS_ps = 0 tIH_ps = 0 tDS_ps = 0 tDH_ps = 0 tRTP_ps = 7500 tDQSQ_max_ps = 0 tQHS_ps = 0 FSL DDR>edit c0 opts ECC_mode 0 FSL DDR>edit c0 regs cs0_bnds 0x000000FF FSL DDR>go 2 GiB left unmapped 4 GiB (DDR3, 64-bit, CL=9, ECC off) DDR Chip-Select Interleaving Mode: CS0+CS1 Testing 0x00000000 - 0x7fffffff Testing 0x80000000 - 0xffffffff Remap DDR 2 GiB left unmapped POST memory PASSED Flash: 128 MiB L2: 128 KB enabled Corenet Platform Cache: 1024 KB enabled SERDES: timeout resetting bank 3 SRIO1: disabled SRIO2: disabled MMC: FSL_ESDHC: 0 EEPROM: Invalid ID (ff ff ff ff) PCIe1: disabled PCIe2: Root Complex, x1, regs @ 0xfe201000 01:00.0 - 8086:10d3 - Network controller PCIe2: Bus 00 - 01 PCIe3: disabled In: serial Out: serial Err: serial Net: Initializing Fman Fman1: Uploading microcode version 101.8.0 e1000: 00:1b:21:81:d2:e0 FM1@DTSEC1, FM1@DTSEC2, FM1@DTSEC3, FM1@DTSEC4, FM1@DTSEC5, e1000#0 [PRIME] Warning: e1000#0 MAC addresses don't match: Address in SROM is 00:1b:21:81:d2:e0 Address in environment is 00:e0:0c:00:ea:05 Hit any key to stop autoboot: 0 =>