[PATCH] bootstd: make it possible to use tftp for netboot with standardboot
Benjamin Hahn
B.Hahn at phytec.de
Thu Sep 11 12:34:07 CEST 2025
Add the option to load the bootscript with the tftp command (static IP)
instead of the dhcp command (dynamic IP). For this a new function
tftpb_run similar to dhcp_run, is needed. The selection of which command
to use can be done with the ip_dyn environment variable, which can be
set to yes or no. The ip_dyn variable was chosen as it is already in use
on the imx platforms.
Also edit the bootstd doc.
Signed-off-by: Benjamin Hahn <B.Hahn at phytec.de>
---
boot/bootmeth_script.c | 6 +++++-
cmd/net.c | 18 ++++++++++++++++++
doc/develop/bootstd/overview.rst | 4 ++++
doc/develop/bootstd/script.rst | 6 ++++--
include/net-common.h | 8 ++++++++
5 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/boot/bootmeth_script.c b/boot/bootmeth_script.c
index 020cb8a7aec0..09aa062fe485 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 (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/cmd/net.c b/cmd/net.c
index 886735ea14f6..5992b9c5d734 100644
--- a/cmd/net.c
+++ b/cmd/net.c
@@ -49,6 +49,24 @@ int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
return ret;
}
+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;
+}
+
#if IS_ENABLED(CONFIG_IPV6)
U_BOOT_CMD(
tftpboot, 4, 1, do_tftpb,
diff --git a/doc/develop/bootstd/overview.rst b/doc/develop/bootstd/overview.rst
index 0a2373595755..f94b73ad4d2c 100644
--- a/doc/develop/bootstd/overview.rst
+++ b/doc/develop/bootstd/overview.rst
@@ -261,6 +261,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 47f3684b86b9..3b19c22726ff 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 1112af381a98..a2776fe71fad 100644
--- a/include/net-common.h
+++ b/include/net-common.h
@@ -479,6 +479,14 @@ int net_loop(enum proto_t protocol);
*/
int dhcp_run(ulong addr, const char *fname, bool autoload);
+/**
+ * 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
---
base-commit: 1a7882de8c859467ce931ed23761db1e391aeaff
change-id: 20250911-ip_dyn_bootstd-dbc38bc3694f
Best regards,
--
Benjamin Hahn <B.Hahn at phytec.de>
More information about the U-Boot
mailing list