]> git.sur5r.net Git - u-boot/blobdiff - cpu/ppc4xx/44x_spd_ddr2.c
ppc4xx: Update 440SP/440SPe DDR SPD setup code to support 440SP
[u-boot] / cpu / ppc4xx / 44x_spd_ddr2.c
index fe0f2b6ea4e4ea89469d276db0ad578eb8488eb2..c4da739607cc6154d1a323f4263e5d203be4fe2c 100644 (file)
  * Defines
  *-----------------------------------------------------------------------------*/
 #ifndef        TRUE
-#define TRUE            1
+#define TRUE           1
 #endif
 #ifndef FALSE
-#define FALSE           0
+#define FALSE          0
 #endif
 
 #define SDRAM_DDR1     1
@@ -188,6 +188,7 @@ static void program_initplr(unsigned long *dimm_populated,
                             ddr_cas_id_t selected_cas,
                            int write_recovery);
 static unsigned long is_ecc_enabled(void);
+#ifdef CONFIG_DDR_ECC
 static void program_ecc(unsigned long *dimm_populated,
                        unsigned char *iic0_dimm_addr,
                        unsigned long num_dimm_banks,
@@ -195,13 +196,14 @@ static void program_ecc(unsigned long *dimm_populated,
 static void program_ecc_addr(unsigned long start_address,
                             unsigned long num_bytes,
                             unsigned long tlb_word2_i_value);
+#endif
 static void program_DQS_calibration(unsigned long *dimm_populated,
                                    unsigned char *iic0_dimm_addr,
                                    unsigned long num_dimm_banks);
 #ifdef HARD_CODED_DQS /* calibration test with hardvalues */
-static void          test(void);
+static void    test(void);
 #else
-static void          DQS_calibration_process(void);
+static void    DQS_calibration_process(void);
 #endif
 #if defined(DEBUG)
 static void ppc440sp_sdram_register_dump(void);
@@ -255,15 +257,6 @@ static void mtdcr_any(u32 dcr, u32 val)
        }
 }
 
-static void wait_ddr_idle(void)
-{
-       u32 val;
-
-       do {
-               mfsdram(SDRAM_MCSTAT, val);
-       } while ((val & SDRAM_MCSTAT_IDLE_MASK) == SDRAM_MCSTAT_IDLE_NOT);
-}
-
 static unsigned char spd_read(uchar chip, uint addr)
 {
        unsigned char data[2];
@@ -354,12 +347,12 @@ static unsigned long sdram_memsize(void)
  * .data sections.  It also cannot call routines that require these sections.
  *-----------------------------------------------------------------------------*/
 /*-----------------------------------------------------------------------------
- * Function:     initdram
+ * Function:    initdram
  * Description:  Configures SDRAM memory banks for DDR operation.
- *               Auto Memory Configuration option reads the DDR SDRAM EEPROMs
- *               via the IIC bus and then configures the DDR SDRAM memory
- *               banks appropriately. If Auto Memory Configuration is
- *               not used, it is assumed that no DIMM is plugged
+ *              Auto Memory Configuration option reads the DDR SDRAM EEPROMs
+ *              via the IIC bus and then configures the DDR SDRAM memory
+ *              banks appropriately. If Auto Memory Configuration is
+ *              not used, it is assumed that no DIMM is plugged
  *-----------------------------------------------------------------------------*/
 long int initdram(int board_type)
 {
@@ -491,7 +484,7 @@ long int initdram(int board_type)
                (val & ~(SDRAM_MEMODE_DIC_MASK  | SDRAM_MEMODE_DLL_MASK |
                         SDRAM_MEMODE_RTT_MASK | SDRAM_MEMODE_DQS_MASK)) |
                (SDRAM_MEMODE_DIC_NORMAL | SDRAM_MEMODE_DLL_ENABLE
-                | SDRAM_MEMODE_RTT_75OHM | SDRAM_MEMODE_DQS_ENABLE));
+                | SDRAM_MEMODE_RTT_150OHM | SDRAM_MEMODE_DQS_ENABLE));
 
        /*------------------------------------------------------------------
         * Program Initialization preload registers.
@@ -537,10 +530,12 @@ long int initdram(int board_type)
         *-----------------------------------------------------------------*/
        program_DQS_calibration(dimm_populated, iic0_dimm_addr, num_dimm_banks);
 
