diff options
Diffstat (limited to 'lib_ppc')
-rw-r--r-- | lib_ppc/board.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 30383027c7..7d33914492 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -120,6 +120,11 @@ DECLARE_GLOBAL_DATA_PTR; #define TOTAL_MALLOC_LEN CFG_MALLOC_LEN #endif +#if !defined(CFG_MEM_TOP_HIDE) +#define CFG_MEM_TOP_HIDE 0 +#endif + +extern ulong _start; extern ulong __init_end; extern ulong _end; ulong monitor_flash_len; @@ -428,13 +433,26 @@ void board_init_f (ulong bootflag) * relocate the code and continue running from DRAM. * * Reserve memory at end of RAM for (top down in that order): + * - area that won't get touched by U-Boot and Linux (optional) * - kernel log buffer * - protected RAM * - LCD framebuffer * - monitor code * - board info struct */ - len = (ulong)&_end - CFG_MONITOR_BASE; + len = (ulong)&_end - (ulong)&_start + EXC_OFF_SYS_RESET; + + /* + * Subtract specified amount of memory to hide so that it won't + * get "touched" at all by U-Boot. By fixing up gd->ram_size + * the Linux kernel should now get passed the now "corrected" + * memory size and won't touch it either. This should work + * for arch/ppc and arch/powerpc. Only Linux board ports in + * arch/powerpc with bootwrapper support, that recalculate the + * memory size from the SDRAM controller setup will have to + * get fixed. + */ + gd->ram_size -= CFG_MEM_TOP_HIDE; #ifndef CONFIG_MAX_MEM_MAPPED #define CONFIG_MAX_MEM_MAPPED (256 << 20) @@ -876,7 +894,7 @@ void board_init_r (gd_t *id, ulong dest_addr) sc3_read_eeprom(); #endif -#ifdef CFG_ID_EEPROM +#if defined (CFG_ID_EEPROM) || defined (CFG_I2C_MAC_OFFSET) mac_read_from_eeprom(); #endif |