From 1cb7b19627cd9f6ec6d75fa47f9666f076c518c1 Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Wed, 18 Mar 2020 08:41:36 +0100 Subject: [PATCH] cmd/nfsdown: add support for partial image download Add support for downloading image file in parts, so images larger than the available memory can be flashed correctly. This allows to flash large (>1GiB) rootfs images on RPi3 or RPi4 boards. Signed-off-by: Marek Szyprowski Change-Id: I40437191876eb48b9ca14756106f8316a92cc546 --- cmd/nfsdown.c | 77 ++++++++++++++++++++++++--------------------------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/cmd/nfsdown.c b/cmd/nfsdown.c index 3e6213af15..a56bae6621 100644 --- a/cmd/nfsdown.c +++ b/cmd/nfsdown.c @@ -21,11 +21,13 @@ #define LEN_NAME 32 #ifdef CONFIG_SYS_SDRAM_BASE -#define NFS_DOWNLOAD_ADDR __stringify(CONFIG_SYS_SDRAM_BASE) +#define NFS_DOWNLOAD_ADDR CONFIG_SYS_SDRAM_BASE #else -#define NFS_DOWNLOAD_ADDR "0x40000000" +#define NFS_DOWNLOAD_ADDR 0x40000000 #endif +#define NFSDOWN_TRANSFER_SIZE SZ_256M + enum img_layout { RAW_ADDR, FS_FAT, @@ -269,7 +271,7 @@ struct img_comp *create_img_comp(const char *name, uint size) /** * Donwload from nfs file and write to mmc stroage * - * @param buf_addr Download buffer address from NFS + * @param addr Download buffer address from NFS * @param file_path Download file path from NFS * @param part MMC partition * @param offset img block offset @@ -277,28 +279,12 @@ struct img_comp *create_img_comp(const char *name, uint size) * @param blk_size MMC block size * @return file_size written file size, return -1 if error occurs */ -static int do_nfs_to_mmc(struct mmc *mmc, char *buf_addr, char *file_path, +static int do_nfs_to_mmc(struct mmc *mmc, void *addr, char *file_path, uint part, uint offset, uint size, uint blk_size) { - char *_argv[3]; uint _size; - int repeatable; + uint done = 0; int ret; - void *addr; - - _argv[0] = "nfs"; - _argv[1] = buf_addr; - _argv[2] = file_path; - - ret = cmd_process(0, 3, _argv, &repeatable, NULL); - if (ret != CMD_RET_SUCCESS) { - puts("nfs download failed!!\n"); - return -1; - } - - _size = (net_boot_file_size % blk_size) ? - net_boot_file_size / blk_size + 1 - : net_boot_file_size / blk_size; ret = blk_select_hwpart_devnum(IF_TYPE_MMC, 0, part); if (ret) { @@ -306,45 +292,54 @@ static int do_nfs_to_mmc(struct mmc *mmc, char *buf_addr, char *file_path, return -1; } - addr = (void *)simple_strtoul(buf_addr, NULL, 16); + do { + printf("Getting %s, offset %u...\n", file_path, done); + ret = netboot_nfs((unsigned long)addr, file_path, done, + NFSDOWN_TRANSFER_SIZE); + if (ret != CMD_RET_SUCCESS) { + puts("nfs download failed!!\n"); + return -1; + } + + _size = (net_boot_file_size % blk_size) ? + net_boot_file_size / blk_size + 1 + : net_boot_file_size / blk_size; - printf("MMC write: dev # %d, block # %d, count %d ...\n\n", - part, offset, _size); + printf("MMC write: dev # %d, block # %d, count %d ...\n\n", + part, offset, _size); #ifndef CONFIG_BLK - ret = mmc->block_dev.block_write(&mmc->block_dev, offset, _size, addr); + ret = mmc->block_dev.block_write(&mmc->block_dev, offset, _size, + addr); #else - ret = blk_dwrite(mmc_get_blk_desc(mmc), offset, _size, addr); + ret = blk_dwrite(mmc_get_blk_desc(mmc), offset, _size, addr); #endif - if (ret != _size) { - printk("Failed to write MMC: part(%d), start(%d), size(%d)", - part, offset, _size); - return -1; - } + if (ret != _size) { + printk("Failed to write MMC: part(%d), start(%d), size(%d)", + part, offset, _size); + return -1; + } + done += net_boot_file_size; + offset += _size; + } while (net_boot_file_size == NFSDOWN_TRANSFER_SIZE); - return (int)net_boot_file_size; + return (int)done; } -static int do_nfs_to_fat(char *buf_addr, char *file_path, char *file_name, +static int do_nfs_to_fat(void *addr, char *file_path, char *file_name, uint dev, uint part) { - char *_argv[3]; uint _size; int ret; - int repeatable; char buf[256]; - _argv[0] = "nfs"; - _argv[1] = buf_addr; - _argv[2] = file_path; - - ret = cmd_process(0, 3, _argv, &repeatable, NULL); + ret = netboot_nfs((unsigned long)addr, file_path, 0, 0); if (ret != CMD_RET_SUCCESS) { puts("nfs download failed!!\n"); return -1; } _size = net_boot_file_size; - snprintf(buf, 256, "fatwrite mmc %d:%d %s %s %x", dev, part, buf_addr, + snprintf(buf, 256, "fatwrite mmc %d:%d %p %s %x", dev, part, addr, file_name, _size); run_command(buf, 0); -- 2.34.1