From 529adafde26d951fa425029e0b56370c36d29081 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Fri, 27 Aug 2010 14:21:17 +0200 Subject: Make U-Boot restartable and crash dump support * Added an u8500 board specific ld script. Reserve space for .data backup. * Make a backup copy of initialised data (.data section). If restarted, copy the backup data back to .data. * Create crashkernel env variable dynamically, since it depends on U-Boot start address. For dumping U-Boot itself is used as crashkernel. * Set preboot environment variable to checkcrash command, if data_init_flag > 0, i.e. we were restarted e.g. by kexec. * Added crashkernel parameter to common bootargs. Decreased environment and pool sizes. * Changed link address of U-Boot: moved it 32 K up for kdump info to 0x05608000 * Added "checkcrash" command This command checks if there is a pending crash dump and writes it to a file on SD/MMC. ST-Ericsson ID: WP264488 Change-Id: If545822e424b95532f1128afb0e762b6b73834e9 Signed-off-by: Michael Brandt Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/3011 --- board/st/u8500/u8500.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'board/st/u8500/u8500.c') diff --git a/board/st/u8500/u8500.c b/board/st/u8500/u8500.c index c02d7d9b0..debcc117c 100644 --- a/board/st/u8500/u8500.c +++ b/board/st/u8500/u8500.c @@ -69,6 +69,14 @@ int board_id; /* set in board_late_init() */ int errno; +/* + * Flag to indicate from where to where we have to copy the initialised data. + * In case we were loaded, its value is -1 and .data must be saved for an + * eventual restart. It is 1 if .data was restored, i.e. we were restarted, + * e.g. by kexec. + */ +static volatile int data_init_flag = -1; /* -1 to get it into .data section */ + /* PLLs for clock management registers */ enum { GATED = 0, @@ -194,6 +202,28 @@ int cpu_is_u8500v2(void) int board_init(void) { + extern char _idata_start[]; + extern char _data_start[]; + extern char _data_end[]; + unsigned long data_len; + + data_len = _data_end - _data_start; + if (++data_init_flag == 0) { + /* + * first init after reset/loading + * save .data section for restart + */ + memcpy(_idata_start, _data_start, data_len); + } else { + /* + * restart, e.g. by kexec + * copy back .data section + */ + memcpy(_data_start, _idata_start, data_len); + /* memcpy set data_init_flag back to zero */ + ++data_init_flag; + } + gd->bd->bi_arch_number = 0x1A4; gd->bd->bi_boot_params = 0x00000100; @@ -378,6 +408,7 @@ int board_late_init(void) #ifdef CONFIG_MMC uchar byte_array[] = {0x06, 0x06}; #endif + char strbuf[80]; /* * Determine and set board_id environment variable @@ -436,6 +467,25 @@ int board_late_init(void) setenv("mem", "512M"); } + /* + * Create crashkernel env dynamically since it depends on U-Boot start + * address. U-Boot itself is used for dumping. + * The 32K offset is hardcoded in the kexec-tools. + * Parsed by Linux setup.c:reserve_crashkernel() using + * lib/cmdline.c:memparse(). + * crashkernel=ramsize-range:size[,...][@offset] + */ + sprintf(strbuf, "crashkernel=1M@0x%lx", _armboot_start - 0x8000); + setenv("crashkernel", strbuf); + + /* + * Check for a crashdump, if data_init_flag > 0, i.e. we were + * restarted e.g. by kexec. Do not check for crashdump if we were just + * loaded from the x-loader. + */ + if (data_init_flag > 0) + setenv("preboot", "checkcrash"); + return (0); } #endif /* BOARD_LATE_INIT */ -- cgit v1.2.3