xref: /openbmc/u-boot/cmd/host.c (revision 9450ab2b)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22e192b24SSimon Glass /*
32e192b24SSimon Glass  * Copyright (c) 2012, Google Inc.
42e192b24SSimon Glass  */
52e192b24SSimon Glass 
62e192b24SSimon Glass #include <common.h>
740fd0508SSimon Glass #include <dm.h>
82e192b24SSimon Glass #include <fs.h>
92e192b24SSimon Glass #include <part.h>
102e192b24SSimon Glass #include <sandboxblockdev.h>
111221ce45SMasahiro Yamada #include <linux/errno.h>
122e192b24SSimon Glass 
132e192b24SSimon Glass static int host_curr_device = -1;
142e192b24SSimon Glass 
do_host_load(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])152e192b24SSimon Glass static int do_host_load(cmd_tbl_t *cmdtp, int flag, int argc,
162e192b24SSimon Glass 			   char * const argv[])
172e192b24SSimon Glass {
182e192b24SSimon Glass 	return do_load(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
192e192b24SSimon Glass }
202e192b24SSimon Glass 
do_host_ls(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])212e192b24SSimon Glass static int do_host_ls(cmd_tbl_t *cmdtp, int flag, int argc,
222e192b24SSimon Glass 			   char * const argv[])
232e192b24SSimon Glass {
242e192b24SSimon Glass 	return do_ls(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
252e192b24SSimon Glass }
262e192b24SSimon Glass 
do_host_size(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])2749afb379SStefan Brüns static int do_host_size(cmd_tbl_t *cmdtp, int flag, int argc,
2849afb379SStefan Brüns 			   char * const argv[])
2949afb379SStefan Brüns {
3049afb379SStefan Brüns 	return do_size(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
3149afb379SStefan Brüns }
3249afb379SStefan Brüns 
do_host_save(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])332e192b24SSimon Glass static int do_host_save(cmd_tbl_t *cmdtp, int flag, int argc,
342e192b24SSimon Glass 			   char * const argv[])
352e192b24SSimon Glass {
362e192b24SSimon Glass 	return do_save(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
372e192b24SSimon Glass }
382e192b24SSimon Glass 
do_host_bind(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])392e192b24SSimon Glass static int do_host_bind(cmd_tbl_t *cmdtp, int flag, int argc,
402e192b24SSimon Glass 			   char * const argv[])
412e192b24SSimon Glass {
422e192b24SSimon Glass 	if (argc < 2 || argc > 3)
432e192b24SSimon Glass 		return CMD_RET_USAGE;
442e192b24SSimon Glass 	char *ep;
452e192b24SSimon Glass 	char *dev_str = argv[1];
462e192b24SSimon Glass 	char *file = argc >= 3 ? argv[2] : NULL;
472e192b24SSimon Glass 	int dev = simple_strtoul(dev_str, &ep, 16);
482e192b24SSimon Glass 	if (*ep) {
492e192b24SSimon Glass 		printf("** Bad device specification %s **\n", dev_str);
502e192b24SSimon Glass 		return CMD_RET_USAGE;
512e192b24SSimon Glass 	}
522e192b24SSimon Glass 	return host_dev_bind(dev, file);
532e192b24SSimon Glass }
542e192b24SSimon Glass 
do_host_info(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])552e192b24SSimon Glass static int do_host_info(cmd_tbl_t *cmdtp, int flag, int argc,
562e192b24SSimon Glass 			   char * const argv[])
572e192b24SSimon Glass {
582e192b24SSimon Glass 	if (argc < 1 || argc > 2)
592e192b24SSimon Glass 		return CMD_RET_USAGE;
602e192b24SSimon Glass 	int min_dev = 0;
612e192b24SSimon Glass 	int max_dev = CONFIG_HOST_MAX_DEVICES - 1;
622e192b24SSimon Glass 	if (argc >= 2) {
632e192b24SSimon Glass 		char *ep;
642e192b24SSimon Glass 		char *dev_str = argv[1];
652e192b24SSimon Glass 		int dev = simple_strtoul(dev_str, &ep, 16);
662e192b24SSimon Glass 		if (*ep) {
672e192b24SSimon Glass 			printf("** Bad device specification %s **\n", dev_str);
682e192b24SSimon Glass 			return CMD_RET_USAGE;
692e192b24SSimon Glass 		}
702e192b24SSimon Glass 		min_dev = dev;
712e192b24SSimon Glass 		max_dev = dev;
722e192b24SSimon Glass 	}
732e192b24SSimon Glass 	int dev;
742e192b24SSimon Glass 	printf("%3s %12s %s\n", "dev", "blocks", "path");
752e192b24SSimon Glass 	for (dev = min_dev; dev <= max_dev; dev++) {
764101f687SSimon Glass 		struct blk_desc *blk_dev;
772e192b24SSimon Glass 		int ret;
782e192b24SSimon Glass 
792e192b24SSimon Glass 		printf("%3d ", dev);
802e192b24SSimon Glass 		ret = host_get_dev_err(dev, &blk_dev);
812e192b24SSimon Glass 		if (ret) {
822e192b24SSimon Glass 			if (ret == -ENOENT)
832e192b24SSimon Glass 				puts("Not bound to a backing file\n");
842e192b24SSimon Glass 			else if (ret == -ENODEV)
852e192b24SSimon Glass 				puts("Invalid host device number\n");
862e192b24SSimon Glass 
872e192b24SSimon Glass 			continue;
882e192b24SSimon Glass 		}
8940fd0508SSimon Glass 		struct host_block_dev *host_dev;
9040fd0508SSimon Glass 
9140fd0508SSimon Glass #ifdef CONFIG_BLK
9240fd0508SSimon Glass 		host_dev = dev_get_priv(blk_dev->bdev);
9340fd0508SSimon Glass #else
9440fd0508SSimon Glass 		host_dev = blk_dev->priv;
9540fd0508SSimon Glass #endif
962e192b24SSimon Glass 		printf("%12lu %s\n", (unsigned long)blk_dev->lba,
972e192b24SSimon Glass 		       host_dev->filename);
982e192b24SSimon Glass 	}
992e192b24SSimon Glass 	return 0;
1002e192b24SSimon Glass }
1012e192b24SSimon Glass 
do_host_dev(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1022e192b24SSimon Glass static int do_host_dev(cmd_tbl_t *cmdtp, int flag, int argc,
1032e192b24SSimon Glass 		       char * const argv[])
1042e192b24SSimon Glass {
1052e192b24SSimon Glass 	int dev;
1062e192b24SSimon Glass 	char *ep;
1074101f687SSimon Glass 	struct blk_desc *blk_dev;
1082e192b24SSimon Glass 	int ret;
1092e192b24SSimon Glass 
1102e192b24SSimon Glass 	if (argc < 1 || argc > 3)
1112e192b24SSimon Glass 		return CMD_RET_USAGE;
1122e192b24SSimon Glass 
1132e192b24SSimon Glass 	if (argc == 1) {
1142e192b24SSimon Glass 		if (host_curr_device < 0) {
1152e192b24SSimon Glass 			printf("No current host device\n");
1162e192b24SSimon Glass 			return 1;
1172e192b24SSimon Glass 		}
1182e192b24SSimon Glass 		printf("Current host device %d\n", host_curr_device);
1192e192b24SSimon Glass 		return 0;
1202e192b24SSimon Glass 	}
1212e192b24SSimon Glass 
1222e192b24SSimon Glass 	dev = simple_strtoul(argv[1], &ep, 16);
1232e192b24SSimon Glass 	if (*ep) {
1242e192b24SSimon Glass 		printf("** Bad device specification %s **\n", argv[2]);
1252e192b24SSimon Glass 		return CMD_RET_USAGE;
1262e192b24SSimon Glass 	}
1272e192b24SSimon Glass 
1282e192b24SSimon Glass 	ret = host_get_dev_err(dev, &blk_dev);
1292e192b24SSimon Glass 	if (ret) {
1302e192b24SSimon Glass 		if (ret == -ENOENT)
1312e192b24SSimon Glass 			puts("Not bound to a backing file\n");
1322e192b24SSimon Glass 		else if (ret == -ENODEV)
1332e192b24SSimon Glass 			puts("Invalid host device number\n");
1342e192b24SSimon Glass 
1352e192b24SSimon Glass 		return 1;
1362e192b24SSimon Glass 	}
1372e192b24SSimon Glass 
1382e192b24SSimon Glass 	host_curr_device = dev;
1392e192b24SSimon Glass 	return 0;
1402e192b24SSimon Glass }
1412e192b24SSimon Glass 
1422e192b24SSimon Glass static cmd_tbl_t cmd_host_sub[] = {
1432e192b24SSimon Glass 	U_BOOT_CMD_MKENT(load, 7, 0, do_host_load, "", ""),
1442e192b24SSimon Glass 	U_BOOT_CMD_MKENT(ls, 3, 0, do_host_ls, "", ""),
1452e192b24SSimon Glass 	U_BOOT_CMD_MKENT(save, 6, 0, do_host_save, "", ""),
14649afb379SStefan Brüns 	U_BOOT_CMD_MKENT(size, 3, 0, do_host_size, "", ""),
1472e192b24SSimon Glass 	U_BOOT_CMD_MKENT(bind, 3, 0, do_host_bind, "", ""),
1482e192b24SSimon Glass 	U_BOOT_CMD_MKENT(info, 3, 0, do_host_info, "", ""),
1492e192b24SSimon Glass 	U_BOOT_CMD_MKENT(dev, 0, 1, do_host_dev, "", ""),
1502e192b24SSimon Glass };
1512e192b24SSimon Glass 
do_host(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1522e192b24SSimon Glass static int do_host(cmd_tbl_t *cmdtp, int flag, int argc,
1532e192b24SSimon Glass 		      char * const argv[])
1542e192b24SSimon Glass {
1552e192b24SSimon Glass 	cmd_tbl_t *c;
1562e192b24SSimon Glass 
1572e192b24SSimon Glass 	/* Skip past 'host' */
1582e192b24SSimon Glass 	argc--;
1592e192b24SSimon Glass 	argv++;
1602e192b24SSimon Glass 
1612e192b24SSimon Glass 	c = find_cmd_tbl(argv[0], cmd_host_sub,
1622e192b24SSimon Glass 			 ARRAY_SIZE(cmd_host_sub));
1632e192b24SSimon Glass 
1642e192b24SSimon Glass 	if (c)
1652e192b24SSimon Glass 		return c->cmd(cmdtp, flag, argc, argv);
1662e192b24SSimon Glass 	else
1672e192b24SSimon Glass 		return CMD_RET_USAGE;
1682e192b24SSimon Glass }
1692e192b24SSimon Glass 
1702e192b24SSimon Glass U_BOOT_CMD(
1712e192b24SSimon Glass 	host, 8, 1, do_host,
1722e192b24SSimon Glass 	"Miscellaneous host commands",
1732e192b24SSimon Glass 	"load hostfs - <addr> <filename> [<bytes> <offset>]  - "
1742e192b24SSimon Glass 		"load a file from host\n"
1752e192b24SSimon Glass 	"host ls hostfs - <filename>                    - list files on host\n"
1762e192b24SSimon Glass 	"host save hostfs - <addr> <filename> <bytes> [<offset>] - "
1772e192b24SSimon Glass 		"save a file to host\n"
1786baa692fSSébastien Szymanski 	"host size hostfs - <filename> - determine size of file on host\n"
1792e192b24SSimon Glass 	"host bind <dev> [<filename>] - bind \"host\" device to file\n"
1802e192b24SSimon Glass 	"host info [<dev>]            - show device binding & info\n"
1812e192b24SSimon Glass 	"host dev [<dev>] - Set or retrieve the current host device\n"
1822e192b24SSimon Glass 	"host commands use the \"hostfs\" device. The \"host\" device is used\n"
1832e192b24SSimon Glass 	"with standard IO commands such as fatls or ext2load"
1842e192b24SSimon Glass );
185