diff options
author | Kumar Gala <galak@kernel.crashing.org> | 2008-02-27 21:51:49 -0600 |
---|---|---|
committer | Marian Balakowicz <m8@semihalf.com> | 2008-02-29 13:15:56 +0100 |
commit | e822d7fc4dd4755d4d0a22f05e33f33d1a0481da (patch) | |
tree | 2b63ad520db48b6e134cd7d5ce67e950f428c1cc /lib_m68k/bootm.c | |
parent | f5614e7926863bf0225ec860d9b319741a9c4004 (diff) | |
download | u-boot-imx-e822d7fc4dd4755d4d0a22f05e33f33d1a0481da.zip u-boot-imx-e822d7fc4dd4755d4d0a22f05e33f33d1a0481da.tar.gz u-boot-imx-e822d7fc4dd4755d4d0a22f05e33f33d1a0481da.tar.bz2 |
[new uImage] Use lmb for bootm allocations
Convert generic ramdisk_high(), get_boot_cmdline(), get_boot_kbd()
functions over to using lmb for allocation of the ramdisk, command line
and kernel bd info.
Convert PPC specific fdt_relocate() to use lmb for allocation of the device
tree.
Provided a weak function that board code can call to do additional
lmb reserves if needed.
Also introduce the concept of bootmap_base to specify the offset in
physical memory that the bootmap is located at. This is used for
allocations of the cmdline, kernel bd, and device tree as they should
be contained within bootmap_base and bootmap_base + CFG_BOOTMAPSZ.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'lib_m68k/bootm.c')
-rw-r--r-- | lib_m68k/bootm.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/lib_m68k/bootm.c b/lib_m68k/bootm.c index c9d2a27..8429ca0 100644 --- a/lib_m68k/bootm.c +++ b/lib_m68k/bootm.c @@ -50,16 +50,18 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], bootm_headers_t *images) { - ulong sp, sp_limit, alloc_current; + ulong sp; ulong rd_data_start, rd_data_end, rd_len; ulong initrd_start, initrd_end; int ret; ulong cmd_start, cmd_end; + ulong bootmap_base = 0; bd_t *kbd; ulong ep = 0; void (*kernel) (bd_t *, ulong, ulong, ulong, ulong); + struct lmb *lmb = images->lmb; /* * Booting a (Linux) kernel image @@ -73,14 +75,23 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, sp = get_sp(); debug ("## Current stack ends at 0x%08lx ", sp); - alloc_current = sp_limit = get_boot_sp_limit(sp); - debug ("=> set upper limit to 0x%08lx\n", sp_limit); + /* adjust sp by 1K to be safe */ + sp -= 1024; + lmb_reserve(lmb, sp, (CFG_SDRAM_BASE + gd->ram_size - sp)); /* allocate space and init command line */ - alloc_current = get_boot_cmdline (alloc_current, &cmd_start, &cmd_end); + ret = get_boot_cmdline (lmb, &cmd_start, &cmd_end, bootmap_base); + if (ret) { + puts("ERROR with allocation of cmdline\n"); + goto error; + } /* allocate space for kernel copy of board info */ - alloc_current = get_boot_kbd (alloc_current, &kbd); + ret = get_boot_kbd (lmb, &kbd, bootmap_base); + if (ret) { + puts("ERROR with allocation of kernel bd\n"); + goto error; + } set_clocks_in_mhz(kbd); /* find kernel entry point */ @@ -105,8 +116,9 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, goto error; rd_len = rd_data_end - rd_data_start; - alloc_current = ramdisk_high (alloc_current, rd_data_start, rd_len, - sp_limit, get_sp (), &initrd_start, &initrd_end); + ret = ramdisk_high (lmb, rd_data_start, rd_len, &initrd_start, &initrd_end); + if (ret) + goto error; debug("## Transferring control to Linux (at address %08lx) ...\n", (ulong) kernel); |