summaryrefslogtreecommitdiffstats
path: root/common/main.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2012-10-25 16:31:11 +0000
committerGerald Van Baren <gvb@unssw.com>2012-11-12 23:14:57 -0500
commitfcabc24f4fd2fd581036c7a20eee47a204f04f39 (patch)
tree2d534f1bb42bf9890ee233d2a7ae9865f888ed29 /common/main.c
parentd95f6ec7334076a1e4b13f3748ebfd1b58ac90f6 (diff)
downloadblackbird-obmc-uboot-fcabc24f4fd2fd581036c7a20eee47a204f04f39.tar.gz
blackbird-obmc-uboot-fcabc24f4fd2fd581036c7a20eee47a204f04f39.zip
fdt: Set kernaddr if fdt indicates a kernel is present
If kernel-offset is specified in the fdt, set an environment variable so that scripts can access the attached kernel. This can be used by a packaging program to tell U-Boot about a kernel that has been downloaded alongside U-Boot. The value in the fdt is the offset of the kernel from the start of the U-Boot image, so we can find it just by adding CONFIG_SYS_TEXT_BASE. It is then fairly easy to put something like this in the environment variables in the board header file: "if test ${kernaddr} != \"\"; then "\ "echo \"Using bundled kernel\"; "\ "bootm ${kernaddr};" \ "fi; "\ /* rest of boot sequence follows here */ Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common/main.c')
-rw-r--r--common/main.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/common/main.c b/common/main.c
index 61c6cac882..8052d4222e 100644
--- a/common/main.c
+++ b/common/main.c
@@ -333,6 +333,20 @@ err:
hang();
}
+static void process_fdt_options(const void *blob)
+{
+ ulong addr;
+
+ /* Add an env variable to point to a kernel payload, if available */
+ addr = fdtdec_get_config_int(gd->fdt_blob, "kernel-offset", 0);
+ if (addr)
+ setenv_addr("kernaddr", (void *)(CONFIG_SYS_TEXT_BASE + addr));
+
+ /* Add an env variable to point to a root disk, if available */
+ addr = fdtdec_get_config_int(gd->fdt_blob, "rootdisk-offset", 0);
+ if (addr)
+ setenv_addr("rootaddr", (void *)(CONFIG_SYS_TEXT_BASE + addr));
+}
#endif /* CONFIG_OF_CONTROL */
@@ -451,6 +465,8 @@ void main_loop (void)
if (env)
s = env;
+ process_fdt_options(gd->fdt_blob);
+
/*
* If the bootsecure option was chosen, use secure_boot_cmd().
* Always use 'env' in this case, since bootsecure requres that the
OpenPOWER on IntegriCloud