12e192b24SSimon Glass /*
22e192b24SSimon Glass * (C) Copyright 2000
32e192b24SSimon Glass * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
42e192b24SSimon Glass *
52e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+
62e192b24SSimon Glass */
72e192b24SSimon Glass
82e192b24SSimon Glass #include <common.h>
92e192b24SSimon Glass #include <command.h>
102e192b24SSimon Glass
do_unzip(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])112e192b24SSimon Glass static int do_unzip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
122e192b24SSimon Glass {
132e192b24SSimon Glass unsigned long src, dst;
142e192b24SSimon Glass unsigned long src_len = ~0UL, dst_len = ~0UL;
152e192b24SSimon Glass
162e192b24SSimon Glass switch (argc) {
172e192b24SSimon Glass case 4:
182e192b24SSimon Glass dst_len = simple_strtoul(argv[3], NULL, 16);
192e192b24SSimon Glass /* fall through */
202e192b24SSimon Glass case 3:
212e192b24SSimon Glass src = simple_strtoul(argv[1], NULL, 16);
222e192b24SSimon Glass dst = simple_strtoul(argv[2], NULL, 16);
232e192b24SSimon Glass break;
242e192b24SSimon Glass default:
252e192b24SSimon Glass return CMD_RET_USAGE;
262e192b24SSimon Glass }
272e192b24SSimon Glass
282e192b24SSimon Glass if (gunzip((void *) dst, dst_len, (void *) src, &src_len) != 0)
292e192b24SSimon Glass return 1;
302e192b24SSimon Glass
312e192b24SSimon Glass printf("Uncompressed size: %ld = 0x%lX\n", src_len, src_len);
32*018f5303SSimon Glass env_set_hex("filesize", src_len);
332e192b24SSimon Glass
342e192b24SSimon Glass return 0;
352e192b24SSimon Glass }
362e192b24SSimon Glass
372e192b24SSimon Glass U_BOOT_CMD(
382e192b24SSimon Glass unzip, 4, 1, do_unzip,
392e192b24SSimon Glass "unzip a memory region",
402e192b24SSimon Glass "srcaddr dstaddr [dstsize]"
412e192b24SSimon Glass );
422e192b24SSimon Glass
do_gzwrite(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])432e192b24SSimon Glass static int do_gzwrite(cmd_tbl_t *cmdtp, int flag,
442e192b24SSimon Glass int argc, char * const argv[])
452e192b24SSimon Glass {
464101f687SSimon Glass struct blk_desc *bdev;
472e192b24SSimon Glass int ret;
482e192b24SSimon Glass unsigned char *addr;
492e192b24SSimon Glass unsigned long length;
502e192b24SSimon Glass unsigned long writebuf = 1<<20;
512e192b24SSimon Glass u64 startoffs = 0;
522e192b24SSimon Glass u64 szexpected = 0;
532e192b24SSimon Glass
542e192b24SSimon Glass if (argc < 5)
552e192b24SSimon Glass return CMD_RET_USAGE;
56ebac37cfSSimon Glass ret = blk_get_device_by_str(argv[1], argv[2], &bdev);
572e192b24SSimon Glass if (ret < 0)
582e192b24SSimon Glass return CMD_RET_FAILURE;
592e192b24SSimon Glass
602e192b24SSimon Glass addr = (unsigned char *)simple_strtoul(argv[3], NULL, 16);
612e192b24SSimon Glass length = simple_strtoul(argv[4], NULL, 16);
622e192b24SSimon Glass
632e192b24SSimon Glass if (5 < argc) {
642e192b24SSimon Glass writebuf = simple_strtoul(argv[5], NULL, 16);
652e192b24SSimon Glass if (6 < argc) {
662e192b24SSimon Glass startoffs = simple_strtoull(argv[6], NULL, 16);
672e192b24SSimon Glass if (7 < argc)
682e192b24SSimon Glass szexpected = simple_strtoull(argv[7],
692e192b24SSimon Glass NULL, 16);
702e192b24SSimon Glass }
712e192b24SSimon Glass }
722e192b24SSimon Glass
732e192b24SSimon Glass ret = gzwrite(addr, length, bdev, writebuf, startoffs, szexpected);
742e192b24SSimon Glass
752e192b24SSimon Glass return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
762e192b24SSimon Glass }
772e192b24SSimon Glass
782e192b24SSimon Glass U_BOOT_CMD(
792e192b24SSimon Glass gzwrite, 8, 0, do_gzwrite,
802e192b24SSimon Glass "unzip and write memory to block device",
812e192b24SSimon Glass "<interface> <dev> <addr> length [wbuf=1M [offs=0 [outsize=0]]]\n"
822e192b24SSimon Glass "\twbuf is the size in bytes (hex) of write buffer\n"
832e192b24SSimon Glass "\t\tand should be padded to erase size for SSDs\n"
842e192b24SSimon Glass "\toffs is the output start offset in bytes (hex)\n"
852e192b24SSimon Glass "\toutsize is the size of the expected output (hex bytes)\n"
862e192b24SSimon Glass "\t\tand is required for files with uncompressed lengths\n"
872e192b24SSimon Glass "\t\t4 GiB or larger\n"
882e192b24SSimon Glass );
89