diff options
Diffstat (limited to 'arch/arm/cpu')
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/hwinit-common.c | 20 | 
1 files changed, 18 insertions, 2 deletions
| diff --git a/arch/arm/cpu/armv7/omap-common/hwinit-common.c b/arch/arm/cpu/armv7/omap-common/hwinit-common.c index cf71ab444..660032330 100644 --- a/arch/arm/cpu/armv7/omap-common/hwinit-common.c +++ b/arch/arm/cpu/armv7/omap-common/hwinit-common.c @@ -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;  } |