diff options
Diffstat (limited to 'arch/arm/cpu/armv7/omap4/board.c')
| -rw-r--r-- | arch/arm/cpu/armv7/omap4/board.c | 30 | 
1 files changed, 29 insertions, 1 deletions
| diff --git a/arch/arm/cpu/armv7/omap4/board.c b/arch/arm/cpu/armv7/omap4/board.c index 195be6eea..8c1f3953e 100644 --- a/arch/arm/cpu/armv7/omap4/board.c +++ b/arch/arm/cpu/armv7/omap4/board.c @@ -30,6 +30,7 @@  #include <common.h>  #include <asm/arch/cpu.h>  #include <asm/arch/sys_proto.h> +#include <asm/sizes.h>  /*   * Routine: s_init @@ -66,6 +67,33 @@ void watchdog_init(void)  	writel(WD_UNLOCK2, &wd2_base->wspr);  } + +/* + * This function finds the SDRAM size available in the system + * based on DMM section configurations + * This is needed because the size of memory installed may be + * different on different versions of the board + */ +u32 sdram_size(void) +{ +	u32 section, i, total_size = 0, size, addr; +	for (i = 0; i < 4; i++) { +		section	= __raw_readl(DMM_LISA_MAP_BASE + i*4); +		addr = section & DMM_LISA_MAP_SYS_ADDR_MASK; +		/* See if the address is valid */ +		if ((addr >= OMAP44XX_DRAM_ADDR_SPACE_START) && +		    (addr < OMAP44XX_DRAM_ADDR_SPACE_END)) { +			size	= ((section & DMM_LISA_MAP_SYS_SIZE_MASK) >> +				    DMM_LISA_MAP_SYS_SIZE_SHIFT); +			size	= 1 << size; +			size	*= SZ_16M; +			total_size += size; +		} +	} +	return total_size; +} + +  /*   * Routine: dram_init   * Description: sets uboots idea of sdram size @@ -75,7 +103,7 @@ int dram_init(void)  	DECLARE_GLOBAL_DATA_PTR;  	gd->bd->bi_dram[0].start = 0x80000000; -	gd->bd->bi_dram[0].size = 512 << 20; +	gd->bd->bi_dram[0].size = sdram_size();  	return 0;  } |