xref: /openbmc/u-boot/cmd/host.c (revision 40fd0508)
12e192b24SSimon Glass /*
22e192b24SSimon Glass  * Copyright (c) 2012, Google Inc.
32e192b24SSimon Glass  *
42e192b24SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
52e192b24SSimon Glass  */
62e192b24SSimon Glass 
72e192b24SSimon Glass #include <common.h>
8*40fd0508SSimon Glass #include <dm.h>
92e192b24SSimon Glass #include <fs.h>
102e192b24SSimon Glass #include <part.h>
112e192b24SSimon Glass #include <sandboxblockdev.h>
122e192b24SSimon Glass #include <asm/errno.h>
132e192b24SSimon Glass 
142e192b24SSimon Glass static int host_curr_device = -1;
152e192b24SSimon Glass 
162e192b24SSimon Glass static int do_host_load(cmd_tbl_t *cmdtp, int flag, int argc,
172e192b24SSimon Glass 			   char * const argv[])
182e192b24SSimon Glass {
192e192b24SSimon Glass 	return do_load(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
202e192b24SSimon Glass }
212e192b24SSimon Glass 
222e192b24SSimon Glass static int do_host_ls(cmd_tbl_t *cmdtp, int flag, int argc,
232e192b24SSimon Glass 			   char * const argv[])
242e192b24SSimon Glass {
252e192b24SSimon Glass 	return do_ls(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
262e192b24SSimon Glass }
272e192b24SSimon Glass 
282e192b24SSimon Glass static int do_host_save(cmd_tbl_t *cmdtp, int flag, int argc,
292e192b24SSimon Glass 			   char * const argv[])
302e192b24SSimon Glass {
312e192b24SSimon Glass 	return do_save(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
322e192b24SSimon Glass }
332e192b24SSimon Glass 
342e192b24SSimon Glass static int do_host_bind(cmd_tbl_t *cmdtp, int flag, int argc,
352e192b24SSimon Glass 			   char * const argv[])
362e192b24SSimon Glass {
372e192b24SSimon Glass 	if (argc < 2 || argc > 3)
382e192b24SSimon Glass 		return CMD_RET_USAGE;
392e192b24SSimon Glass 	char *ep;
402e192b24SSimon Glass 	char *dev_str = argv[1];
412e192b24SSimon Glass 	char *file = argc >= 3 ? argv[2] : NULL;
422e192b24SSimon Glass 	int dev = simple_strtoul(dev_str, &ep, 16);
432e192b24SSimon Glass 	if (*ep) {
442e192b24SSimon Glass 		printf("** Bad device specification %s **\n", dev_str);
452e192b24SSimon Glass 		return CMD_RET_USAGE;
462e192b24SSimon Glass 	}
472e192b24SSimon Glass 	return host_dev_bind(dev, file);
482e192b24SSimon Glass }
492e192b24SSimon Glass 
502e192b24SSimon Glass static int do_host_info(cmd_tbl_t *cmdtp, int flag, int argc,
512e192b24SSimon Glass 			   char * const argv[])
522e192b24SSimon Glass {
532e192b24SSimon Glass 	if (argc < 1 || argc > 2)
542e192b24SSimon Glass 		return CMD_RET_USAGE;
552e192b24SSimon Glass 	int min_dev = 0;
562e192b24SSimon Glass 	int max_dev = CONFIG_HOST_MAX_DEVICES - 1;
572e192b24SSimon Glass 	if (argc >= 2) {
582e192b24SSimon Glass 		char *ep;
592e192b24SSimon Glass 		char *dev_str = argv[1];
602e192b24SSimon Glass 		int dev = simple_strtoul(dev_str, &ep, 16);
612e192b24SSimon Glass 		if (*ep) {
622e192b24SSimon Glass 			printf("** Bad device specification %s **\n", dev_str);
632e192b24SSimon Glass 			return CMD_RET_USAGE;
642e192b24SSimon Glass 		}
652e192b24SSimon Glass 		min_dev = dev;
662e192b24SSimon Glass 		max_dev = dev;
672e192b24SSimon Glass 	}
682e192b24SSimon Glass 	int dev;
692e192b24SSimon Glass 	printf("%3s %12s %s\n", "dev", "blocks", "path");
702e192b24SSimon Glass 	for (dev = min_dev; dev <= max_dev; dev++) {
714101f687SSimon Glass 		struct blk_desc *blk_dev;
722e192b24SSimon Glass 		int ret;
732e192b24SSimon Glass 
742e192b24SSimon Glass 		printf("%3d ", dev);
752e192b24SSimon Glass 		ret = host_get_dev_err(dev, &blk_dev);
762e192b24SSimon Glass 		if (ret) {
772e192b24SSimon Glass 			if (ret == -ENOENT)
782e192b24SSimon Glass 				puts("Not bound to a backing file\n");
792e192b24SSimon Glass 			else if (ret == -ENODEV)
802e192b24SSimon Glass 				puts("Invalid host device number\n");
812e192b24SSimon Glass 
822e192b24SSimon Glass 			continue;
832e192b24SSimon Glass 		}
84*40fd0508SSimon Glass 		struct host_block_dev *host_dev;
85*40fd0508SSimon Glass 
86*40fd0508SSimon Glass #ifdef CONFIG_BLK
87*40fd0508SSimon Glass 		host_dev = dev_get_priv(blk_dev->bdev);
88*40fd0508SSimon Glass #else
89*40fd0508SSimon Glass 		host_dev = blk_dev->priv;
90*40fd0508SSimon Glass #endif
912e192b24SSimon Glass 		printf("%12lu %s\n", (unsigned long)blk_dev->lba,
922e192b24SSimon Glass 		       host_dev->filename);
932e192b24SSimon Glass 	}
942e192b24SSimon Glass 	return 0;
952e192b24SSimon Glass }
962e192b24SSimon Glass 
972e192b24SSimon Glass static int do_host_dev(cmd_tbl_t *cmdtp, int flag, int argc,
982e192b24SSimon Glass 		       char * const argv[])
992e192b24SSimon Glass {
1002e192b24SSimon Glass 	int dev;
1012e192b24SSimon Glass 	char *ep;
1024101f687SSimon Glass 	struct blk_desc *blk_dev;
1032e192b24SSimon Glass 	int ret;
1042e192b24SSimon Glass 
1052e192b24SSimon Glass 	if (argc < 1 || argc > 3)
1062e192b24SSimon Glass 		return CMD_RET_USAGE;
1072e192b24SSimon Glass 
1082e192b24SSimon Glass 	if (argc == 1) {
1092e192b24SSimon Glass 		if (host_curr_device < 0) {
1102e192b24SSimon Glass 			printf("No current host device\n");
1112e192b24SSimon Glass 			return 1;
1122e192b24SSimon Glass 		}
1132e192b24SSimon Glass 		printf("Current host device %d\n", host_curr_device);
1142e192b24SSimon Glass 		return 0;
1152e192b24SSimon Glass 	}
1162e192b24SSimon Glass 
1172e192b24SSimon Glass 	dev = simple_strtoul(argv[1], &ep, 16);
1182e192b24SSimon Glass 	if (*ep) {
1192e192b24SSimon Glass 		printf("** Bad device specification %s **\n", argv[2]);
1202e192b24SSimon Glass 		return CMD_RET_USAGE;
1212e192b24SSimon Glass 	}
1222e192b24SSimon Glass 
1232e192b24SSimon Glass 	ret = host_get_dev_err(dev, &blk_dev);
1242e192b24SSimon Glass 	if (ret) {
1252e192b24SSimon Glass 		if (ret == -ENOENT)
1262e192b24SSimon Glass 			puts("Not bound to a backing file\n");
1272e192b24SSimon Glass 		else if (ret == -ENODEV)
1282e192b24SSimon Glass 			puts("Invalid host device number\n");
1292e192b24SSimon Glass 
1302e192b24SSimon Glass 		return 1;
1312e192b24SSimon Glass 	}
1322e192b24SSimon Glass 
1332e192b24SSimon Glass 	host_curr_device = dev;
1342e192b24SSimon Glass 	return 0;
1352e192b24SSimon Glass }
1362e192b24SSimon Glass 
1372e192b24SSimon Glass static cmd_tbl_t cmd_host_sub[] = {
1382e192b24SSimon Glass 	U_BOOT_CMD_MKENT(load, 7, 0, do_host_load, "", ""),
1392e192b24SSimon Glass 	U_BOOT_CMD_MKENT(ls, 3, 0, do_host_ls, "", ""),
1402e192b24SSimon Glass 	U_BOOT_CMD_MKENT(save, 6, 0, do_host_save, "", ""),
1412e192b24SSimon Glass 	U_BOOT_CMD_MKENT(bind, 3, 0, do_host_bind, "", ""),
1422e192b24SSimon Glass 	U_BOOT_CMD_MKENT(info, 3, 0, do_host_info, "", ""),
1432e192b24SSimon Glass 	U_BOOT_CMD_MKENT(dev, 0, 1, do_host_dev, "", ""),
1442e192b24SSimon Glass };
1452e192b24SSimon Glass 
1462e192b24SSimon Glass static int do_host(cmd_tbl_t *cmdtp, int flag, int argc,
1472e192b24SSimon Glass 		      char * const argv[])
1482e192b24SSimon Glass {
1492e192b24SSimon Glass 	cmd_tbl_t *c;
1502e192b24SSimon Glass 
1512e192b24SSimon Glass 	/* Skip past 'host' */
1522e192b24SSimon Glass 	argc--;
1532e192b24SSimon Glass 	argv++;
1542e192b24SSimon Glass 
1552e192b24SSimon Glass 	c = find_cmd_tbl(argv[0], cmd_host_sub,
1562e192b24SSimon Glass 			 ARRAY_SIZE(cmd_host_sub));
1572e192b24SSimon Glass 
1582e192b24SSimon Glass 	if (c)
1592e192b24SSimon Glass 		return c->cmd(cmdtp, flag, argc, argv);
1602e192b24SSimon Glass 	else
1612e192b24SSimon Glass 		return CMD_RET_USAGE;
1622e192b24SSimon Glass }
1632e192b24SSimon Glass 
1642e192b24SSimon Glass U_BOOT_CMD(
1652e192b24SSimon Glass 	sb,	8,	1,	do_host,
1662e192b24SSimon Glass 	"Deprecated: use 'host' command instead.", ""
1672e192b24SSimon Glass );
1682e192b24SSimon Glass 
1692e192b24SSimon Glass U_BOOT_CMD(
1702e192b24SSimon Glass 	host, 8, 1, do_host,
1712e192b24SSimon Glass 	"Miscellaneous host commands",
1722e192b24SSimon Glass 	"load hostfs - <addr> <filename> [<bytes> <offset>]  - "
1732e192b24SSimon Glass 		"load a file from host\n"
1742e192b24SSimon Glass 	"host ls hostfs - <filename>                    - list files on host\n"
1752e192b24SSimon Glass 	"host save hostfs - <addr> <filename> <bytes> [<offset>] - "
1762e192b24SSimon Glass 		"save a file to host\n"
1772e192b24SSimon Glass 	"host bind <dev> [<filename>] - bind \"host\" device to file\n"
1782e192b24SSimon Glass 	"host info [<dev>]            - show device binding & info\n"
1792e192b24SSimon Glass 	"host dev [<dev>] - Set or retrieve the current host device\n"
1802e192b24SSimon Glass 	"host commands use the \"hostfs\" device. The \"host\" device is used\n"
1812e192b24SSimon Glass 	"with standard IO commands such as fatls or ext2load"
1822e192b24SSimon Glass );
183