[U-Boot] [PATCH]: Smart Autoboot

Dear U-Boot community,
I wrote a small patch that checks on autoboot if the image is a kernel image and if not assumes that it is a standalone image. If the image is kernel do_bootm is used else (unconditionally) do_go is used. This is handy if you are working with test applications and kernels, since you only need to reconfigure your DHCP server and don't need to re-flash u-boot.
Since I am new to u-boot I'd like to ask if the following patch is formatted correctly (I have used git format-patch) and if there is the possiblity to add this feature to mainline UBoot.
Kind regards,
- Johannes
From c631d05e225fa3f87b0a5cad0bb033063e61018c Mon Sep 17 00:00:00 2001
From: Johannes Thoma johannes.thoma@gmx.at Date: Thu, 28 Apr 2011 14:25:39 +0200 Subject: [PATCH] Smart autoboot
We check if the image is a kernel image and use bootm command to boot the OS, else we do a go.
To use this feature, #define CONFIG_SMART_AUTOBOOT in your config and set the environment variable autostart to "yes". Then your DHCP driver can be used to either boot a kernel image or a u-boot application without changing anything on the target. --- README | 5 +++++ common/cmd_net.c | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/README b/README index 4917e26..e33caf2 100644 --- a/README +++ b/README @@ -576,6 +576,11 @@ The following options need to be configured: as a convenience, when switching between booting from RAM and NFS.
+ CONFIG_SMART_AUTOBOOT + Check if the image is a kernel image. Then a bootm + command is executed, else the go command (for standalone + applications) is executed. + - Pre-Boot Commands: CONFIG_PREBOOT
diff --git a/common/cmd_net.c b/common/cmd_net.c index 8c6f5c8..6fa32e3 100644 --- a/common/cmd_net.c +++ b/common/cmd_net.c @@ -28,6 +28,12 @@ #include <command.h> #include <net.h>
+extern int do_bootm (cmd_tbl_t *, int, int, char * const []); +#ifdef CONFIG_SMART_AUTOBOOT +extern int do_go (cmd_tbl_t *, int, int, char * const []); +#endif + + static int netboot_common (proto_t, cmd_tbl_t *, int , char * const []);
int do_bootp (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) @@ -212,14 +218,29 @@ netboot_common (proto_t proto, cmd_tbl_t *cmdtp, int argc, char * const argv[])
/* Loading ok, check if we should attempt an auto-start */ if (((s = getenv("autostart")) != NULL) && (strcmp(s,"yes") == 0)) { - char *local_args[2]; + char *local_args[3]; local_args[0] = argv[0]; local_args[1] = NULL;
printf ("Automatic boot of image at addr 0x%08lX ...\n", load_addr); show_boot_progress (82); - rcode = do_bootm (cmdtp, 0, 1, local_args); +#ifdef CONFIG_SMART_AUTOBOOT + if (image_get_type((void*) load_addr) == IH_TYPE_KERNEL) +#endif + rcode = do_bootm (cmdtp, 0, 1, local_args); +#ifdef CONFIG_SMART_AUTOBOOT + else { /* its probably a binary image, use go to start it */ + char load_addr_as_string[17]; /* be 64-bit ready */ + + printf("Not a kernel image, trying standalone binary ...\n"); + sprintf(load_addr_as_string, "%lx", load_addr); + local_args[0] = "go"; + local_args[1] = load_addr_as_string; + local_args[2] = NULL; + rcode = do_go (cmdtp, 0, 2, local_args); + } +#endif }
if (rcode < 0)

Dear "Johannes Thoma",
In message 20110428125810.123810@gmx.net you wrote:
I wrote a small patch that checks on autoboot if the image is a kernel image and if not assumes that it is a standalone image. If the image is kernel do_bootm is used else (unconditionally) do_go is used. This is handy if you are working with test applications and kernels, since you only need to reconfigure your DHCP server and don't need to re-flash u-boot.
The same can be done with minimal scripting, without changing any code. Your solution may work for you, but I don't think this is how to solve such an issue in general.
Since I am new to u-boot I'd like to ask if the following patch is formatted correctly (I have used git format-patch) and if there is the possiblity to add this feature to mainline UBoot.
Second part of the question first: I consider this a highly specific feature which is not needed by many people, and if it was needed, if can be implemented with mninimal scripting, so I don't think adding this code to mainline is a good idea.
For the formal issues: most things look good, except:
From c631d05e225fa3f87b0a5cad0bb033063e61018c Mon Sep 17 00:00:00 2001 From: Johannes Thoma johannes.thoma@gmx.at Date: Thu, 28 Apr 2011 14:25:39 +0200 Subject: [PATCH] Smart autoboot
We check if the image is a kernel image and use bootm command to boot the OS, else we do a go.
To use this feature, #define CONFIG_SMART_AUTOBOOT in your config and set the environment variable autostart to "yes". Then your DHCP driver can be used to either boot a kernel image or a u-boot application without changing anything on the target.
Signed-off-by: line missing.
README | 5 +++++ common/cmd_net.c | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-)
...
+extern int do_bootm (cmd_tbl_t *, int, int, char * const []); +#ifdef CONFIG_SMART_AUTOBOOT +extern int do_go (cmd_tbl_t *, int, int, char * const []);
externs should be avoided; use prototype declarations in the respective header files.
Don't add too much white space - a single blank line is enough.
static int netboot_common (proto_t, cmd_tbl_t *, int , char * const []);
int do_bootp (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) @@ -212,14 +218,29 @@ netboot_common (proto_t proto, cmd_tbl_t *cmdtp, int argc, char * const argv[])
/* Loading ok, check if we should attempt an auto-start */ if (((s = getenv("autostart")) != NULL) && (strcmp(s,"yes") == 0)) {
char *local_args[2];
char *local_args[3];
Indentation must be done by TABs, not spaces.
...
+#ifdef CONFIG_SMART_AUTOBOOT
if (image_get_type((void*) load_addr) == IH_TYPE_KERNEL)
Don't add trailing white space.
It appears you did not run checkpatch, which would have caught most of these issues.
Best regards,
Wolfgang Denk

Dear Wolfgang,
Thank you for your quick response. I agree that a scripting solution would be better, but I didn't research enough to find that out, sorry for that .. ;)
I will run the mentioned check scripts for the next patches, I hope they will be better.
All the best,
- Johannes
participants (2)
-
Johannes Thoma
-
Wolfgang Denk