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>
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <bootm.h>
|
||||
#include <command.h>
|
||||
#include <environment.h>
|
||||
#include <errno.h>
|
||||
#include <image.h>
|
||||
#include <lmb.h>
|
||||
#include <malloc.h>
|
||||
|
||||
@@ -1497,6 +1497,8 @@ static const char *fit_get_image_type_property(int type)
|
||||
return FIT_KERNEL_PROP;
|
||||
case IH_TYPE_RAMDISK:
|
||||
return FIT_RAMDISK_PROP;
|
||||
case IH_TYPE_X86_SETUP:
|
||||
return FIT_SETUP_PROP;
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
@@ -1693,3 +1695,23 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
|
||||
|
||||
return noffset;
|
||||
}
|
||||
|
||||
int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch,
|
||||
ulong *setup_start, ulong *setup_len)
|
||||
{
|
||||
int noffset;
|
||||
ulong addr;
|
||||
ulong len;
|
||||
int ret;
|
||||
|
||||
addr = map_to_sysmem(images->fit_hdr_os);
|
||||
noffset = fit_get_node_from_config(images, FIT_SETUP_PROP, addr);
|
||||
if (noffset < 0)
|
||||
return noffset;
|
||||
|
||||
ret = fit_image_load(images, addr, NULL, NULL, arch,
|
||||
IH_TYPE_X86_SETUP, BOOTSTAGE_ID_FIT_SETUP_START,
|
||||
FIT_LOAD_REQUIRED, setup_start, &len);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -143,6 +143,7 @@ static const table_entry_t uimage_type[] = {
|
||||
{ IH_TYPE_UBLIMAGE, "ublimage", "Davinci UBL image",},
|
||||
{ IH_TYPE_MXSIMAGE, "mxsimage", "Freescale MXS Boot Image",},
|
||||
{ IH_TYPE_ATMELIMAGE, "atmelimage", "ATMEL ROM-Boot Image",},
|
||||
{ IH_TYPE_X86_SETUP, "x86_setup", "x86 setup.bin", },
|
||||
{ -1, "", "", },
|
||||
};
|
||||
|
||||
@@ -1136,6 +1137,16 @@ error:
|
||||
}
|
||||
#endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
|
||||
|
||||
int boot_get_setup(bootm_headers_t *images, uint8_t arch,
|
||||
ulong *setup_start, ulong *setup_len)
|
||||
{
|
||||
#if defined(CONFIG_FIT)
|
||||
return boot_get_setup_fit(images, arch, setup_start, setup_len);
|
||||
#else
|
||||
return -ENOENT;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
|
||||
/**
|
||||
* boot_get_cmdline - allocate and initialize kernel cmdline
|
||||
|
||||
Reference in New Issue
Block a user