ppc4xx: Update 440SP/440SPe DDR SPD setup code to support 440SP

Signed-off-by: Stefan Roese <sr@denx.de>
This commit is contained in:
Stefan Roese 2007-03-08 10:06:09 +01:00
parent fdd1d6dcc9
commit df29449747
2 changed files with 63 additions and 26 deletions

View file

@ -188,6 +188,7 @@ static void program_initplr(unsigned long *dimm_populated,
ddr_cas_id_t selected_cas, ddr_cas_id_t selected_cas,
int write_recovery); int write_recovery);
static unsigned long is_ecc_enabled(void); static unsigned long is_ecc_enabled(void);
#ifdef CONFIG_DDR_ECC
static void program_ecc(unsigned long *dimm_populated, static void program_ecc(unsigned long *dimm_populated,
unsigned char *iic0_dimm_addr, unsigned char *iic0_dimm_addr,
unsigned long num_dimm_banks, unsigned long num_dimm_banks,
@ -195,6 +196,7 @@ static void program_ecc(unsigned long *dimm_populated,
static void program_ecc_addr(unsigned long start_address, static void program_ecc_addr(unsigned long start_address,
unsigned long num_bytes, unsigned long num_bytes,
unsigned long tlb_word2_i_value); unsigned long tlb_word2_i_value);
#endif
static void program_DQS_calibration(unsigned long *dimm_populated, static void program_DQS_calibration(unsigned long *dimm_populated,
unsigned char *iic0_dimm_addr, unsigned char *iic0_dimm_addr,
unsigned long num_dimm_banks); unsigned long num_dimm_banks);
@ -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) static unsigned char spd_read(uchar chip, uint addr)
{ {
unsigned char data[2]; unsigned char data[2];
@ -491,7 +484,7 @@ long int initdram(int board_type)
(val & ~(SDRAM_MEMODE_DIC_MASK | SDRAM_MEMODE_DLL_MASK | (val & ~(SDRAM_MEMODE_DIC_MASK | SDRAM_MEMODE_DLL_MASK |
SDRAM_MEMODE_RTT_MASK | SDRAM_MEMODE_DQS_MASK)) | SDRAM_MEMODE_RTT_MASK | SDRAM_MEMODE_DQS_MASK)) |
(SDRAM_MEMODE_DIC_NORMAL | SDRAM_MEMODE_DLL_ENABLE (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. * 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); program_DQS_calibration(dimm_populated, iic0_dimm_addr, num_dimm_banks);
#ifdef CONFIG_DDR_ECC
/*------------------------------------------------------------------ /*------------------------------------------------------------------
* If ecc is enabled, initialize the parity bits. * If ecc is enabled, initialize the parity bits.
*-----------------------------------------------------------------*/ *-----------------------------------------------------------------*/
program_ecc(dimm_populated, iic0_dimm_addr, num_dimm_banks, MY_TLB_WORD2_I_ENABLE); program_ecc(dimm_populated, iic0_dimm_addr, num_dimm_banks, MY_TLB_WORD2_I_ENABLE);
#endif
#ifdef DEBUG #ifdef DEBUG
ppc440sp_sdram_register_dump(); ppc440sp_sdram_register_dump();
@ -702,7 +697,7 @@ static void check_frequency(unsigned long *dimm_populated,
*-----------------------------------------------------------------*/ *-----------------------------------------------------------------*/
get_sys_info(&board_cfg); 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)); 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 ddrtype;
unsigned long val; unsigned long val;
#ifdef CONFIG_DDR_ECC
ecc_enabled = TRUE; ecc_enabled = TRUE;
#else
ecc_enabled = FALSE;
#endif
dimm_32bit = FALSE; dimm_32bit = FALSE;
dimm_64bit = FALSE; dimm_64bit = FALSE;
buf0 = FALSE; buf0 = FALSE;
@ -1314,7 +1313,7 @@ static void program_mode(unsigned long *dimm_populated,
*-----------------------------------------------------------------*/ *-----------------------------------------------------------------*/
get_sys_info(&board_cfg); 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); 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); mfsdram(SDRAM_MMODE, mmode);
mmode = mmode & ~(SDRAM_MMODE_WR_MASK | SDRAM_MMODE_DCL_MASK); 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); /* add 10 here because of rounding problems */
cycle_2_5_clk = MULDIV64(ONE_BILLION, 100, max_2_5_tcyc_ns_x_100); cycle_2_0_clk = MULDIV64(ONE_BILLION, 100, max_2_0_tcyc_ns_x_100) + 10;
cycle_3_0_clk = MULDIV64(ONE_BILLION, 100, max_3_0_tcyc_ns_x_100); cycle_2_5_clk = MULDIV64(ONE_BILLION, 100, max_2_5_tcyc_ns_x_100) + 10;
cycle_4_0_clk = MULDIV64(ONE_BILLION, 100, max_4_0_tcyc_ns_x_100); cycle_3_0_clk = MULDIV64(ONE_BILLION, 100, max_3_0_tcyc_ns_x_100) + 10;
cycle_5_0_clk = MULDIV64(ONE_BILLION, 100, max_5_0_tcyc_ns_x_100); 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 (sdram_ddr1 == TRUE) { /* DDR1 */
if ((cas_2_0_available == TRUE) && (sdram_freq <= cycle_2_0_clk)) { 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 { } else {
printf("ERROR: Cannot find a supported CAS latency with the installed DIMMs.\n"); 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("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(); hang();
} }
} }
@ -1575,7 +1579,7 @@ static void program_rtr(unsigned long *dimm_populated,
/*------------------------------------------------------------------ /*------------------------------------------------------------------
* Set the SDRAM Refresh Timing Register, SDRAM_RTR * 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)); sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
max_refresh_rate = 0; max_refresh_rate = 0;
@ -1661,7 +1665,7 @@ static void program_tr(unsigned long *dimm_populated,
*-----------------------------------------------------------------*/ *-----------------------------------------------------------------*/
get_sys_info(&board_cfg); 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)); 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 * Set the sizes
*-----------------------------------------------------------------*/ *-----------------------------------------------------------------*/
baseadd_size = 0; baseadd_size = 0;
rank_size_bytes = 1024 * 1024 * rank_size_id; rank_size_bytes = 4 * 1024 * 1024 * rank_size_id;
switch (rank_size_id) { switch (rank_size_id) {
case 0x02: case 0x02:
baseadd_size |= SDRAM_RXBAS_SDSZ_8; 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++) { for (i = 0; i < num_ranks; i++) {
mtdcr_any(rank_reg+i+dimm_num+bank_0_populated, mtdcr_any(rank_reg+i+dimm_num+bank_0_populated,
(rank_base_addr & SDRAM_RXBAS_SDBA_MASK) | (SDRAM_RXBAS_SDBA_ENCODE(rank_base_addr) |
baseadd_size); baseadd_size));
rank_base_addr += rank_size_bytes; 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)); ecc = max(ecc, SDRAM_MCOPT1_MCHK_CHK_DECODE(val));
} }
return(ecc); return ecc;
} }
#ifdef CONFIG_DDR_ECC
/*-----------------------------------------------------------------------------+ /*-----------------------------------------------------------------------------+
* program_ecc. * program_ecc.
*-----------------------------------------------------------------------------*/ *-----------------------------------------------------------------------------*/
@ -2208,6 +2213,15 @@ static void check_ecc(void)
} }
#endif #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. * program_ecc_addr.
*-----------------------------------------------------------------------------*/ *-----------------------------------------------------------------------------*/
@ -2276,6 +2290,7 @@ static void program_ecc_addr(unsigned long start_address,
#endif #endif
} }
} }
#endif
/*-----------------------------------------------------------------------------+ /*-----------------------------------------------------------------------------+
* program_DQS_calibration. * program_DQS_calibration.
@ -2531,7 +2546,6 @@ static void DQS_calibration_process(void)
} }
} /* for rffd */ } /* for rffd */
/*------------------------------------------------------------------ /*------------------------------------------------------------------
* Set the average RFFD value * Set the average RFFD value
*-----------------------------------------------------------------*/ *-----------------------------------------------------------------*/

