summaryrefslogtreecommitdiff
path: root/common/cmd_elf.c
diff options
context:
space:
mode:
authorBin Meng <bmeng.cn@gmail.com>2015-10-07 20:19:17 -0700
committerSimon Glass <sjg@chromium.org>2015-10-21 07:46:26 -0600
commit9e98b7e3c5010e918d0fdfae75ab7d6995c1fa75 (patch)
tree144a94d87a87dae9428d228b2ef8b71665c3f4a9 /common/cmd_elf.c
parenta4092dbd81ad8bcd7d405304f579b0b5b0c402ce (diff)
cmd: bootvx: Always get VxWorks bootline from env
So far VxWorks bootline can be contructed from various environment variables, but when these variables do not exist we get these from corresponding config macros. This is not helpful as it requires rebuilding U-Boot, and to make sure these config macros take effect we should not have these environment variables. This is a little bit complex and confusing. Now we change the logic to always contruct the bootline from environments (the only single source), by adding two new variables "bootdev" and "othbootargs", and adding some comments about network related settings mentioning they are optional. The doc about the bootline handling is also updated. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Tom Rini <trini@konsulko.com> Tested-by: Hannes Schmelzer <oe5hpm@oevsv.at>
Diffstat (limited to 'common/cmd_elf.c')
-rw-r--r--common/cmd_elf.c119
1 files changed, 66 insertions, 53 deletions
diff --git a/common/cmd_elf.c b/common/cmd_elf.c
index 6a0937823f..da70ef3e81 100644
--- a/common/cmd_elf.c
+++ b/common/cmd_elf.c
@@ -257,68 +257,83 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
/*
* Use bootaddr to find the location in memory that VxWorks
- * will look for the bootline string. The default value for
- * PowerPC is LOCAL_MEM_LOCAL_ADRS + BOOT_LINE_OFFSET which
- * defaults to 0x4200.
+ * will look for the bootline string. The default value is
+ * (LOCAL_MEM_LOCAL_ADRS + BOOT_LINE_OFFSET) as defined by
+ * VxWorks BSP. For example, on PowerPC it defaults to 0x4200.
*/
tmp = getenv("bootaddr");
- if (!tmp)
- bootaddr = CONFIG_SYS_VXWORKS_BOOT_ADDR;
- else
- bootaddr = simple_strtoul(tmp, NULL, 16);
-
- /*
- * Check to see if the bootline is defined in the 'bootargs'
- * parameter. If it is not defined, we may be able to
- * construct the info.
- */
- bootline = getenv("bootargs");
- if (bootline) {
- memcpy((void *)bootaddr, bootline,
- max(strlen(bootline), (size_t)255));
- flush_cache(bootaddr, max(strlen(bootline), (size_t)255));
+ if (!tmp) {
+ printf("## VxWorks bootline address not specified\n");
} else {
- ptr = sprintf(build_buf, CONFIG_SYS_VXWORKS_BOOT_DEVICE);
- tmp = getenv("bootfile");
- if (tmp)
- ptr += sprintf(build_buf + ptr, "%s:%s ",
- CONFIG_SYS_VXWORKS_SERVERNAME, tmp);
- else
- ptr += sprintf(build_buf + ptr, "%s:file ",
- CONFIG_SYS_VXWORKS_SERVERNAME);
+ bootaddr = simple_strtoul(tmp, NULL, 16);
- tmp = getenv("ipaddr");
- if (tmp) {
- ptr += sprintf(build_buf + ptr, "e=%s", tmp);
- tmp = getenv("netmask");
+ /*
+ * Check to see if the bootline is defined in the 'bootargs'
+ * parameter. If it is not defined, we may be able to
+ * construct the info.
+ */
+ bootline = getenv("bootargs");
+ if (bootline) {
+ memcpy((void *)bootaddr, bootline,
+ max(strlen(bootline), (size_t)255));
+ flush_cache(bootaddr, max(strlen(bootline),
+ (size_t)255));
+ } else {
+ tmp = getenv("bootdev");
+ if (tmp)
+ ptr = sprintf(build_buf, tmp);
+ else
+ printf("## VxWorks boot device not specified\n");
+
+ tmp = getenv("bootfile");
+ if (tmp)
+ ptr += sprintf(build_buf + ptr,
+ "host:%s ", tmp);
+ else
+ ptr += sprintf(build_buf + ptr,
+ "host:vxWorks ");
+
+ /*
+ * The following parameters are only needed if 'bootdev'
+ * is an ethernet device, otherwise they are optional.
+ */
+ tmp = getenv("ipaddr");
if (tmp) {
- __be32 addr = getenv_ip("netmask").s_addr;
- ptr += sprintf(build_buf + ptr, ":%08x ",
- ntohl(addr));
- } else {
- ptr += sprintf(build_buf + ptr, " ");
+ ptr += sprintf(build_buf + ptr, "e=%s", tmp);
+ tmp = getenv("netmask");
+ if (tmp) {
+ u32 mask = getenv_ip("netmask").s_addr;
+ ptr += sprintf(build_buf + ptr,
+ ":%08x ", ntohl(mask));
+ } else {
+ ptr += sprintf(build_buf + ptr, " ");
+ }
}
- }
- tmp = getenv("serverip");
- if (tmp)
- ptr += sprintf(build_buf + ptr, "h=%s ", tmp);
+ tmp = getenv("serverip");
+ if (tmp)
+ ptr += sprintf(build_buf + ptr, "h=%s ", tmp);
- tmp = getenv("gatewayip");
- if (tmp)
- ptr += sprintf(build_buf + ptr, "g=%s ", tmp);
+ tmp = getenv("gatewayip");
+ if (tmp)
+ ptr += sprintf(build_buf + ptr, "g=%s ", tmp);
- tmp = getenv("hostname");
- if (tmp)
- ptr += sprintf(build_buf + ptr, "tn=%s ", tmp);
+ tmp = getenv("hostname");
+ if (tmp)
+ ptr += sprintf(build_buf + ptr, "tn=%s ", tmp);
-#ifdef CONFIG_SYS_VXWORKS_ADD_PARAMS
- ptr += sprintf(build_buf + ptr, CONFIG_SYS_VXWORKS_ADD_PARAMS);
-#endif
+ tmp = getenv("othbootargs");
+ if (tmp)
+ ptr += sprintf(build_buf + ptr, tmp);
+
+ memcpy((void *)bootaddr, build_buf,
+ max(strlen(build_buf), (size_t)255));
+ flush_cache(bootaddr, max(strlen(build_buf),
+ (size_t)255));
+ }
- memcpy((void *)bootaddr, build_buf,
- max(strlen(build_buf), (size_t)255));
- flush_cache(bootaddr, max(strlen(build_buf), (size_t)255));
+ printf("## Using bootline (@ 0x%lx): %s\n", bootaddr,
+ (char *)bootaddr);
}
/*
@@ -331,8 +346,6 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
else
puts("## Not an ELF image, assuming binary\n");
- printf("## Using bootline (@ 0x%lx): %s\n", bootaddr,
- (char *)bootaddr);
printf("## Starting vxWorks at 0x%08lx ...\n", addr);
dcache_disable();