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> 840fd0508SSimon 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 28*49afb379SStefan Brüns static int do_host_size(cmd_tbl_t *cmdtp, int flag, int argc, 29*49afb379SStefan Brüns char * const argv[]) 30*49afb379SStefan Brüns { 31*49afb379SStefan Brüns return do_size(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX); 32*49afb379SStefan Brüns } 33*49afb379SStefan Brüns 342e192b24SSimon Glass static int do_host_save(cmd_tbl_t *cmdtp, int flag, int argc, 352e192b24SSimon Glass char * const argv[]) 362e192b24SSimon Glass { 372e192b24SSimon Glass return do_save(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX); 382e192b24SSimon Glass } 392e192b24SSimon Glass 402e192b24SSimon Glass static int do_host_bind(cmd_tbl_t *cmdtp, int flag, int argc, 412e192b24SSimon Glass char * const argv[]) 422e192b24SSimon Glass { 432e192b24SSimon Glass if (argc < 2 || argc > 3) 442e192b24SSimon Glass return CMD_RET_USAGE; 452e192b24SSimon Glass char *ep; 462e192b24SSimon Glass char *dev_str = argv[1]; 472e192b24SSimon Glass char *file = argc >= 3 ? argv[2] : NULL; 482e192b24SSimon Glass int dev = simple_strtoul(dev_str, &ep, 16); 492e192b24SSimon Glass if (*ep) { 502e192b24SSimon Glass printf("** Bad device specification %s **\n", dev_str); 512e192b24SSimon Glass return CMD_RET_USAGE; 522e192b24SSimon Glass } 532e192b24SSimon Glass return host_dev_bind(dev, file); 542e192b24SSimon Glass } 552e192b24SSimon Glass 562e192b24SSimon Glass static int do_host_info(cmd_tbl_t *cmdtp, int flag, int argc, 572e192b24SSimon Glass char * const argv[]) 582e192b24SSimon Glass { 592e192b24SSimon Glass if (argc < 1 || argc > 2) 602e192b24SSimon Glass return CMD_RET_USAGE; 612e192b24SSimon Glass int min_dev = 0; 622e192b24SSimon Glass int max_dev = CONFIG_HOST_MAX_DEVICES - 1; 632e192b24SSimon Glass if (argc >= 2) { 642e192b24SSimon Glass char *ep; 652e192b24SSimon Glass char *dev_str = argv[1]; 662e192b24SSimon Glass int dev = simple_strtoul(dev_str, &ep, 16); 672e192b24SSimon Glass if (*ep) { 682e192b24SSimon Glass printf("** Bad device specification %s **\n", dev_str); 692e192b24SSimon Glass return CMD_RET_USAGE; 702e192b24SSimon Glass } 712e192b24SSimon Glass min_dev = dev; 722e192b24SSimon Glass max_dev = dev; 732e192b24SSimon Glass } 742e192b24SSimon Glass int dev; 752e192b24SSimon Glass printf("%3s %12s %s\n", "dev", "blocks", "path"); 762e192b24SSimon Glass for (dev = min_dev; dev <= max_dev; dev++) { 774101f687SSimon Glass struct blk_desc *blk_dev; 782e192b24SSimon Glass int ret; 792e192b24SSimon Glass 802e192b24SSimon Glass printf("%3d ", dev); 812e192b24SSimon Glass ret = host_get_dev_err(dev, &blk_dev); 822e192b24SSimon Glass if (ret) { 832e192b24SSimon Glass if (ret == -ENOENT) 842e192b24SSimon Glass puts("Not bound to a backing file\n"); 852e192b24SSimon Glass else if (ret == -ENODEV) 862e192b24SSimon Glass puts("Invalid host device number\n"); 872e192b24SSimon Glass 882e192b24SSimon Glass continue; 892e192b24SSimon Glass } 9040fd0508SSimon Glass struct host_block_dev *host_dev; 9140fd0508SSimon Glass 9240fd0508SSimon Glass #ifdef CONFIG_BLK 9340fd0508SSimon Glass host_dev = dev_get_priv(blk_dev->bdev); 9440fd0508SSimon Glass #else 9540fd0508SSimon Glass host_dev = blk_dev->priv; 9640fd0508SSimon Glass #endif 972e192b24SSimon Glass printf("%12lu %s\n", (unsigned long)blk_dev->lba, 982e192b24SSimon Glass host_dev->filename); 992e192b24SSimon Glass } 1002e192b24SSimon Glass return 0; 1012e192b24SSimon Glass } 1022e192b24SSimon Glass 1032e192b24SSimon Glass static int do_host_dev(cmd_tbl_t *cmdtp, int flag, int argc, 1042e192b24SSimon Glass char * const argv[]) 1052e192b24SSimon Glass { 1062e192b24SSimon Glass int dev; 1072e192b24SSimon Glass char *ep; 1084101f687SSimon Glass struct blk_desc *blk_dev; 1092e192b24SSimon Glass int ret; 1102e192b24SSimon Glass 1112e192b24SSimon Glass if (argc < 1 || argc > 3) 1122e192b24SSimon Glass return CMD_RET_USAGE; 1132e192b24SSimon Glass 1142e192b24SSimon Glass if (argc == 1) { 1152e192b24SSimon Glass if (host_curr_device < 0) { 1162e192b24SSimon Glass printf("No current host device\n"); 1172e192b24SSimon Glass return 1; 1182e192b24SSimon Glass } 1192e192b24SSimon Glass printf("Current host device %d\n", host_curr_device); 1202e192b24SSimon Glass return 0; 1212e192b24SSimon Glass } 1222e192b24SSimon Glass 1232e192b24SSimon Glass dev = simple_strtoul(argv[1], &ep, 16); 1242e192b24SSimon Glass if (*ep) { 1252e192b24SSimon Glass printf("** Bad device specification %s **\n", argv[2]); 1262e192b24SSimon Glass return CMD_RET_USAGE; 1272e192b24SSimon Glass } 1282e192b24SSimon Glass 1292e192b24SSimon Glass ret = host_get_dev_err(dev, &blk_dev); 1302e192b24SSimon Glass if (ret) { 1312e192b24SSimon Glass if (ret == -ENOENT) 1322e192b24SSimon Glass puts("Not bound to a backing file\n"); 1332e192b24SSimon Glass else if (ret == -ENODEV) 1342e192b24SSimon Glass puts("Invalid host device number\n"); 1352e192b24SSimon Glass 1362e192b24SSimon Glass return 1; 1372e192b24SSimon Glass } 1382e192b24SSimon Glass 1392e192b24SSimon Glass host_curr_device = dev; 1402e192b24SSimon Glass return 0; 1412e192b24SSimon Glass } 1422e192b24SSimon Glass 1432e192b24SSimon Glass static cmd_tbl_t cmd_host_sub[] = { 1442e192b24SSimon Glass U_BOOT_CMD_MKENT(load, 7, 0, do_host_load, "", ""), 1452e192b24SSimon Glass U_BOOT_CMD_MKENT(ls, 3, 0, do_host_ls, "", ""), 1462e192b24SSimon Glass U_BOOT_CMD_MKENT(save, 6, 0, do_host_save, "", ""), 147*49afb379SStefan Brüns U_BOOT_CMD_MKENT(size, 3, 0, do_host_size, "", ""), 1482e192b24SSimon Glass U_BOOT_CMD_MKENT(bind, 3, 0, do_host_bind, "", ""), 1492e192b24SSimon Glass U_BOOT_CMD_MKENT(info, 3, 0, do_host_info, "", ""), 1502e192b24SSimon Glass U_BOOT_CMD_MKENT(dev, 0, 1, do_host_dev, "", ""), 1512e192b24SSimon Glass }; 1522e192b24SSimon Glass 1532e192b24SSimon Glass static int do_host(cmd_tbl_t *cmdtp, int flag, int argc, 1542e192b24SSimon Glass char * const argv[]) 1552e192b24SSimon Glass { 1562e192b24SSimon Glass cmd_tbl_t *c; 1572e192b24SSimon Glass 1582e192b24SSimon Glass /* Skip past 'host' */ 1592e192b24SSimon Glass argc--; 1602e192b24SSimon Glass argv++; 1612e192b24SSimon Glass 1622e192b24SSimon Glass c = find_cmd_tbl(argv[0], cmd_host_sub, 1632e192b24SSimon Glass ARRAY_SIZE(cmd_host_sub)); 1642e192b24SSimon Glass 1652e192b24SSimon Glass if (c) 1662e192b24SSimon Glass return c->cmd(cmdtp, flag, argc, argv); 1672e192b24SSimon Glass else 1682e192b24SSimon Glass return CMD_RET_USAGE; 1692e192b24SSimon Glass } 1702e192b24SSimon Glass 1712e192b24SSimon Glass U_BOOT_CMD( 1722e192b24SSimon Glass sb, 8, 1, do_host, 1732e192b24SSimon Glass "Deprecated: use 'host' command instead.", "" 1742e192b24SSimon Glass ); 1752e192b24SSimon Glass 1762e192b24SSimon Glass U_BOOT_CMD( 1772e192b24SSimon Glass host, 8, 1, do_host, 1782e192b24SSimon Glass "Miscellaneous host commands", 1792e192b24SSimon Glass "load hostfs - <addr> <filename> [<bytes> <offset>] - " 1802e192b24SSimon Glass "load a file from host\n" 1812e192b24SSimon Glass "host ls hostfs - <filename> - list files on host\n" 1822e192b24SSimon Glass "host save hostfs - <addr> <filename> <bytes> [<offset>] - " 1832e192b24SSimon Glass "save a file to host\n" 184*49afb379SStefan Brüns "host size hostfs - <filename> - determine size of file on host" 1852e192b24SSimon Glass "host bind <dev> [<filename>] - bind \"host\" device to file\n" 1862e192b24SSimon Glass "host info [<dev>] - show device binding & info\n" 1872e192b24SSimon Glass "host dev [<dev>] - Set or retrieve the current host device\n" 1882e192b24SSimon Glass "host commands use the \"hostfs\" device. The \"host\" device is used\n" 1892e192b24SSimon Glass "with standard IO commands such as fatls or ext2load" 1902e192b24SSimon Glass ); 191