diff options
author | Simon Glass <sjg@chromium.org> | 2014-10-19 21:11:24 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2014-10-22 09:03:06 -0600 |
commit | 90268b878bd830f2fc9b1e225d96009efe331cd1 (patch) | |
tree | 680cddba7c37d284971ff23d0b4b66611b4cf019 /common/bootm.c | |
parent | 381197788dbf8bb94f96ec9e03b6b81618187260 (diff) | |
download | u-boot-imx-90268b878bd830f2fc9b1e225d96009efe331cd1.zip u-boot-imx-90268b878bd830f2fc9b1e225d96009efe331cd1.tar.gz u-boot-imx-90268b878bd830f2fc9b1e225d96009efe331cd1.tar.bz2 |
x86: Support loading kernel setup from a FIT
Add a new setup@ section to the FIT which can be used to provide a setup
binary for booting Linux on x86. This makes it possible to boot x86 from
a FIT.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common/bootm.c')
-rw-r--r-- | common/bootm.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/common/bootm.c b/common/bootm.c index ff81a27..17ed389 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -9,6 +9,7 @@ #include <common.h> #include <bootstage.h> #include <bzlib.h> +#include <errno.h> #include <fdt_support.h> #include <lmb.h> #include <malloc.h> @@ -83,6 +84,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, { const void *os_hdr; bool ep_found = false; + int ret; /* get kernel image header, start address and length */ os_hdr = boot_get_kernel(cmdtp, flag, argc, argv, @@ -102,6 +104,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, images.os.end = image_get_image_end(os_hdr); images.os.load = image_get_load(os_hdr); + images.os.arch = image_get_arch(os_hdr); break; #endif #if defined(CONFIG_FIT) @@ -129,6 +132,13 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, return 1; } + if (fit_image_get_arch(images.fit_hdr_os, + images.fit_noffset_os, + &images.os.arch)) { + puts("Can't get image ARCH!\n"); + return 1; + } + images.os.end = fit_get_end(images.fit_hdr_os); if (fit_image_get_load(images.fit_hdr_os, images.fit_noffset_os, @@ -156,8 +166,17 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, return 1; } - /* find kernel entry point */ - if (images.legacy_hdr_valid) { + /* If we have a valid setup.bin, we will use that for entry (x86) */ + if (images.os.arch == IH_ARCH_I386) { + ulong len; + + ret = boot_get_setup(&images, IH_ARCH_I386, &images.ep, &len); + if (ret < 0 && ret != -ENOENT) { + puts("Could not find a valid setup.bin for x86\n"); + return 1; + } + /* Kernel entry point is the setup.bin */ + } else if (images.legacy_hdr_valid) { images.ep = image_get_ep(&images.legacy_hdr_os_copy); #if defined(CONFIG_FIT) } else if (images.fit_uname_os) { |