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 @@ -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 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