*/
 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)) {
                                   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;
 }