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.
Reviewed-by: Simon Glass <[email protected]> Signed-off-by: Benjamin Hahn <[email protected]> --- Changes in v4: - moved tftpb_run to net-common - depends on: https://lore.kernel.org/u-boot/[email protected]/ - Link to v3: https://lore.kernel.org/r/[email protected] Changes in v3: - code styling update - Link to v2: https://lore.kernel.org/r/[email protected] Changes in v2: - fix build error when CONFIG_CMD_TFTPBOOT is not activated - Link to v1: https://lore.kernel.org/r/[email protected] --- boot/bootmeth_script.c | 6 +++++- doc/develop/bootstd/overview.rst | 4 ++++ doc/develop/bootstd/script.rst | 6 ++++-- include/net-common.h | 9 +++++++++ net/net-common.c | 21 +++++++++++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/boot/bootmeth_script.c b/boot/bootmeth_script.c index 020cb8a7aec0..cd50977cc404 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 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 78d98e5bba07..f5cff3e7c0c5 100644 --- a/include/net-common.h +++ b/include/net-common.h @@ -490,6 +490,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 * diff --git a/net/net-common.c b/net/net-common.c index 442b05975581..c68e19fc03e6 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 --- base-commit: 69dc9a31831436dd850a4870b3c43e1af66b832a change-id: 20250911-ip_dyn_bootstd-dbc38bc3694f Best regards, -- Benjamin Hahn <[email protected]>

