Patchwork [U-Boot,14/14] fdt: Set kernaddr if fdt indicates a kernel is present

login
register
mail settings
Submitter Simon Glass
Date Oct. 26, 2012, 2:31 a.m.
Message ID <1351218671-15228-15-git-send-email-sjg@chromium.org>
Download mbox | patch
Permalink /patch/194335/
State Accepted, archived
Delegated to: Jerry Van Baren
Headers show

Comments

Simon Glass - Oct. 26, 2012, 2:31 a.m.
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>
---
 common/main.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)
Dennis Lan (dlan) - Nov. 28, 2012, 2:30 p.m.
hi simon:
  found a small bug?(not sure) which introduced by this commit.

this line not inldue FDT option
#if defined(CONFIG_SILENT_CONSOLE) || defined(CONFIG_POST) ||
defined(CONFIG_CMDLINE_EDITING)
DECLARE_GLOBAL_DATA_PTR;
#endif


main.c: In function 'process_fdt_options':
main.c:341:31: error: 'gd' undeclared (first use in this function)
main.c:341:31: note: each undeclared identifier is reported only once for
each function it appears in
main.c: In function 'main_loop':
main.c:464:33: error: 'gd' undeclared (first use in this function)
make[2]: *** [main.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [common/libcommon.o] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [lt703a] Error 2



On Fri, Oct 26, 2012 at 10:31 AM, Simon Glass <sjg@chromium.org> wrote:

> 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>
> ---
>  common/main.c |   16 ++++++++++++++++
>  1 files changed, 16 insertions(+), 0 deletions(-)
>
> diff --git a/common/main.c b/common/main.c
> index 03c63b4..3137b75 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
> --
> 1.7.7.3
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
Simon Glass - Nov. 28, 2012, 3:16 p.m.
Hi Dennis,

On Wed, Nov 28, 2012 at 6:30 AM, Dennis Lan (dlan)
<dennis.yxun@gmail.com> wrote:
> hi simon:
>   found a small bug?(not sure) which introduced by this commit.
>
> this line not inldue FDT option
> #if defined(CONFIG_SILENT_CONSOLE) || defined(CONFIG_POST) ||
> defined(CONFIG_CMDLINE_EDITING)
> DECLARE_GLOBAL_DATA_PTR;
> #endif

Thanks for reporting it -I will send a patch. Were you building for a
particular board, or did you just notice it?

>
>
> main.c: In function 'process_fdt_options':
> main.c:341:31: error: 'gd' undeclared (first use in this function)
> main.c:341:31: note: each undeclared identifier is reported only once for
> each function it appears in
> main.c: In function 'main_loop':
> main.c:464:33: error: 'gd' undeclared (first use in this function)
> make[2]: *** [main.o] Error 1
> make[2]: *** Waiting for unfinished jobs....
> make[1]: *** [common/libcommon.o] Error 2
> make[1]: *** Waiting for unfinished jobs....
> make: *** [lt703a] Error 2
>
Regards,
Simon

>
>
> On Fri, Oct 26, 2012 at 10:31 AM, Simon Glass <sjg@chromium.org> wrote:
>>
>> 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>
>> ---
>>  common/main.c |   16 ++++++++++++++++
>>  1 files changed, 16 insertions(+), 0 deletions(-)
>>
>> diff --git a/common/main.c b/common/main.c
>> index 03c63b4..3137b75 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
>> --
>> 1.7.7.3
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot@lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
>
>

Patch

diff --git a/common/main.c b/common/main.c
index 03c63b4..3137b75 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