|
|
|
@ -44,8 +44,6 @@ int compare_to_true(char *str ); |
|
|
|
|
char *remove_l_w_space(char *in_str ); |
|
|
|
|
char *remove_t_w_space(char *in_str ); |
|
|
|
|
int get_console_port(void); |
|
|
|
|
unsigned long ppcMfcpr(unsigned long cpr_reg); |
|
|
|
|
unsigned long ppcMfsdr(unsigned long sdr_reg); |
|
|
|
|
|
|
|
|
|
int ppc440spe_init_pcie_rootport(int port); |
|
|
|
|
void ppc440spe_setup_pcie(struct pci_controller *hose, int port); |
|
|
|
@ -221,7 +219,7 @@ int board_early_init_f (void) |
|
|
|
|
| |
|
|
|
|
+-------------------------------------------------------------------*/ |
|
|
|
|
/* Read Pin Strap Register in PPC440SP */ |
|
|
|
|
sdr0_pinstp = ppcMfsdr(SDR0_PINSTP); |
|
|
|
|
mfsdr(SDR0_PINSTP, sdr0_pinstp); |
|
|
|
|
bootstrap_settings = sdr0_pinstp & SDR0_PINSTP_BOOTSTRAP_MASK; |
|
|
|
|
|
|
|
|
|
switch (bootstrap_settings) { |
|
|
|
@ -246,7 +244,7 @@ int board_early_init_f (void) |
|
|
|
|
* Boot Settings in IIC EEprom address 0x50 or 0x54 |
|
|
|
|
* Read Serial Device Strap Register1 in PPC440SPe |
|
|
|
|
*/ |
|
|
|
|
sdr0_sdstp1 = ppcMfsdr(SDR0_SDSTP1); |
|
|
|
|
mfsdr(SDR0_SDSTP1, sdr0_sdstp1); |
|
|
|
|
boot_selection = sdr0_sdstp1 & SDR0_SDSTP1_ERPN_MASK; |
|
|
|
|
ebc_data_width = sdr0_sdstp1 & SDR0_SDSTP1_EBCW_MASK; |
|
|
|
|
|
|
|
|
@ -564,277 +562,6 @@ int checkboard (void) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static long int yucca_probe_for_dimms(void) |
|
|
|
|
{ |
|
|
|
|
int dimm_installed[MAXDIMMS]; |
|
|
|
|
int dimm_num, result; |
|
|
|
|
int dimms_found = 0; |
|
|
|
|
uchar dimm_addr = IIC0_DIMM0_ADDR; |
|
|
|
|
uchar dimm_spd_data[MAX_SPD_BYTES]; |
|
|
|
|
|
|
|
|
|
for (dimm_num = 0; dimm_num < MAXDIMMS; dimm_num++) { |
|
|
|
|
/* check if there is a chip at the dimm address */ |
|
|
|
|
switch (dimm_num) { |
|
|
|
|
case 0: |
|
|
|
|
dimm_addr = IIC0_DIMM0_ADDR; |
|
|
|
|
break; |
|
|
|
|
case 1: |
|
|
|
|
dimm_addr = IIC0_DIMM1_ADDR; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
result = i2c_probe(dimm_addr); |
|
|
|
|
|
|
|
|
|
memset(dimm_spd_data, 0, MAX_SPD_BYTES * sizeof(char)); |
|
|
|
|
if (result == 0) { |
|
|
|
|
/* read first byte of SPD data, if there is any data */ |
|
|
|
|
result = i2c_read(dimm_addr, 0, 1, dimm_spd_data, 1); |
|
|
|
|
|
|
|
|
|
if (result == 0) { |
|
|
|
|
result = dimm_spd_data[0]; |
|
|
|
|
result = result > MAX_SPD_BYTES ? |
|
|
|
|
MAX_SPD_BYTES : result; |
|
|
|
|
result = i2c_read(dimm_addr, 0, 1, |
|
|
|
|
dimm_spd_data, result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((result == 0) && |
|
|
|
|
(dimm_spd_data[64] == MICRON_SPD_JEDEC_ID)) { |
|
|
|
|
dimm_installed[dimm_num] = TRUE; |
|
|
|
|
dimms_found++; |
|
|
|
|
debug("DIMM slot %d: DDR2 SDRAM detected\n", dimm_num); |
|
|
|
|
} else { |
|
|
|
|
dimm_installed[dimm_num] = FALSE; |
|
|
|
|
debug("DIMM slot %d: Not populated or cannot sucessfully probe the DIMM\n", dimm_num); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (dimms_found == 0) { |
|
|
|
|
printf("ERROR - No memory installed. Install a DDR-SDRAM DIMM.\n\n"); |
|
|
|
|
hang(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (dimm_installed[0] != TRUE) { |
|
|
|
|
printf("\nERROR - DIMM slot 0 must be populated before DIMM slot 1.\n"); |
|
|
|
|
printf(" Unsupported configuration. Move DIMM module from DIMM slot 1 to slot 0.\n\n"); |
|
|
|
|
hang(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return dimms_found; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|
* init SDRAM controller with fixed value |
|
|
|
|
* the initialization values are for 2x MICRON DDR2 |
|
|
|
|
* PN: MT18HTF6472DY-53EB2 |
|
|
|
|
* 512MB, DDR2, 533, CL4, ECC, REG |
|
|
|
|
************************************************************************/ |
|
|
|
|
static long int fixed_sdram(void) |
|
|
|
|
{ |
|
|
|
|
long int yucca_dimms = 0; |
|
|
|
|
|
|
|
|
|
yucca_dimms = yucca_probe_for_dimms(); |
|
|
|
|
|
|
|
|
|
/* SDRAM0_MCOPT2 (0X21) Clear DCEN BIT */ |
|
|
|
|
mtdcr( 0x10, 0x00000021 ); |
|
|
|
|
mtdcr( 0x11, 0x84000000 ); |
|
|
|
|
|
|
|
|
|
/* SDRAM0_MCOPT1 (0X20) ECC OFF / 64 bits / 4 banks / DDR2 */ |
|
|
|
|
mtdcr( 0x10, 0x00000020 ); |
|
|
|
|
mtdcr( 0x11, 0x2D122000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_CODT Die Termination On */ |
|
|
|
|
mtdcr( 0x10, 0x00000026 ); |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x11, 0x2A800021 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x11, 0x02800021 ); |
|
|
|
|
|
|
|
|
|
/* On-Die Termination for Bank 0 */ |
|
|
|
|
mtdcr( 0x10, 0x00000022 ); |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x11, 0x18000000 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x11, 0x06000000 ); |
|
|
|
|
|
|
|
|
|
/* On-Die Termination for Bank 1 */ |
|
|
|
|
mtdcr( 0x10, 0x00000023 ); |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x11, 0x18000000 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x11, 0x01800000 ); |
|
|
|
|
|
|
|
|
|
/* On-Die Termination for Bank 2 */ |
|
|
|
|
mtdcr( 0x10, 0x00000024 ); |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x11, 0x01800000 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x11, 0x00000000 ); |
|
|
|
|
|
|
|
|
|
/* On-Die Termination for Bank 3 */ |
|
|
|
|
mtdcr( 0x10, 0x00000025 ); |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x11, 0x01800000 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x11, 0x00000000 ); |
|
|
|
|
|
|
|
|
|
/* Refresh Time register (0x30) Refresh every 7.8125uS */ |
|
|
|
|
mtdcr( 0x10, 0x00000030 ); |
|
|
|
|
mtdcr( 0x11, 0x08200000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_MMODE CL 4 */ |
|
|
|
|
mtdcr( 0x10, 0x00000088 ); |
|
|
|
|
mtdcr( 0x11, 0x00000642 ); |
|
|
|
|
|
|
|
|
|
/* MCIF0_MEMODE */ |
|
|
|
|
mtdcr( 0x10, 0x00000089 ); |
|
|
|
|
mtdcr( 0x11, 0x00000004 ); |
|
|
|
|
|
|
|
|
|
/*SET MCIF0_MB0CF */ |
|
|
|
|
mtdcr( 0x10, 0x00000040 ); |
|
|
|
|
mtdcr( 0x11, 0x00000201 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_MB1CF */ |
|
|
|
|
mtdcr( 0x10, 0x00000044 ); |
|
|
|
|
mtdcr( 0x11, 0x00000201 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_MB2CF */ |
|
|
|
|
mtdcr( 0x10, 0x00000048 ); |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x11, 0x00000201 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x11, 0x00000000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_MB3CF */ |
|
|
|
|
mtdcr( 0x10, 0x0000004c ); |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x11, 0x00000201 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x11, 0x00000000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR0 # NOP */ |
|
|
|
|
mtdcr( 0x10, 0x00000050 ); |
|
|
|
|
mtdcr( 0x11, 0xB5380000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR1 # PRE */ |
|
|
|
|
mtdcr( 0x10, 0x00000051 ); |
|
|
|
|
mtdcr( 0x11, 0x82100400 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR2 # EMR2 */ |
|
|
|
|
mtdcr( 0x10, 0x00000052 ); |
|
|
|
|
mtdcr( 0x11, 0x80820000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR3 # EMR3 */ |
|
|
|
|
mtdcr( 0x10, 0x00000053 ); |
|
|
|
|
mtdcr( 0x11, 0x80830000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR4 # EMR DLL ENABLE */ |
|
|
|
|
mtdcr( 0x10, 0x00000054 ); |
|
|
|
|
mtdcr( 0x11, 0x80810000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR5 # MR DLL RESET */ |
|
|
|
|
mtdcr( 0x10, 0x00000055 ); |
|
|
|
|
mtdcr( 0x11, 0x80800542 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR6 # PRE */ |
|
|
|
|
mtdcr( 0x10, 0x00000056 ); |
|
|
|
|
mtdcr( 0x11, 0x82100400 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR7 # Refresh */ |
|
|
|
|
mtdcr( 0x10, 0x00000057 ); |
|
|
|
|
mtdcr( 0x11, 0x8A080000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR8 # Refresh */ |
|
|
|
|
mtdcr( 0x10, 0x00000058 ); |
|
|
|
|
mtdcr( 0x11, 0x8A080000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR9 # Refresh */ |
|
|
|
|
mtdcr( 0x10, 0x00000059 ); |
|
|
|
|
mtdcr( 0x11, 0x8A080000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR10 # Refresh */ |
|
|
|
|
mtdcr( 0x10, 0x0000005A ); |
|
|
|
|
mtdcr( 0x11, 0x8A080000 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR11 # MR */ |
|
|
|
|
mtdcr( 0x10, 0x0000005B ); |
|
|
|
|
mtdcr( 0x11, 0x80800442 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR12 # EMR OCD Default*/ |
|
|
|
|
mtdcr( 0x10, 0x0000005C ); |
|
|
|
|
mtdcr( 0x11, 0x80810380 ); |
|
|
|
|
|
|
|
|
|
/* SET MCIF0_INITPLR13 # EMR OCD Exit */ |
|
|
|
|
mtdcr( 0x10, 0x0000005D ); |
|
|
|
|
mtdcr( 0x11, 0x80810000 ); |
|
|
|
|
|
|
|
|
|
/* 0x80: Adv Addr clock by 180 deg */ |
|
|
|
|
mtdcr( 0x10, 0x00000080 ); |
|
|
|
|
mtdcr( 0x11, 0x80000000 ); |
|
|
|
|
|
|
|
|
|
/* 0x21: Exit self refresh, set DC_EN */ |
|
|
|
|
mtdcr( 0x10, 0x00000021 ); |
|
|
|
|
mtdcr( 0x11, 0x28000000 ); |
|
|
|
|
|
|
|
|
|
/* 0x81: Write DQS Adv 90 + Fractional DQS Delay */ |
|
|
|
|
mtdcr( 0x10, 0x00000081 ); |
|
|
|
|
mtdcr( 0x11, 0x80000800 ); |
|
|
|
|
|
|
|
|
|
/* MCIF0_SDTR1 */ |
|
|
|
|
mtdcr( 0x10, 0x00000085 ); |
|
|
|
|
mtdcr( 0x11, 0x80201000 ); |
|
|
|
|
|
|
|
|
|
/* MCIF0_SDTR2 */ |
|
|
|
|
mtdcr( 0x10, 0x00000086 ); |
|
|
|
|
mtdcr( 0x11, 0x42103242 ); |
|
|
|
|
|
|
|
|
|
/* MCIF0_SDTR3 */ |
|
|
|
|
mtdcr( 0x10, 0x00000087 ); |
|
|
|
|
mtdcr( 0x11, 0x0C100D14 ); |
|
|
|
|
|
|
|
|
|
/* SET MQ0_B0BAS base addr 00000000 / 256MB */ |
|
|
|
|
mtdcr( 0x40, 0x0000F800 ); |
|
|
|
|
|
|
|
|
|
/* SET MQ0_B1BAS base addr 10000000 / 256MB */ |
|
|
|
|
mtdcr( 0x41, 0x0400F800 ); |
|
|
|
|
|
|
|
|
|
/* SET MQ0_B2BAS base addr 20000000 / 256MB */ |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x42, 0x0800F800 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x42, 0x00000000 ); |
|
|
|
|
|
|
|
|
|
/* SET MQ0_B3BAS base addr 30000000 / 256MB */ |
|
|
|
|
if (yucca_dimms == 2) |
|
|
|
|
mtdcr( 0x43, 0x0C00F800 ); |
|
|
|
|
else if (yucca_dimms == 1) |
|
|
|
|
mtdcr( 0x43, 0x00000000 ); |
|
|
|
|
|
|
|
|
|
/* SDRAM_RQDC */ |
|
|
|
|
mtdcr( 0x10, 0x00000070 ); |
|
|
|
|
mtdcr( 0x11, 0x8000003F ); |
|
|
|
|
|
|
|
|
|
/* SDRAM_RDCC */ |
|
|
|
|
mtdcr( 0x10, 0x00000078 ); |
|
|
|
|
mtdcr( 0x11, 0x80000000 ); |
|
|
|
|
|
|
|
|
|
/* SDRAM_RFDC */ |
|
|
|
|
mtdcr( 0x10, 0x00000074 ); |
|
|
|
|
mtdcr( 0x11, 0x00000220 ); |
|
|
|
|
|
|
|
|
|
return (yucca_dimms * 512) << 20; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
long int initdram (int board_type) |
|
|
|
|
{ |
|
|
|
|
long dram_size = 0; |
|
|
|
|
|
|
|
|
|
dram_size = fixed_sdram(); |
|
|
|
|
|
|
|
|
|
return dram_size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if defined(CFG_DRAM_TEST) |
|
|
|
|
int testdram (void) |
|
|
|
|
{ |
|
|
|
@ -1267,42 +994,3 @@ int onboard_pci_arbiter_selected(int core_pci) |
|
|
|
|
#endif |
|
|
|
|
return (BOARD_OPTION_NOT_SELECTED); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------+
|
|
|
|
|
| ppcMfcpr. |
|
|
|
|
+---------------------------------------------------------------------------*/ |
|
|
|
|
unsigned long ppcMfcpr(unsigned long cpr_reg) |
|
|
|
|
{ |
|
|
|
|
unsigned long msr; |
|
|
|
|
unsigned long cpr_cfgaddr_temp; |
|
|
|
|
unsigned long cpr_value; |
|
|
|
|
|
|
|
|
|
msr = (mfmsr () & ~(MSR_EE)); |
|
|
|
|
cpr_cfgaddr_temp = mfdcr(CPR0_CFGADDR); |
|
|
|
|
mtdcr(CPR0_CFGADDR, cpr_reg); |
|
|
|
|
cpr_value = mfdcr(CPR0_CFGDATA); |
|
|
|
|
mtdcr(CPR0_CFGADDR, cpr_cfgaddr_temp); |
|
|
|
|
mtmsr(msr); |
|
|
|
|
|
|
|
|
|
return (cpr_value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------+
|
|
|
|
|
| Indirect Access of the System DCR's (SDR) |
|
|
|
|
| ppcMfsdr |
|
|
|
|
+----------------------------------------------------------------------------*/ |
|
|
|
|
unsigned long ppcMfsdr(unsigned long sdr_reg) |
|
|
|
|
{ |
|
|
|
|
unsigned long msr; |
|
|
|
|
unsigned long sdr_cfgaddr_temp; |
|
|
|
|
unsigned long sdr_value; |
|
|
|
|
|
|
|
|
|
msr = (mfmsr () & ~(MSR_EE)); |
|
|
|
|
sdr_cfgaddr_temp = mfdcr(SDR0_CFGADDR); |
|
|
|
|
mtdcr(SDR0_CFGADDR, sdr_reg); |
|
|
|
|
sdr_value = mfdcr(SDR0_CFGDATA); |
|
|
|
|
mtdcr(SDR0_CFGADDR, sdr_cfgaddr_temp); |
|
|
|
|
mtmsr(msr); |
|
|
|
|
|
|
|
|
|
return (sdr_value); |
|
|
|
|
} |
|
|
|
|