diff options
| author | Stefan Roese <sr@denx.de> | 2007-08-15 21:06:27 +0200 | 
|---|---|---|
| committer | Stefan Roese <sr@denx.de> | 2007-08-15 21:06:27 +0200 | 
| commit | b706d63559aeec352bc72dd86d7d5423c15f6a60 (patch) | |
| tree | fdeda4d61970fef239d9d66ecd851fa46cfe5ec0 /cpu/ppc4xx/44x_spd_ddr2.c | |
| parent | c8603cfbd4573379a6076c9c208545ba2bbf019a (diff) | |
| parent | 594e79838ce5078a90d0c27abb2b2d61d5f8e8a7 (diff) | |
| download | olio-uboot-2014.01-b706d63559aeec352bc72dd86d7d5423c15f6a60.tar.xz olio-uboot-2014.01-b706d63559aeec352bc72dd86d7d5423c15f6a60.zip | |
Merge with git://www.denx.de/git/u-boot.git
Diffstat (limited to 'cpu/ppc4xx/44x_spd_ddr2.c')
| -rw-r--r-- | cpu/ppc4xx/44x_spd_ddr2.c | 132 | 
1 files changed, 86 insertions, 46 deletions
| diff --git a/cpu/ppc4xx/44x_spd_ddr2.c b/cpu/ppc4xx/44x_spd_ddr2.c index b5c0f53d2..18b90ba5a 100644 --- a/cpu/ppc4xx/44x_spd_ddr2.c +++ b/cpu/ppc4xx/44x_spd_ddr2.c @@ -109,7 +109,7 @@  /* Defines for the Read Cycle Delay test */  #define NUMMEMTESTS	8  #define NUMMEMWORDS	8 -#define NUMLOOPS	256		/* memory test loops */ +#define NUMLOOPS	64		/* memory test loops */  #undef CONFIG_ECC_ERROR_RESET		/* test-only: see description below, at check_ecc() */ @@ -129,6 +129,36 @@  #define MY_TLB_WORD2_I_ENABLE	TLB_WORD2_I_ENABLE	/* disable caching on SDRAM */  #endif +/* + * Board-specific Platform code can reimplement spd_ddr_init_hang () if needed + */ +void __spd_ddr_init_hang (void) +{ +	hang (); +} +void spd_ddr_init_hang (void) __attribute__((weak, alias("__spd_ddr_init_hang"))); + +/* + * To provide an interface for board specific config values in this common + * DDR setup code, we implement he "weak" default functions here. They return + * the default value back to the caller. + * + * Please see include/configs/yucca.h for an example fora board specific + * implementation. + */ +u32 __ddr_wrdtr(u32 default_val) +{ +	return default_val; +} +u32 ddr_wrdtr(u32) __attribute__((weak, alias("__ddr_wrdtr"))); + +u32 __ddr_clktr(u32 default_val) +{ +	return default_val; +} +u32 ddr_clktr(u32) __attribute__((weak, alias("__ddr_clktr"))); + +  /* Private Structure Definitions */  /* enum only to ease code for cas latency setting */ @@ -144,7 +174,6 @@ typedef enum ddr_cas_id {   * Prototypes   *-----------------------------------------------------------------------------*/  static unsigned long sdram_memsize(void); -void program_tlb(u32 phys_addr, u32 virt_addr, u32 size, u32 tlb_word2_i_value);  static void get_spd_info(unsigned long *dimm_populated,  			 unsigned char *iic0_dimm_addr,  			 unsigned long num_dimm_banks); @@ -206,9 +235,7 @@ static void	test(void);  #else  static void	DQS_calibration_process(void);  #endif -#if defined(DEBUG)  static void ppc440sp_sdram_register_dump(void); -#endif  int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);  void dcbz_area(u32 start_address, u32 num_bytes);  void dflush(void); @@ -459,17 +486,14 @@ long int initdram(int board_type)  	 *-----------------------------------------------------------------*/  	mfsdram(SDRAM_WRDTR, val);  	mtsdram(SDRAM_WRDTR, (val & ~(SDRAM_WRDTR_LLWP_MASK | SDRAM_WRDTR_WTR_MASK)) | -		(SDRAM_WRDTR_LLWP_1_CYC | SDRAM_WRDTR_WTR_90_DEG_ADV)); +		ddr_wrdtr(SDRAM_WRDTR_LLWP_1_CYC | SDRAM_WRDTR_WTR_90_DEG_ADV));  	/*------------------------------------------------------------------  	 * Set the SDRAM Clock Timing Register  	 *-----------------------------------------------------------------*/  	mfsdram(SDRAM_CLKTR, val); -#ifdef CFG_44x_DDR2_CKTR_180 -	mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) | SDRAM_CLKTR_CLKP_180_DEG_ADV); -#else -	mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) | SDRAM_CLKTR_CLKP_0_DEG); -#endif +	mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) | +		ddr_clktr(SDRAM_CLKTR_CLKP_0_DEG));  	/*------------------------------------------------------------------  	 * Program the BxCF registers. @@ -528,7 +552,12 @@ long int initdram(int board_type)  	dram_size = sdram_memsize();  	/* and program tlb entries for this size (dynamic) */ -	program_tlb(0, 0, dram_size, MY_TLB_WORD2_I_ENABLE); + +	/* +	 * Program TLB entries with caches enabled, for best performace +	 * while auto-calibrating and ECC generation +	 */ +	program_tlb(0, 0, dram_size, 0);  	/*------------------------------------------------------------------  	 * DQS calibration. @@ -539,12 +568,18 @@ long int initdram(int board_type)  	/*------------------------------------------------------------------  	 * 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, 0);  #endif -#ifdef DEBUG +	/* +	 * Now after initialization (auto-calibration and ECC generation) +	 * remove the TLB entries with caches enabled and program again with +	 * desired cache functionality +	 */ +	remove_tlb(0, dram_size); +	program_tlb(0, 0, dram_size, MY_TLB_WORD2_I_ENABLE); +  	ppc440sp_sdram_register_dump(); -#endif  	return dram_size;  } @@ -582,7 +617,7 @@ static void get_spd_info(unsigned long *dimm_populated,  	if (dimm_found == FALSE) {  		printf("ERROR - No memory installed. Install a DDR-SDRAM DIMM.\n\n"); -		hang(); +		spd_ddr_init_hang ();  	}  } @@ -629,42 +664,42 @@ static void check_mem_type(unsigned long *dimm_populated,  				       "slot %d.\n", (unsigned int)dimm_num);  				printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 2:  				printf("ERROR: EDO DIMM detected in slot %d.\n",  				       (unsigned int)dimm_num);  				printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 3:  				printf("ERROR: Pipelined Nibble DIMM detected in slot %d.\n",  				       (unsigned int)dimm_num);  				printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 4:  				printf("ERROR: SDRAM DIMM detected in slot %d.\n",  				       (unsigned int)dimm_num);  				printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 5:  				printf("ERROR: Multiplexed ROM DIMM detected in slot %d.\n",  				       (unsigned int)dimm_num);  				printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 6:  				printf("ERROR: SGRAM DIMM detected in slot %d.\n",  				       (unsigned int)dimm_num);  				printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 7:  				debug("DIMM slot %d: DDR1 SDRAM detected\n", dimm_num); @@ -679,7 +714,7 @@ static void check_mem_type(unsigned long *dimm_populated,  				       (unsigned int)dimm_num);  				printf("Only DDR1 and DDR2 SDRAM DIMMs are supported.\n");  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  				break;  			}  		} @@ -689,7 +724,7 @@ static void check_mem_type(unsigned long *dimm_populated,  		    && (dimm_populated[dimm_num]   != SDRAM_NONE)  		    && (dimm_populated[dimm_num-1] != dimm_populated[dimm_num])) {  			printf("ERROR: DIMM's DDR1 and DDR2 type can not be mixed.\n"); -			hang(); +			spd_ddr_init_hang ();  		}  	}  } @@ -764,7 +799,7 @@ static void check_frequency(unsigned long *dimm_populated,  				       (unsigned int)(calc_cycle_time*10));  				printf("Replace the DIMM, or change DDR frequency via "  				       "strapping bits.\n\n"); -				hang(); +				spd_ddr_init_hang ();  			}  		}  	} @@ -796,7 +831,7 @@ static void check_rank_number(unsigned long *dimm_populated,  				       "slot %d is not supported.\n", dimm_rank, dimm_num);  				printf("Only %d ranks are supported for all DIMM.\n", MAXRANKS);  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  			} else  				total_rank += dimm_rank;  		} @@ -805,7 +840,7 @@ static void check_rank_number(unsigned long *dimm_populated,  			       "for all slots.\n", (unsigned int)total_rank);  			printf("Only %d ranks are supported for all DIMM.\n", MAXRANKS);  			printf("Remove one of the DIMM modules.\n\n"); -			hang(); +			spd_ddr_init_hang ();  		}  	}  } @@ -830,28 +865,28 @@ static void check_voltage_type(unsigned long *dimm_populated,  				printf("This DIMM is 5.0 Volt/TTL.\n");  				printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",  				       (unsigned int)dimm_num); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 0x01:  				printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");  				printf("This DIMM is LVTTL.\n");  				printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",  				       (unsigned int)dimm_num); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 0x02:  				printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");  				printf("This DIMM is 1.5 Volt.\n");  				printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",  				       (unsigned int)dimm_num); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 0x03:  				printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");  				printf("This DIMM is 3.3 Volt/TTL.\n");  				printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",  				       (unsigned int)dimm_num); -				hang(); +				spd_ddr_init_hang ();  				break;  			case 0x04:  				/* 2.5 Voltage only for DDR1 */ @@ -863,7 +898,7 @@ static void check_voltage_type(unsigned long *dimm_populated,  				printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");  				printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",  				       (unsigned int)dimm_num); -				hang(); +				spd_ddr_init_hang ();  				break;  			}  		} @@ -1006,13 +1041,13 @@ static void program_copt1(unsigned long *dimm_populated,  	if ((dimm_populated[0] != SDRAM_NONE) && (dimm_populated[1] != SDRAM_NONE)) {  		if (buf0 != buf1) {  			printf("ERROR: DIMM's buffered/unbuffered, registered, clocking don't match.\n"); -			hang(); +			spd_ddr_init_hang ();  		}  	}  	if ((dimm_64bit == TRUE) && (dimm_32bit == TRUE)) {  		printf("ERROR: Cannot mix 32 bit and 64 bit DDR-SDRAM DIMMs together.\n"); -		hang(); +		spd_ddr_init_hang ();  	}  	else if ((dimm_64bit == TRUE) && (dimm_32bit == FALSE)) {  		mcopt1 |= SDRAM_MCOPT1_DMWD_64; @@ -1020,7 +1055,7 @@ static void program_copt1(unsigned long *dimm_populated,  		mcopt1 |= SDRAM_MCOPT1_DMWD_32;  	} else {  		printf("ERROR: Please install only 32 or 64 bit DDR-SDRAM DIMMs.\n\n"); -		hang(); +		spd_ddr_init_hang ();  	}  	if (ecc_enabled == TRUE) @@ -1209,7 +1244,7 @@ static void program_initplr(unsigned long *dimm_populated,  			break;  		default:  			printf("ERROR: ucode error on selected_cas value %d", selected_cas); -			hang(); +			spd_ddr_init_hang ();  			break;  		} @@ -1241,7 +1276,7 @@ static void program_initplr(unsigned long *dimm_populated,  			break;  		default:  			printf("ERROR: write recovery not support (%d)", write_recovery); -			hang(); +			spd_ddr_init_hang ();  			break;  		}  #else @@ -1259,7 +1294,7 @@ static void program_initplr(unsigned long *dimm_populated,  			ods = ODS_REDUCED;  		} else {  			printf("ERROR: Unsupported number of DIMM's (%d)", total_dimm); -			hang(); +			spd_ddr_init_hang ();  		}  		mr = CMD_EMR | SELECT_MR | BURST_LEN_4 | wr | cas; @@ -1284,7 +1319,7 @@ static void program_initplr(unsigned long *dimm_populated,  		mtsdram(SDRAM_INITPLR13, 0x80800000 | emr);		/* EMR OCD Exit */  	} else {  		printf("ERROR: ucode error as unknown DDR type in program_initplr"); -		hang(); +		spd_ddr_init_hang ();  	}  } @@ -1389,7 +1424,7 @@ static void program_mode(unsigned long *dimm_populated,  					} else {  						printf("ERROR: SPD reported Tcyc is incorrect for DIMM "  						       "in slot %d\n", (unsigned int)dimm_num); -						hang(); +						spd_ddr_init_hang ();  					}  				} else {  					/* Convert from hex to decimal */ @@ -1526,7 +1561,7 @@ static void program_mode(unsigned long *dimm_populated,  			printf("ERROR: Cannot find a supported CAS latency with the installed DIMMs.\n");  			printf("Only DIMMs DDR1 with CAS latencies of 2.0, 2.5, and 3.0 are supported.\n");  			printf("Make sure the PLB speed is within the supported range of the DIMMs.\n\n"); -			hang(); +			spd_ddr_init_hang ();  		}  	} else { /* DDR2 */  		debug("cas_3_0_available=%d\n", cas_3_0_available); @@ -1549,7 +1584,7 @@ static void program_mode(unsigned long *dimm_populated,  			       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(); +			spd_ddr_init_hang ();  		}  	} @@ -1658,7 +1693,7 @@ static void program_rtr(unsigned long *dimm_populated,  				printf("ERROR: DIMM %d unsupported refresh rate/type.\n",  				       (unsigned int)dimm_num);  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  				break;  			} @@ -2066,7 +2101,7 @@ static void program_bxcf(unsigned long *dimm_populated,  					printf("ERROR: Unsupported value for number of "  					       "column addresses: %d.\n", (unsigned int)num_col_addr);  					printf("Replace the DIMM module with a supported DIMM.\n\n"); -					hang(); +					spd_ddr_init_hang ();  				}  			} @@ -2148,7 +2183,7 @@ static void program_memory_queue(unsigned long *dimm_populated,  				printf("ERROR: Unsupported value for the banksize: %d.\n",  				       (unsigned int)rank_size_id);  				printf("Replace the DIMM module with a supported DIMM.\n\n"); -				hang(); +				spd_ddr_init_hang ();  			}  			if ((dimm_populated[dimm_num] != SDRAM_NONE) && (dimm_num == 1)) @@ -2693,7 +2728,8 @@ calibration_loop:  		printf("\nERROR: Cannot determine a common read delay for the "  		       "DIMM(s) installed.\n");  		debug("%s[%d] ERROR : \n", __FUNCTION__,__LINE__); -		hang(); +		ppc440sp_sdram_register_dump(); +		spd_ddr_init_hang ();  	}  	blank_string(strlen(str)); @@ -2849,7 +2885,7 @@ static void test(void)  	if (window_found == FALSE) {  		printf("ERROR: Cannot determine a common read delay for the "  		       "DIMM(s) installed.\n"); -		hang(); +		spd_ddr_init_hang ();  	}  	/*------------------------------------------------------------------ @@ -3018,5 +3054,9 @@ static void ppc440sp_sdram_register_dump(void)  	dcr_data = mfdcr(SDRAM_R3BAS);  	printf("        MQ3_B0BAS       = 0x%08X\n", dcr_data);  } +#else +static void ppc440sp_sdram_register_dump(void) +{ +}  #endif  #endif /* CONFIG_SPD_EEPROM */ |