+#ifdef CONFIG_DDR_ECC
        /*------------------------------------------------------------------
         * If ecc is enabled, initialize the parity bits.
         *-----------------------------------------------------------------*/
        program_ecc(dimm_populated, iic0_dimm_addr, num_dimm_banks, MY_TLB_WORD2_I_ENABLE);
+#endif
 
 #ifdef DEBUG
        ppc440sp_sdram_register_dump();
@@ -589,10 +584,10 @@ static void get_spd_info(unsigned long *dimm_populated,
 #ifdef CONFIG_ADD_RAM_INFO
 void board_add_ram_info(int use_default)
 {
-        if (is_ecc_enabled())
-                puts(" (ECC enabled)");
-        else
-                puts(" (ECC not enabled)");
+       if (is_ecc_enabled())
+               puts(" (ECC enabled)");
+       else
+               puts(" (ECC not enabled)");
 }
 #endif
 
@@ -702,7 +697,7 @@ static void check_frequency(unsigned long *dimm_populated,
         *-----------------------------------------------------------------*/
        get_sys_info(&board_cfg);
 
-       mfsdr(sdr_ddr0, sdr_ddrpll);
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
        sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
 
        /*
@@ -877,7 +872,11 @@ static void program_copt1(unsigned long *dimm_populated,
        unsigned long ddrtype;
        unsigned long val;
 
+#ifdef CONFIG_DDR_ECC
        ecc_enabled = TRUE;
+#else
+       ecc_enabled = FALSE;
+#endif
        dimm_32bit = FALSE;
        dimm_64bit = FALSE;
        buf0 = FALSE;
@@ -1165,7 +1164,7 @@ static void program_initplr(unsigned long *dimm_populated,
 
        /******************************************************
         ** Assumption: if more than one DIMM, all DIMMs are the same
-        **             as already checked in check_memory_type
+        **             as already checked in check_memory_type
         ******************************************************/
 
        if ((dimm_populated[0] == SDRAM_DDR1) || (dimm_populated[1] == SDRAM_DDR1)) {
@@ -1314,7 +1313,7 @@ static void program_mode(unsigned long *dimm_populated,
         *-----------------------------------------------------------------*/
        get_sys_info(&board_cfg);
 
-       mfsdr(sdr_ddr0, sdr_ddrpll);
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
        sdram_freq = MULDIV64((board_cfg.freqPLB), SDR0_DDR0_DDRM_DECODE(sdr_ddrpll), 1);
 
        /*------------------------------------------------------------------
@@ -1463,11 +1462,12 @@ static void program_mode(unsigned long *dimm_populated,
        mfsdram(SDRAM_MMODE, mmode);
        mmode = mmode & ~(SDRAM_MMODE_WR_MASK | SDRAM_MMODE_DCL_MASK);
 
-       cycle_2_0_clk = MULDIV64(ONE_BILLION, 100, max_2_0_tcyc_ns_x_100);
-       cycle_2_5_clk = MULDIV64(ONE_BILLION, 100, max_2_5_tcyc_ns_x_100);
-       cycle_3_0_clk = MULDIV64(ONE_BILLION, 100, max_3_0_tcyc_ns_x_100);
-       cycle_4_0_clk = MULDIV64(ONE_BILLION, 100, max_4_0_tcyc_ns_x_100);
-       cycle_5_0_clk = MULDIV64(ONE_BILLION, 100, max_5_0_tcyc_ns_x_100);
+       /* add 10 here because of rounding problems */
+       cycle_2_0_clk = MULDIV64(ONE_BILLION, 100, max_2_0_tcyc_ns_x_100) + 10;
+       cycle_2_5_clk = MULDIV64(ONE_BILLION, 100, max_2_5_tcyc_ns_x_100) + 10;
+       cycle_3_0_clk = MULDIV64(ONE_BILLION, 100, max_3_0_tcyc_ns_x_100) + 10;
+       cycle_4_0_clk = MULDIV64(ONE_BILLION, 100, max_4_0_tcyc_ns_x_100) + 10;
+       cycle_5_0_clk = MULDIV64(ONE_BILLION, 100, max_5_0_tcyc_ns_x_100) + 10;
 
        if (sdram_ddr1 == TRUE) { /* DDR1 */
                if ((cas_2_0_available == TRUE) && (sdram_freq <= cycle_2_0_clk)) {
@@ -1498,7 +1498,11 @@ static void program_mode(unsigned long *dimm_populated,
                } else {
                        printf("ERROR: Cannot find a supported CAS latency with the installed DIMMs.\n");
                        printf("Only DIMMs DDR2 with CAS latencies of 3.0, 4.0, and 5.0 are supported.\n");
-                       printf("Make sure the PLB speed is within the supported range of the DIMMs.\n\n");
+                       printf("Make sure the PLB speed is within the supported range of the DIMMs.\n");
+                       printf("cas3=%d cas4=%d cas5=%d\n",
+                              cas_3_0_available, cas_4_0_available, cas_5_0_available);
+                       printf("sdram_freq=%d cycle3=%d cycle4=%d cycle5=%d\n\n",
+                              sdram_freq, cycle_3_0_clk, cycle_4_0_clk, cycle_5_0_clk);
                        hang();
                }
        }
@@ -1575,7 +1579,7 @@ static void program_rtr(unsigned long *dimm_populated,
        /*------------------------------------------------------------------
         * Set the SDRAM Refresh Timing Register, SDRAM_RTR
         *-----------------------------------------------------------------*/
-       mfsdr(sdr_ddr0, sdr_ddrpll);
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
        sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
 
        max_refresh_rate = 0;
@@ -1661,7 +1665,7 @@ static void program_tr(unsigned long *dimm_populated,
         *-----------------------------------------------------------------*/
        get_sys_info(&board_cfg);
 
-       mfsdr(sdr_ddr0, sdr_ddrpll);
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
        sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
 
        /*------------------------------------------------------------------
@@ -2069,7 +2073,7 @@ static void program_memory_queue(unsigned long *dimm_populated,
                         * Set the sizes
                         *-----------------------------------------------------------------*/
                        baseadd_size = 0;
-                       rank_size_bytes = 1024 * 1024 * rank_size_id;
+                       rank_size_bytes = 4 * 1024 * 1024 * rank_size_id;
                        switch (rank_size_id) {
                        case 0x02:
                                baseadd_size |= SDRAM_RXBAS_SDSZ_8;
@@ -2106,8 +2110,8 @@ static void program_memory_queue(unsigned long *dimm_populated,
 
                        for (i = 0; i < num_ranks; i++) {
                                mtdcr_any(rank_reg+i+dimm_num+bank_0_populated,
-                                         (rank_base_addr & SDRAM_RXBAS_SDBA_MASK) |
-                                         baseadd_size);
+                                         (SDRAM_RXBAS_SDBA_ENCODE(rank_base_addr) |
+                                          baseadd_size));
                                rank_base_addr += rank_size_bytes;
                        }
                }
@@ -2130,9 +2134,10 @@ static unsigned long is_ecc_enabled(void)
                ecc = max(ecc, SDRAM_MCOPT1_MCHK_CHK_DECODE(val));
        }
 
-       return(ecc);
+       return ecc;
 }
 
+#ifdef CONFIG_DDR_ECC
 /*-----------------------------------------------------------------------------+
  * program_ecc.
  *-----------------------------------------------------------------------------*/
@@ -2208,6 +2213,15 @@ static void check_ecc(void)
 }
 #endif
 
+static void wait_ddr_idle(void)
+{
+       u32 val;
+
+       do {
+               mfsdram(SDRAM_MCSTAT, val);
+       } while ((val & SDRAM_MCSTAT_IDLE_MASK) == SDRAM_MCSTAT_IDLE_NOT);
+}
+
 /*-----------------------------------------------------------------------------+
  * program_ecc_addr.
  *-----------------------------------------------------------------------------*/
@@ -2276,6 +2290,7 @@ static void program_ecc_addr(unsigned long start_address,
 #endif
        }
 }
+#endif
 
 /*-----------------------------------------------------------------------------+
  * program_DQS_calibration.
@@ -2531,7 +2546,6 @@ static void DQS_calibration_process(void)
                }
        }               /* for rffd */
 
-
        /*------------------------------------------------------------------
         * Set the average RFFD value
         *-----------------------------------------------------------------*/