xref: /openbmc/u-boot/cmd/unzip.c (revision 77c07e7e)
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