diff options
Diffstat (limited to 'arch/powerpc/cpu/mpc8xxx/ddr')
| -rw-r--r-- | arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c | 41 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8xxx/ddr/lc_common_dimm_params.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8xxx/ddr/main.c | 11 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8xxx/ddr/options.c | 259 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8xxx/ddr/util.c | 35 | 
5 files changed, 298 insertions, 51 deletions
| diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c b/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c index 3824aade89d..15cd375ae36 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c @@ -18,7 +18,9 @@  #include "ddr.h" -#ifdef CONFIG_MPC85xx +#ifdef CONFIG_MPC83xx +	#define _DDR_ADDR CONFIG_SYS_MPC83xx_DDR_ADDR +#elif defined(CONFIG_MPC85xx)  	#define _DDR_ADDR CONFIG_SYS_MPC85xx_DDR_ADDR  #elif defined(CONFIG_MPC86xx)  	#define _DDR_ADDR CONFIG_SYS_MPC86xx_DDR_ADDR @@ -94,6 +96,10 @@ static inline int fsl_ddr_get_rtt(void)   *       6 if 2.5ns > tCK >= 1.875ns   *       7 if 1.875ns > tCK >= 1.5ns   *       8 if 1.5ns > tCK >= 1.25ns + *       9 if 1.25ns > tCK >= 1.07ns + *       10 if 1.07ns > tCK >= 0.935ns + *       11 if 0.935ns > tCK >= 0.833ns + *       12 if 0.833ns > tCK >= 0.75ns   */  static inline unsigned int compute_cas_write_latency(void)  { @@ -108,8 +114,18 @@ static inline unsigned int compute_cas_write_latency(void)  		cwl = 7;  	else if (mclk_ps >= 1250)  		cwl = 8; -	else -		cwl = 8; +	else if (mclk_ps >= 1070) +		cwl = 9; +	else if (mclk_ps >= 935) +		cwl = 10; +	else if (mclk_ps >= 833) +		cwl = 11; +	else if (mclk_ps >= 750) +		cwl = 12; +	else { +		cwl = 12; +		printf("Warning: CWL is out of range\n"); +	}  	return cwl;  } @@ -146,7 +162,7 @@ static void set_csn_config(int dimm_number, int i, fsl_ddr_cfg_regs_t *ddr,  		break;  	case 2:  		if ((dimm_number == 0 && dimm_params[0].n_ranks > 2) || \ -		   (dimm_number > 1 && dimm_params[dimm_number].n_ranks > 0)) +		   (dimm_number >= 1 && dimm_params[dimm_number].n_ranks > 0))  			go_config = 1;  		break;  	case 3: @@ -617,7 +633,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,  	unsigned int sr_ie = 0;		/* Self-refresh interrupt enable */  	unsigned int dll_rst_dis;	/* DLL reset disable */  	unsigned int dqs_cfg;		/* DQS configuration */ -	unsigned int odt_cfg;		/* ODT configuration */ +	unsigned int odt_cfg = 0;	/* ODT configuration */  	unsigned int num_pr;		/* Number of posted refreshes */  	unsigned int obc_cfg;		/* On-The-Fly Burst Chop Cfg */  	unsigned int ap_en;		/* Address Parity Enable */ @@ -625,15 +641,16 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,  	unsigned int rcw_en = 0;	/* Register Control Word Enable */  	unsigned int md_en = 0;		/* Mirrored DIMM Enable */  	unsigned int qd_en = 0;		/* quad-rank DIMM Enable */ +	int i;  	dll_rst_dis = 1;	/* Make this configurable */  	dqs_cfg = popts->DQS_config; -	if (popts->cs_local_opts[0].odt_rd_cfg -	    || popts->cs_local_opts[0].odt_wr_cfg) { -		/* FIXME */ -		odt_cfg = 2; -	} else { -		odt_cfg = 0; +	for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { +		if (popts->cs_local_opts[i].odt_rd_cfg +			|| popts->cs_local_opts[i].odt_wr_cfg) { +			odt_cfg = SDRAM_CFG2_ODT_ONLY_READ; +			break; +		}  	}  	num_pr = 1;	/* Make this configurable */ @@ -1018,7 +1035,7 @@ static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr,  #if defined(CONFIG_FSL_DDR2)  	const unsigned int mclk_ps = get_memory_clk_period_ps();  #endif - +	dqs_en = !popts->DQS_config;  	rtt = fsl_ddr_get_rtt();  	al = additive_latency; diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/lc_common_dimm_params.c b/arch/powerpc/cpu/mpc8xxx/ddr/lc_common_dimm_params.c index 8132e68d9d6..20c7db03ede 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/lc_common_dimm_params.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/lc_common_dimm_params.c @@ -448,7 +448,8 @@ compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params,  #if defined(CONFIG_FSL_DDR2)  	if (lowest_good_caslat < 4) { -		additive_latency = picos_to_mclk(tRCD_ps) - lowest_good_caslat; +		additive_latency = (picos_to_mclk(tRCD_ps) > lowest_good_caslat) +			? picos_to_mclk(tRCD_ps) - lowest_good_caslat : 0;  		if (mclk_to_picos(additive_latency) > tRCD_ps) {  			additive_latency = picos_to_mclk(tRCD_ps);  			debug("setting additive_latency to %u because it was " diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/main.c b/arch/powerpc/cpu/mpc8xxx/ddr/main.c index 249fd7dfb36..5699b0c2cc9 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/main.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/main.c @@ -34,14 +34,17 @@ extern void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {  	[0][0] = SPD_EEPROM_ADDRESS,  }; -#endif -#if (CONFIG_NUM_DDR_CONTROLLERS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1) +#elif (CONFIG_NUM_DDR_CONTROLLERS == 1) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2) +u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = { +	[0][0] = SPD_EEPROM_ADDRESS1,	/* controller 1 */ +	[0][1] = SPD_EEPROM_ADDRESS2,	/* controller 1 */ +}; +#elif (CONFIG_NUM_DDR_CONTROLLERS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)  u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {  	[0][0] = SPD_EEPROM_ADDRESS1,	/* controller 1 */  	[1][0] = SPD_EEPROM_ADDRESS2,	/* controller 2 */  }; -#endif -#if (CONFIG_NUM_DDR_CONTROLLERS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2) +#elif (CONFIG_NUM_DDR_CONTROLLERS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)  u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {  	[0][0] = SPD_EEPROM_ADDRESS1,	/* controller 1 */  	[0][1] = SPD_EEPROM_ADDRESS2,	/* controller 1 */ diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/options.c b/arch/powerpc/cpu/mpc8xxx/ddr/options.c index bd9c4663e79..4dc748b9510 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/options.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/options.c @@ -26,14 +26,15 @@ extern void fsl_ddr_board_options(memctl_options_t *popts,  		dimm_params_t *pdimm,  		unsigned int ctrl_num); -typedef struct { +struct dynamic_odt {  	unsigned int odt_rd_cfg;  	unsigned int odt_wr_cfg;  	unsigned int odt_rtt_norm;  	unsigned int odt_rtt_wr; -} dynamic_odt_t; +}; -static const dynamic_odt_t single_Q[4] = { +#ifdef CONFIG_FSL_DDR3 +static const struct dynamic_odt single_Q[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_NEVER,  		FSL_DDR_ODT_CS_AND_OTHER_DIMM, @@ -60,7 +61,7 @@ static const dynamic_odt_t single_Q[4] = {  	}  }; -static const dynamic_odt_t single_D[4] = { +static const struct dynamic_odt single_D[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_NEVER,  		FSL_DDR_ODT_ALL, @@ -77,7 +78,7 @@ static const dynamic_odt_t single_D[4] = {  	{0, 0, 0, 0}  }; -static const dynamic_odt_t single_S[4] = { +static const struct dynamic_odt single_S[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_NEVER,  		FSL_DDR_ODT_ALL, @@ -89,7 +90,7 @@ static const dynamic_odt_t single_S[4] = {  	{0, 0, 0, 0},  }; -static const dynamic_odt_t dual_DD[4] = { +static const struct dynamic_odt dual_DD[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_NEVER,  		FSL_DDR_ODT_SAME_DIMM, @@ -116,7 +117,7 @@ static const dynamic_odt_t dual_DD[4] = {  	}  }; -static const dynamic_odt_t dual_DS[4] = { +static const struct dynamic_odt dual_DS[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_NEVER,  		FSL_DDR_ODT_SAME_DIMM, @@ -137,7 +138,7 @@ static const dynamic_odt_t dual_DS[4] = {  	},  	{0, 0, 0, 0}  }; -static const dynamic_odt_t dual_SD[4] = { +static const struct dynamic_odt dual_SD[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_OTHER_DIMM,  		FSL_DDR_ODT_ALL, @@ -159,7 +160,7 @@ static const dynamic_odt_t dual_SD[4] = {  	}  }; -static const dynamic_odt_t dual_SS[4] = { +static const struct dynamic_odt dual_SS[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_OTHER_DIMM,  		FSL_DDR_ODT_ALL, @@ -176,7 +177,7 @@ static const dynamic_odt_t dual_SS[4] = {  	{0, 0, 0, 0}  }; -static const dynamic_odt_t dual_D0[4] = { +static const struct dynamic_odt dual_D0[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_NEVER,  		FSL_DDR_ODT_SAME_DIMM, @@ -193,7 +194,7 @@ static const dynamic_odt_t dual_D0[4] = {  	{0, 0, 0, 0}  }; -static const dynamic_odt_t dual_0D[4] = { +static const struct dynamic_odt dual_0D[4] = {  	{0, 0, 0, 0},  	{0, 0, 0, 0},  	{	/* cs2 */ @@ -210,7 +211,7 @@ static const dynamic_odt_t dual_0D[4] = {  	}  }; -static const dynamic_odt_t dual_S0[4] = { +static const struct dynamic_odt dual_S0[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_NEVER,  		FSL_DDR_ODT_CS, @@ -223,7 +224,7 @@ static const dynamic_odt_t dual_S0[4] = {  }; -static const dynamic_odt_t dual_0S[4] = { +static const struct dynamic_odt dual_0S[4] = {  	{0, 0, 0, 0},  	{0, 0, 0, 0},  	{	/* cs2 */ @@ -236,7 +237,7 @@ static const dynamic_odt_t dual_0S[4] = {  }; -static const dynamic_odt_t odt_unknown[4] = { +static const struct dynamic_odt odt_unknown[4] = {  	{	/* cs0 */  		FSL_DDR_ODT_NEVER,  		FSL_DDR_ODT_CS, @@ -262,7 +263,218 @@ static const dynamic_odt_t odt_unknown[4] = {  		DDR3_RTT_OFF  	}  }; +#else	/* CONFIG_FSL_DDR3 */ +static const struct dynamic_odt single_Q[4] = { +	{0, 0, 0, 0}, +	{0, 0, 0, 0}, +	{0, 0, 0, 0}, +	{0, 0, 0, 0} +}; + +static const struct dynamic_odt single_D[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_ALL, +		DDR2_RTT_150_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs1 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0}, +	{0, 0, 0, 0} +}; +static const struct dynamic_odt single_S[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_ALL, +		DDR2_RTT_150_OHM, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0}, +	{0, 0, 0, 0}, +	{0, 0, 0, 0}, +}; + +static const struct dynamic_odt dual_DD[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_OTHER_DIMM, +		FSL_DDR_ODT_OTHER_DIMM, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs1 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	}, +	{	/* cs2 */ +		FSL_DDR_ODT_OTHER_DIMM, +		FSL_DDR_ODT_OTHER_DIMM, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs3 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	} +}; + +static const struct dynamic_odt dual_DS[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_OTHER_DIMM, +		FSL_DDR_ODT_OTHER_DIMM, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs1 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	}, +	{	/* cs2 */ +		FSL_DDR_ODT_OTHER_DIMM, +		FSL_DDR_ODT_OTHER_DIMM, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0} +}; + +static const struct dynamic_odt dual_SD[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_OTHER_DIMM, +		FSL_DDR_ODT_OTHER_DIMM, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0}, +	{	/* cs2 */ +		FSL_DDR_ODT_OTHER_DIMM, +		FSL_DDR_ODT_OTHER_DIMM, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs3 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	} +}; + +static const struct dynamic_odt dual_SS[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_OTHER_DIMM, +		FSL_DDR_ODT_OTHER_DIMM, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0}, +	{	/* cs2 */ +		FSL_DDR_ODT_OTHER_DIMM, +		FSL_DDR_ODT_OTHER_DIMM, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0} +}; + +static const struct dynamic_odt dual_D0[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_ALL, +		DDR2_RTT_150_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs1 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0}, +	{0, 0, 0, 0} +}; + +static const struct dynamic_odt dual_0D[4] = { +	{0, 0, 0, 0}, +	{0, 0, 0, 0}, +	{	/* cs2 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_ALL, +		DDR2_RTT_150_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs3 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	} +}; + +static const struct dynamic_odt dual_S0[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_CS, +		DDR2_RTT_150_OHM, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0}, +	{0, 0, 0, 0}, +	{0, 0, 0, 0} + +}; + +static const struct dynamic_odt dual_0S[4] = { +	{0, 0, 0, 0}, +	{0, 0, 0, 0}, +	{	/* cs2 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_CS, +		DDR2_RTT_150_OHM, +		DDR2_RTT_OFF +	}, +	{0, 0, 0, 0} + +}; + +static const struct dynamic_odt odt_unknown[4] = { +	{	/* cs0 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_CS, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs1 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	}, +	{	/* cs2 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_CS, +		DDR2_RTT_75_OHM, +		DDR2_RTT_OFF +	}, +	{	/* cs3 */ +		FSL_DDR_ODT_NEVER, +		FSL_DDR_ODT_NEVER, +		DDR2_RTT_OFF, +		DDR2_RTT_OFF +	} +}; +#endif  unsigned int populate_memctl_options(int all_DIMMs_registered,  			memctl_options_t *popts,  			dimm_params_t *pdimm, @@ -271,7 +483,8 @@ unsigned int populate_memctl_options(int all_DIMMs_registered,  	unsigned int i;  	char buffer[HWCONFIG_BUFFER_SIZE];  	char *buf = NULL; -	const dynamic_odt_t *pdodt = odt_unknown; +	const struct dynamic_odt *pdodt = odt_unknown; +	ulong ddr_freq;  	/*  	 * Extract hwconfig from environment since we have not properly setup @@ -336,7 +549,7 @@ unsigned int populate_memctl_options(int all_DIMMs_registered,  	/* Pick chip-select local options. */  	for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { -#if defined(CONFIG_FSL_DDR3) +#if defined(CONFIG_FSL_DDR3) || defined(CONFIG_FSL_DDR2)  		popts->cs_local_opts[i].odt_rd_cfg = pdodt[i].odt_rd_cfg;  		popts->cs_local_opts[i].odt_wr_cfg = pdodt[i].odt_wr_cfg;  		popts->cs_local_opts[i].odt_rtt_norm = pdodt[i].odt_rtt_norm; @@ -716,6 +929,20 @@ unsigned int populate_memctl_options(int all_DIMMs_registered,  	if (pdimm[0].n_ranks == 4)  		popts->quad_rank_present = 1; +	ddr_freq = get_ddr_freq(0) / 1000000; +	if (popts->registered_dimm_en) { +		popts->rcw_override = 1; +		popts->rcw_1 = 0x000a5a00; +		if (ddr_freq <= 800) +			popts->rcw_2 = 0x00000000; +		else if (ddr_freq <= 1066) +			popts->rcw_2 = 0x00100000; +		else if (ddr_freq <= 1333) +			popts->rcw_2 = 0x00200000; +		else +			popts->rcw_2 = 0x00300000; +	} +  	fsl_ddr_board_options(popts, pdimm, ctrl_num);  	return 0; diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/util.c b/arch/powerpc/cpu/mpc8xxx/ddr/util.c index 104d360a5f1..eb6a17a8503 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/util.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/util.c @@ -20,7 +20,8 @@  #define ULL_8FS 0xFFFFFFFFULL  /* - * Round mclk_ps to nearest 10 ps in memory controller code. + * Round up mclk_ps to nearest 1 ps in memory controller code + * if the error is 0.5ps or more.   *   * If an imprecise data rate is too high due to rounding error   * propagation, compute a suitably rounded mclk_ps to compute @@ -32,42 +33,37 @@ unsigned int get_memory_clk_period_ps(void)  	unsigned int result;  	/* Round to nearest 10ps, being careful about 64-bit multiply/divide */ -	unsigned long long mclk_ps = ULL_2E12; - -	/* Add 5*data_rate, for rounding */ -	mclk_ps += 5*(unsigned long long)data_rate; +	unsigned long long rem, mclk_ps = ULL_2E12;  	/* Now perform the big divide, the result fits in 32-bits */ -	do_div(mclk_ps, data_rate); -	result = mclk_ps; +	rem = do_div(mclk_ps, data_rate); +	result = (rem >= (data_rate >> 1)) ? mclk_ps + 1 : mclk_ps; -	/* We still need to round to 10ps */ -	return 10 * (result/10); +	return result;  }  /* Convert picoseconds into DRAM clock cycles (rounding up if needed). */  unsigned int picos_to_mclk(unsigned int picos)  {  	unsigned long long clks, clks_rem; +	unsigned long data_rate = get_ddr_freq(0);  	/* Short circuit for zero picos */  	if (!picos)  		return 0;  	/* First multiply the time by the data rate (32x32 => 64) */ -	clks = picos * (unsigned long long)get_ddr_freq(0); - +	clks = picos * (unsigned long long)data_rate;  	/*  	 * Now divide by 5^12 and track the 32-bit remainder, then divide  	 * by 2*(2^12) using shifts (and updating the remainder).  	 */  	clks_rem = do_div(clks, UL_5POW12); -	clks_rem <<= 13; -	clks_rem |= clks & (UL_2POW13-1); +	clks_rem += (clks & (UL_2POW13-1)) * UL_5POW12;  	clks >>= 13; -	/* If we had a remainder, then round up */ -	if (clks_rem) +	/* If we had a remainder greater than the 1ps error, then round up */ +	if (clks_rem > data_rate)  		clks++;  	/* Clamp to the maximum representable value */ @@ -133,10 +129,13 @@ fsl_ddr_set_lawbar(const common_timing_params_t *memctl_common_params,  void board_add_ram_info(int use_default)  { -#if defined(CONFIG_MPC85xx) -	volatile ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC85xx_DDR_ADDR); +#if defined(CONFIG_MPC83xx) +	immap_t *immap = (immap_t *) CONFIG_SYS_IMMR; +	ccsr_ddr_t *ddr = (void *)&immap->ddr; +#elif defined(CONFIG_MPC85xx) +	ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC85xx_DDR_ADDR);  #elif defined(CONFIG_MPC86xx) -	volatile ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC86xx_DDR_ADDR); +	ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC86xx_DDR_ADDR);  #endif  #if (CONFIG_NUM_DDR_CONTROLLERS > 1)  	uint32_t cs0_config = in_be32(&ddr->cs0_config); | 
