summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boot/bootmeth_script.c6
-rw-r--r--doc/develop/bootstd/overview.rst4
-rw-r--r--doc/develop/bootstd/script.rst6
-rw-r--r--include/net-common.h9
-rw-r--r--net/net-common.c21
5 files changed, 43 insertions, 3 deletions
diff --git a/boot/bootmeth_script.c b/boot/bootmeth_script.c
index 020cb8a7aec..cd50977cc40 100644
--- a/boot/bootmeth_script.c
+++ b/boot/bootmeth_script.c
@@ -129,7 +129,11 @@ static int script_read_bootflow_net(struct bootflow *bflow)
if (!fname)
return log_msg_ret("dhc", -EINVAL);
- ret = dhcp_run(addr, fname, true);
+ if (IS_ENABLED(CONFIG_CMD_TFTPBOOT) && env_get_yesno("ip_dyn") == 0)
+ ret = tftpb_run(addr, fname);
+ else
+ ret = dhcp_run(addr, fname, true);
+
if (ret)
return log_msg_ret("dhc", ret);
diff --git a/doc/develop/bootstd/overview.rst b/doc/develop/bootstd/overview.rst
index e36cde4d360..abb616adc77 100644
--- a/doc/develop/bootstd/overview.rst
+++ b/doc/develop/bootstd/overview.rst
@@ -262,6 +262,10 @@ fdt_addr_r
fdtoverlay_addr_r (needed if overlays are used)
Address at which to load the overlay for the FDT, e.g. 0x02000000
+ip_dyn
+ Use dynamic IP (dhcp) or static IP (tftp) for loading the bootscript over
+ ethernet. Default is dhcp. e.g. no
+
kernel_addr_r
Address at which to load the kernel, e.g. 0x02080000
diff --git a/doc/develop/bootstd/script.rst b/doc/develop/bootstd/script.rst
index 47f3684b86b..3b19c22726f 100644
--- a/doc/develop/bootstd/script.rst
+++ b/doc/develop/bootstd/script.rst
@@ -12,8 +12,10 @@ list of prefixes (``{"/", "/boot"}`` by default) and can be adjust with the
`filename-prefixes` property in the bootstd device.
For a network device, the filename is obtained from the `boot_script_dhcp`
-environment variable and the file is read using tftp. It must be in the
-top-level directory of the tftp server.
+environment variable. By setting the `ip_dyn` environment variable it can be
+decided if dynamic ip (dhcp command) or static ip (tftp command) is used for
+reading the file. By default dhcp is used. The file must be in the top-level
+directory of the tftp server.
In either case (file or network), the bootmeth searches for the file and creates
a bootflow if found. The bootmeth searches for "boot.scr.uimg" first, then
diff --git a/include/net-common.h b/include/net-common.h
index 78d98e5bba0..f5cff3e7c0c 100644
--- a/include/net-common.h
+++ b/include/net-common.h
@@ -491,6 +491,15 @@ int dhcp_run(ulong addr, const char *fname, bool autoload);
int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
/**
+ * tftpb_run() - Run TFTP on the current ethernet device
+ *
+ * @addr: Address to load the file into
+ * @fname: Filename of file to load (NULL to use the default filename)
+ * @return 0 if OK, -ENOENT if ant file was not found
+ */
+int tftpb_run(ulong addr, const char *fname);
+
+/**
* do_ping - Run the ping command
*
* @cmdtp: Unused
diff --git a/net/net-common.c b/net/net-common.c
index 442b0597558..c68e19fc03e 100644
--- a/net/net-common.c
+++ b/net/net-common.c
@@ -83,3 +83,24 @@ int dhcp_run(ulong addr, const char *fname, bool autoload)
return 0;
}
#endif
+
+#if defined(CONFIG_CMD_TFTPBOOT)
+int tftpb_run(ulong addr, const char *fname)
+{
+ char *tftp_argv[] = {"tftpboot", NULL, (char *)fname, NULL};
+ struct cmd_tbl cmdtp = {}; /* dummy */
+ char file_addr[17] = {0};
+
+ log_debug("addr=%lx, fname=%s\n", addr, fname);
+ sprintf(file_addr, "%lx", addr);
+ tftp_argv[1] = file_addr;
+
+ int result = do_tftpb(&cmdtp, 0, fname ? 3 : 2, tftp_argv);
+
+ if (result)
+ return log_msg_ret("res", -ENOENT);
+
+ return 0;
+}
+
+#endif