View file

@ -417,7 +417,9 @@
#define SDR0_PEGPLLSET1 0x000003A0 /* PE Pll LC Tank Setting1 */ #define SDR0_PEGPLLSET1 0x000003A0 /* PE Pll LC Tank Setting1 */
#define SDR0_PEGPLLSET2 0x000003A1 /* PE Pll LC Tank Setting2 */ #define SDR0_PEGPLLSET2 0x000003A1 /* PE Pll LC Tank Setting2 */
#define SDR0_PEGPLLSTS 0x000003A2 /* PE Pll LC Tank Status */ #define SDR0_PEGPLLSTS 0x000003A2 /* PE Pll LC Tank Status */
#endif /* CONFIG_440SPE */
#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
/*----------------------------------------------------------------------------+ /*----------------------------------------------------------------------------+
| SDRAM Controller | SDRAM Controller
+----------------------------------------------------------------------------*/ +----------------------------------------------------------------------------*/
@ -453,9 +455,16 @@
/*-----------------------------------------------------------------------------+ /*-----------------------------------------------------------------------------+
| Memory Bank 0-7 configuration | Memory Bank 0-7 configuration
+-----------------------------------------------------------------------------*/ +-----------------------------------------------------------------------------*/
#define SDRAM_RXBAS_SDBA_MASK 0xFF800000 /* Base address */ #if defined(CONFIG_440SPE)
#define SDRAM_RXBAS_SDBA_MASK 0xFFE00000 /* Base address */
#define SDRAM_RXBAS_SDBA_ENCODE(n) ((((unsigned long)(n))&0xFFE00000)>>2) #define SDRAM_RXBAS_SDBA_ENCODE(n) ((((unsigned long)(n))&0xFFE00000)>>2)
#define SDRAM_RXBAS_SDBA_DECODE(n) ((((unsigned long)(n))&0xFFE00000)<<2) #define SDRAM_RXBAS_SDBA_DECODE(n) ((((unsigned long)(n))&0xFFE00000)<<2)
#endif /* CONFIG_440SPE */
#if defined(CONFIG_440SP)
#define SDRAM_RXBAS_SDBA_MASK 0xFF800000 /* Base address */
#define SDRAM_RXBAS_SDBA_ENCODE(n) ((((unsigned long)(n))&0xFF800000))
#define SDRAM_RXBAS_SDBA_DECODE(n) ((((unsigned long)(n))&0xFF800000))
#endif /* CONFIG_440SP */
#define SDRAM_RXBAS_SDSZ_MASK 0x0000FFC0 /* Size */ #define SDRAM_RXBAS_SDSZ_MASK 0x0000FFC0 /* Size */
#define SDRAM_RXBAS_SDSZ_ENCODE(n) ((((unsigned long)(n))&0x3FF)<<6) #define SDRAM_RXBAS_SDSZ_ENCODE(n) ((((unsigned long)(n))&0x3FF)<<6)
#define SDRAM_RXBAS_SDSZ_DECODE(n) ((((unsigned long)(n))>>6)&0x3FF) #define SDRAM_RXBAS_SDSZ_DECODE(n) ((((unsigned long)(n))>>6)&0x3FF)
@ -2167,6 +2176,20 @@
/*-----------------------------------------------------------------------------+ /*-----------------------------------------------------------------------------+
| SDR0 Bit Settings | SDR0 Bit Settings
+-----------------------------------------------------------------------------*/ +-----------------------------------------------------------------------------*/
#if defined(CONFIG_440SP)
#define SDR0_SRST 0x0200
#define SDR0_DDR0 0x00E1
#define SDR0_DDR0_DPLLRST 0x80000000
#define SDR0_DDR0_DDRM_MASK 0x60000000
#define SDR0_DDR0_DDRM_DDR1 0x20000000
#define SDR0_DDR0_DDRM_DDR2 0x40000000
#define SDR0_DDR0_DDRM_ENCODE(n) ((((unsigned long)(n))&0x03)<<29)
#define SDR0_DDR0_DDRM_DECODE(n) ((((unsigned long)(n))>>29)&0x03)
#define SDR0_DDR0_TUNE_ENCODE(n) ((((unsigned long)(n))&0x2FF)<<0)
#define SDR0_DDR0_TUNE_DECODE(n) ((((unsigned long)(n))>>0)&0x2FF)
#endif
#if defined(CONFIG_440SPE) #if defined(CONFIG_440SPE)
#define SDR0_CP440 0x0180 #define SDR0_CP440 0x0180
#define SDR0_CP440_ERPN_MASK 0x30000000 #define SDR0_CP440_ERPN_MASK 0x30000000