cmd/nfsdown: add support for partial image download 67/227967/2
authorMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 18 Mar 2020 07:41:36 +0000 (08:41 +0100)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 18 Mar 2020 07:41:36 +0000 (08:41 +0100)
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 <m.szyprowski@samsung.com>
Change-Id: I40437191876eb48b9ca14756106f8316a92cc546

cmd/nfsdown.c

index 3e6213af156a62ac591246d587c1e547b48b517f..a56bae66219b30e19d0b39a7acb74e2e267407ad 100644 (file)
 #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);