summaryrefslogtreecommitdiff
path: root/common/cmd_pxe.c
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2014-02-12 14:30:04 -0700
committerTom Rini <trini@ti.com>2014-02-21 11:06:13 -0500
commite22361af0758c7ebbff6fe375f805bc3697ce30f (patch)
tree071f5b862baaeba8ce2f76d45c7bb0973f54f626 /common/cmd_pxe.c
parent102c051fccaf43bca4245d38519c9520ee0b4ff4 (diff)
downloadu-boot-imx-e22361af0758c7ebbff6fe375f805bc3697ce30f.zip
u-boot-imx-e22361af0758c7ebbff6fe375f805bc3697ce30f.tar.gz
u-boot-imx-e22361af0758c7ebbff6fe375f805bc3697ce30f.tar.bz2
pxe: prepend fdtdir to DTB name irrespective of source
The directory name from an fdtdir directive in a PXE config file should always be pre-pended to the DTB filename; it shouldn't matter whether the DTB filename came from the $fdtfile environment variable, or whether it was constructed dynamically from ${soc}-${board}.dtb. Fix the code to always prepend the directory name. Reported-by: Dennis Gilmore <dennis@ausil.us> Fixes: c61d94d86035 ("pxe: implement fdtdir extlinux.conf tag") Signed-off-by: Stephen Warren <swarren@nvidia.com> Reviewed-by: Dennis Gilmore <dennis@ausil.us> Tested-by: Dennis Gilmore <dennis@ausil.us>
Diffstat (limited to 'common/cmd_pxe.c')
-rw-r--r--common/cmd_pxe.c77
1 files changed, 40 insertions, 37 deletions
diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c
index 29e48db..6aabd13 100644
--- a/common/cmd_pxe.c
+++ b/common/cmd_pxe.c
@@ -700,44 +700,47 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
if (label->fdt) {
fdtfile = label->fdt;
} else if (label->fdtdir) {
- fdtfile = getenv("fdtfile");
- /*
- * For complex cases, it might be worth calling a
- * board- or SoC-provided function here to provide a
- * better default:
- *
- * if (!fdtfile)
- * fdtfile = gen_fdtfile();
- *
- * If this is added, be sure to keep the default below,
- * or move it to the default weak implementation of
- * gen_fdtfile().
- */
- if (!fdtfile) {
- char *soc = getenv("soc");
- char *board = getenv("board");
- char *slash;
-
- len = strlen(label->fdtdir);
- if (!len)
- slash = "./";
- else if (label->fdtdir[len - 1] != '/')
- slash = "/";
- else
- slash = "";
-
- len = strlen(label->fdtdir) + strlen(slash) +
- strlen(soc) + 1 + strlen(board) + 5;
- fdtfilefree = malloc(len);
- if (!fdtfilefree) {
- printf("malloc fail (FDT filename)\n");
- return 1;
- }
-
- snprintf(fdtfilefree, len, "%s%s%s-%s.dtb",
- label->fdtdir, slash, soc, board);
- fdtfile = fdtfilefree;
+ char *f1, *f2, *f3, *f4, *slash;
+
+ f1 = getenv("fdtfile");
+ if (f1) {
+ f2 = "";
+ f3 = "";
+ f4 = "";
+ } else {
+ /*
+ * For complex cases where this code doesn't
+ * generate the correct filename, the board
+ * code should set $fdtfile during early boot,
+ * or the boot scripts should set $fdtfile
+ * before invoking "pxe" or "sysboot".
+ */
+ f1 = getenv("soc");
+ f2 = "-";
+ f3 = getenv("board");
+ f4 = ".dtb";
+ }
+
+ len = strlen(label->fdtdir);
+ if (!len)
+ slash = "./";
+ else if (label->fdtdir[len - 1] != '/')
+ slash = "/";
+ else
+ slash = "";
+
+ len = strlen(label->fdtdir) + strlen(slash) +
+ strlen(f1) + strlen(f2) + strlen(f3) +
+ strlen(f4) + 1;
+ fdtfilefree = malloc(len);
+ if (!fdtfilefree) {
+ printf("malloc fail (FDT filename)\n");
+ return 1;
}
+
+ snprintf(fdtfilefree, len, "%s%s%s%s%s%s",
+ label->fdtdir, slash, f1, f2, f3, f4);
+ fdtfile = fdtfilefree;
}
if (fdtfile) {