[U-Boot-Users] [PATCH] ppc: Add CONFIG_TOP_HIDE option to hide memory area that doesn't get "touched"
Matthias Fuchs
matthias.fuchs at esd-electronics.com
Sat Mar 22 11:04:53 CET 2008
Hi Stefan,
I followed this discussion. The DU440 board will also need this fix.
On the PMC440 board we reserved the top memory region for
some PCI accessable shared memory. I will check how we can
handle skipping the top 256 bytes and provide a patch for both of our 440EPx
boards soon.
I did not get into much depth with this issue, but your fix will make the
logbuffer ram and pram unaligned to a page boundary. I am not sure if this
is a good idea. Let's say you want to ioremap the pram under Linux you cannot
let the mapped region end at log bufferbuffer start address because it just
lost its alignment on a 4k page boundary.
Matthias
> The other remaining 440EPx board were intentionally not included
> since it is not clear to me, if they use the end of ram for some
> other purpose. This is unclear, since these boards have CONFIG_PRAM
> defined and even comments like this:
>
> PMC440.h:
> /* esd expects pram at end of physical memory.
> * So no logbuffer at the moment.
> */
>
> It is strongly recommendet to not use the last 256 bytes on those
> boards too. Patches from the board maintainers are welcome.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> ---
> include/configs/korat.h | 2 ++
> include/configs/lwmon5.h | 2 ++
> include/configs/sequoia.h | 4 +++-
> lib_ppc/board.c | 17 +++++++++++++++++
> 4 files changed, 24 insertions(+), 1 deletions(-)
>
> diff --git a/include/configs/korat.h b/include/configs/korat.h
> index dcec9b0..c215c63 100644
> --- a/include/configs/korat.h
> +++ b/include/configs/korat.h
> @@ -144,6 +144,8 @@
> #define SPD_EEPROM_ADDRESS {0x50}
> #define CONFIG_PROG_SDRAM_TLB
> #define CFG_DRAM_TEST
> +#define CONFIG_MEM_TOP_HIDE 256 /* don't use last 256 bytes */
> + /* 440EPx errata CHIP 11 */
>
> /*
> * I2C
> diff --git a/include/configs/lwmon5.h b/include/configs/lwmon5.h
> index c3f10c7..f573730 100644
> --- a/include/configs/lwmon5.h
> +++ b/include/configs/lwmon5.h
> @@ -85,6 +85,8 @@
> #define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET
> #define CFG_POST_ALT_WORD_ADDR (CFG_PERIPHERAL_BASE + GPT0_COMP6)
> /* unused GPT0 COMP reg */
> +#define CONFIG_MEM_TOP_HIDE 256 /* don't use last 256 bytes */
> + /* 440EPx errata CHIP 11 */
>
> /*-----------------------------------------------------------------------
> * Serial Port
> diff --git a/include/configs/sequoia.h b/include/configs/sequoia.h
> index dfa8779..0188234 100644
> --- a/include/configs/sequoia.h
> +++ b/include/configs/sequoia.h
> @@ -221,6 +221,8 @@
> #if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
> #define CONFIG_DDR_DATA_EYE /* use DDR2 optimization */
> #endif
> +#define CONFIG_MEM_TOP_HIDE 256 /* don't use last 256 bytes */
> + /* 440EPx errata CHIP 11 */
>
> /*
> * I2C
> @@ -275,7 +277,7 @@
> "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}" \
> ":${hostname}:${netdev}:off panic=1\0" \
> "addtty=setenv bootargs ${bootargs} console=ttyS0,${baudrate}\0"\
> - "addmisc=setenv bootargs ${bootargs} mem=${mem}\0" \
> + "addmisc=setenv bootargs ${bootargs}\0" \
> "flash_nfs=run nfsargs addip addtty addmisc;" \
> "bootm ${kernel_addr}\0" \
> "flash_self=run ramargs addip addtty addmisc;" \
> diff --git a/lib_ppc/board.c b/lib_ppc/board.c
> index fbf1c5d..13b6f54 100644
> --- a/lib_ppc/board.c
> +++ b/lib_ppc/board.c
> @@ -117,6 +117,10 @@ DECLARE_GLOBAL_DATA_PTR;
> #define TOTAL_MALLOC_LEN CFG_MALLOC_LEN
> #endif
>
> +#if !defined(CONFIG_MEM_TOP_HIDE)
> +#define CONFIG_MEM_TOP_HIDE 0
> +#endif
> +
> extern ulong __init_end;
> extern ulong _end;
> ulong monitor_flash_len;
> @@ -425,6 +429,7 @@ 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
> @@ -433,6 +438,18 @@ void board_init_f (ulong bootflag)
> */
> len = (ulong)&_end - CFG_MONITOR_BASE;
>
> + /*
> + * 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 -= CONFIG_MEM_TOP_HIDE;
> +
> addr = CFG_SDRAM_BASE + get_effective_memsize();
>
> #ifdef CONFIG_LOGBUFFER
--
-------------------------------------------------------------------------
Dipl.-Ing. Matthias Fuchs
Head of System Design
esd electronic system design gmbh
Vahrenwalder Str. 207 - 30165 Hannover - GERMANY
Phone: +49-511-37298-0 - Fax: +49-511-37298-68
Please visit our homepage http://www.esd.eu
Quality Products - Made in Germany
-------------------------------------------------------------------------
Geschäftsführer: Klaus Detering, Dr. Werner Schulze
Amtsgericht Hannover HRB 51373 - VAT-ID DE 115672832
-------------------------------------------------------------------------
More information about the U-Boot
mailing list