mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-27 15:12:21 +00:00
ARM: OMAP4+: dmm: Take care of overlapping dmm and trap sections.
The DMM sections can be overlapping with each other, with sections 3 to 0 having the highest to lowest priority in that order. There could also be a section that is used trap the unmapped Tiler entries and this trap section could be overlapping with the actual sdram area. So take care of the above scenarios while calculating the size of the actual ram. Signed-off-by: R Sricharan <r.sricharan@ti.com>
This commit is contained in:
parent
14b9f16c40
commit
e06e914d87
1 changed files with 18 additions and 2 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue