|
@@ -137,6 +137,20 @@
|
|
|
#define MY_TLB_WORD2_I_ENABLE TLB_WORD2_I_ENABLE /* disable caching on SDRAM */
|
|
|
#endif
|
|
|
|
|
|
+/*
|
|
|
+ * Newer PPC's like 440SPe, 460EX/GT can be equipped with more than 2GB of SDRAM.
|
|
|
+ * To support such configurations, we "only" map the first 2GB via the TLB's. We
|
|
|
+ * need some free virtual address space for the remaining peripherals like, SoC
|
|
|
+ * devices, FLASH etc.
|
|
|
+ *
|
|
|
+ * Note that ECC is currently not supported on configurations with more than 2GB
|
|
|
+ * SDRAM. This is because we only map the first 2GB on such systems, and therefore
|
|
|
+ * the ECC parity byte of the remaining area can't be written.
|
|
|
+ */
|
|
|
+#ifndef CONFIG_MAX_MEM_MAPPED
|
|
|
+#define CONFIG_MAX_MEM_MAPPED ((phys_size_t)2 << 30)
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Board-specific Platform code can reimplement spd_ddr_init_hang () if needed
|
|
|
*/
|
|
@@ -181,7 +195,7 @@ typedef enum ddr_cas_id {
|
|
|
/*-----------------------------------------------------------------------------+
|
|
|
* Prototypes
|
|
|
*-----------------------------------------------------------------------------*/
|
|
|
-static unsigned long sdram_memsize(void);
|
|
|
+static phys_size_t sdram_memsize(void);
|
|
|
static void get_spd_info(unsigned long *dimm_populated,
|
|
|
unsigned char *iic0_dimm_addr,
|
|
|
unsigned long num_dimm_banks);
|
|
@@ -306,9 +320,9 @@ static unsigned char spd_read(uchar chip, uint addr)
|
|
|
/*-----------------------------------------------------------------------------+
|
|
|
* sdram_memsize
|
|
|
*-----------------------------------------------------------------------------*/
|
|
|
-static unsigned long sdram_memsize(void)
|
|
|
+static phys_size_t sdram_memsize(void)
|
|
|
{
|
|
|
- unsigned long mem_size;
|
|
|
+ phys_size_t mem_size;
|
|
|
unsigned long mcopt2;
|
|
|
unsigned long mcstat;
|
|
|
unsigned long mb0cf;
|
|
@@ -364,6 +378,8 @@ static unsigned long sdram_memsize(void)
|
|
|
mem_size+=4096;
|
|
|
break;
|
|
|
default:
|
|
|
+ printf("WARNING: Unsupported bank size (SDSZ=0x%lx)!\n"
|
|
|
+ , sdsz);
|
|
|
mem_size=0;
|
|
|
break;
|
|
|
}
|
|
@@ -371,8 +387,7 @@ static unsigned long sdram_memsize(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- mem_size *= 1024 * 1024;
|
|
|
- return(mem_size);
|
|
|
+ return mem_size << 20;
|
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------------+
|
|
@@ -400,7 +415,7 @@ phys_size_t initdram(int board_type)
|
|
|
unsigned long val;
|
|
|
ddr_cas_id_t selected_cas = DDR_CAS_5; /* preset to silence compiler */
|
|
|
int write_recovery;
|
|
|
- unsigned long dram_size = 0;
|
|
|
+ phys_size_t dram_size = 0;
|
|
|
|
|
|
num_dimm_banks = sizeof(iic0_dimm_addr);
|
|
|
|
|
@@ -558,6 +573,12 @@ phys_size_t initdram(int board_type)
|
|
|
/* get installed memory size */
|
|
|
dram_size = sdram_memsize();
|
|
|
|
|
|
+ /*
|
|
|
+ * Limit size to 2GB
|
|
|
+ */
|
|
|
+ if (dram_size > CONFIG_MAX_MEM_MAPPED)
|
|
|
+ dram_size = CONFIG_MAX_MEM_MAPPED;
|
|
|
+
|
|
|
/* and program tlb entries for this size (dynamic) */
|
|
|
|
|
|
/*
|
|
@@ -595,7 +616,7 @@ phys_size_t initdram(int board_type)
|
|
|
*/
|
|
|
set_mcsr(get_mcsr());
|
|
|
|
|
|
- return dram_size;
|
|
|
+ return sdram_memsize();
|
|
|
}
|
|
|
|
|
|
static void get_spd_info(unsigned long *dimm_populated,
|
|
@@ -839,8 +860,8 @@ static void check_rank_number(unsigned long *dimm_populated,
|
|
|
|
|
|
|
|
|
if (dimm_rank > MAXRANKS) {
|
|
|
- printf("ERROR: DRAM DIMM detected with %d ranks in "
|
|
|
- "slot %d is not supported.\n", dimm_rank, dimm_num);
|
|
|
+ printf("ERROR: DRAM DIMM detected with %lu ranks in "
|
|
|
+ "slot %lu 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");
|
|
|
spd_ddr_init_hang ();
|
|
@@ -1041,7 +1062,7 @@ static void program_copt1(unsigned long *dimm_populated,
|
|
|
dimm_32bit = TRUE;
|
|
|
break;
|
|
|
default:
|
|
|
- printf("WARNING: Detected a DIMM with a data width of %d bits.\n",
|
|
|
+ printf("WARNING: Detected a DIMM with a data width of %lu bits.\n",
|
|
|
data_width);
|
|
|
printf("Only DIMMs with 32 or 64 bit DDR-SDRAM widths are supported.\n");
|
|
|
break;
|
|
@@ -1594,7 +1615,7 @@ static void program_mode(unsigned long *dimm_populated,
|
|
|
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",
|
|
|
+ printf("sdram_freq=%lu cycle3=%lu cycle4=%lu cycle5=%lu\n\n",
|
|
|
sdram_freq, cycle_3_0_clk, cycle_4_0_clk, cycle_5_0_clk);
|
|
|
spd_ddr_init_hang ();
|
|
|
}
|
|
@@ -2133,15 +2154,15 @@ static void program_memory_queue(unsigned long *dimm_populated,
|
|
|
unsigned long num_dimm_banks)
|
|
|
{
|
|
|
unsigned long dimm_num;
|
|
|
- unsigned long rank_base_addr;
|
|
|
+ phys_size_t rank_base_addr;
|
|
|
unsigned long rank_reg;
|
|
|
- unsigned long rank_size_bytes;
|
|
|
+ phys_size_t rank_size_bytes;
|
|
|
unsigned long rank_size_id;
|
|
|
unsigned long num_ranks;
|
|
|
unsigned long baseadd_size;
|
|
|
unsigned long i;
|
|
|
unsigned long bank_0_populated = 0;
|
|
|
- unsigned long total_size = 0;
|
|
|
+ phys_size_t total_size = 0;
|
|
|
|
|
|
/*------------------------------------------------------------------
|
|
|
* Reset the rank_base_address.
|
|
@@ -2289,6 +2310,11 @@ static void program_ecc(unsigned long *dimm_populated,
|
|
|
if (ecc == 0)
|
|
|
return;
|
|
|
|
|
|
+ if (sdram_memsize() > CONFIG_MAX_MEM_MAPPED) {
|
|
|
+ printf("\nWarning: Can't enable ECC on systems with more than 2GB of SDRAM!\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
mfsdram(SDRAM_MCOPT1, mcopt1);
|
|
|
mfsdram(SDRAM_MCOPT2, mcopt2);
|
|
|
|
|
@@ -2441,6 +2467,7 @@ static int short_mem_test(void)
|
|
|
u32 bxcf;
|
|
|
int i;
|
|
|
int j;
|
|
|
+ phys_size_t base_addr;
|
|
|
u32 test[NUMMEMTESTS][NUMMEMWORDS] = {
|
|
|
{0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
|
|
|
0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF},
|
|
@@ -2467,10 +2494,17 @@ static int short_mem_test(void)
|
|
|
if ((bxcf & SDRAM_BXCF_M_BE_MASK) == SDRAM_BXCF_M_BE_ENABLE) {
|
|
|
/* Bank is enabled */
|
|
|
|
|
|
+ /*
|
|
|
+ * Only run test on accessable memory (below 2GB)
|
|
|
+ */
|
|
|
+ base_addr = SDRAM_RXBAS_SDBA_DECODE(mfdcr_any(SDRAM_R0BAS+bxcr_num));
|
|
|
+ if (base_addr >= CONFIG_MAX_MEM_MAPPED)
|
|
|
+ continue;
|
|
|
+
|
|
|
/*------------------------------------------------------------------
|
|
|
* Run the short memory test.
|
|
|
*-----------------------------------------------------------------*/
|
|
|
- membase = (u32 *)(SDRAM_RXBAS_SDBA_DECODE(mfdcr_any(SDRAM_R0BAS+bxcr_num)));
|
|
|
+ membase = (u32 *)(u32)base_addr;
|
|
|
|
|
|
for (i = 0; i < NUMMEMTESTS; i++) {
|
|
|
for (j = 0; j < NUMMEMWORDS; j++) {
|