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