|
@@ -162,11 +162,16 @@ void watchdog_init(void)
|
|
|
*/
|
|
|
u32 omap_sdram_size(void)
|
|
|
{
|
|
|
- u32 section, i, total_size = 0, size, addr;
|
|
|
+ u32 section, i, valid;
|
|
|
+ u64 sdram_start = 0, sdram_end = 0, addr,
|
|
|
+ size, total_size = 0, trap_size = 0;
|
|
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
section = __raw_readl(DMM_BASE + i*4);
|
|
|
+ valid = (section & EMIF_SDRC_ADDRSPC_MASK) >>
|
|
|
+ (EMIF_SDRC_ADDRSPC_SHIFT);
|
|
|
addr = section & EMIF_SYS_ADDR_MASK;
|
|
|
+
|
|
|
/* See if the address is valid */
|
|
|
if ((addr >= DRAM_ADDR_SPACE_START) &&
|
|
|
(addr < DRAM_ADDR_SPACE_END)) {
|
|
@@ -174,9 +179,20 @@ u32 omap_sdram_size(void)
|
|
|
EMIF_SYS_SIZE_SHIFT);
|
|
|
size = 1 << size;
|
|
|
size *= SZ_16M;
|
|
|
- total_size += size;
|
|
|
+
|
|
|
+ if (valid != DMM_SDRC_ADDR_SPC_INVALID) {
|
|
|
+ if (!sdram_start || (addr < sdram_start))
|
|
|
+ sdram_start = addr;
|
|
|
+ if (!sdram_end || ((addr + size) > sdram_end))
|
|
|
+ sdram_end = addr + size;
|
|
|
+ } else {
|
|
|
+ trap_size = size;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
+ total_size = (sdram_end - sdram_start) - (trap_size);
|
|
|
|
|
|
return total_size;
|
|
|
}
|