uboot/cmd/host.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (c) 2012, Google Inc.
   4 */
   5
   6#include <common.h>
   7#include <command.h>
   8#include <dm.h>
   9#include <fs.h>
  10#include <part.h>
  11#include <sandboxblockdev.h>
  12#include <dm/device_compat.h>
  13#include <linux/errno.h>
  14
  15static int host_curr_device = -1;
  16
  17static int do_host_load(struct cmd_tbl *cmdtp, int flag, int argc,
  18                        char *const argv[])
  19{
  20        return do_load(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
  21}
  22
  23static int do_host_ls(struct cmd_tbl *cmdtp, int flag, int argc,
  24                      char *const argv[])
  25{
  26        return do_ls(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
  27}
  28
  29static int do_host_size(struct cmd_tbl *cmdtp, int flag, int argc,
  30                        char *const argv[])
  31{
  32        return do_size(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
  33}
  34
  35static int do_host_save(struct cmd_tbl *cmdtp, int flag, int argc,
  36                        char *const argv[])
  37{
  38        return do_save(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
  39}
  40
  41static int do_host_bind(struct cmd_tbl *cmdtp, int flag, int argc,
  42                        char *const argv[])
  43{
  44        bool removable = false;
  45        const char *dev_str;
  46        char *file;
  47        char *ep;
  48        int dev;
  49
  50        /* Skip 'bind' */
  51        argc--;
  52        argv++;
  53        if (argc < 2)
  54                return CMD_RET_USAGE;
  55
  56        if (!strcmp(argv[0], "-r")) {
  57                removable = true;
  58                argc--;
  59                argv++;
  60        }
  61
  62        if (argc > 2)
  63                return CMD_RET_USAGE;
  64        dev_str = argv[0];
  65        dev = hextoul(dev_str, &ep);
  66        if (*ep) {
  67                printf("** Bad device specification %s **\n", dev_str);
  68                return CMD_RET_USAGE;
  69        }
  70        file = argc > 1 ? argv[1] : NULL;
  71
  72        return !!host_dev_bind(dev, file, removable);
  73}
  74
  75static int do_host_info(struct cmd_tbl *cmdtp, int flag, int argc,
  76                        char *const argv[])
  77{
  78        if (argc < 1 || argc > 2)
  79                return CMD_RET_USAGE;
  80        int min_dev = 0;
  81        int max_dev = CONFIG_HOST_MAX_DEVICES - 1;
  82        if (argc >= 2) {
  83                char *ep;
  84                char *dev_str = argv[1];
  85                int dev = hextoul(dev_str, &ep);
  86                if (*ep) {
  87                        printf("** Bad device specification %s **\n", dev_str);
  88                        return CMD_RET_USAGE;
  89                }
  90                min_dev = dev;
  91                max_dev = dev;
  92        }
  93        int dev;
  94        printf("%3s %12s %s\n", "dev", "blocks", "path");
  95        for (dev = min_dev; dev <= max_dev; dev++) {
  96                struct blk_desc *blk_dev;
  97                int ret;
  98
  99                printf("%3d ", dev);
 100                ret = host_get_dev_err(dev, &blk_dev);
 101                if (ret) {
 102                        if (ret == -ENOENT)
 103                                puts("Not bound to a backing file\n");
 104                        else if (ret == -ENODEV)
 105                                puts("Invalid host device number\n");
 106
 107                        continue;
 108                }
 109                struct host_block_dev *host_dev;
 110
 111#ifdef CONFIG_BLK
 112                host_dev = dev_get_plat(blk_dev->bdev);
 113#else
 114                host_dev = blk_dev->priv;
 115#endif
 116                printf("%12lu %s\n", (unsigned long)blk_dev->lba,
 117                       host_dev->filename);
 118        }
 119        return 0;
 120}
 121
 122static int do_host_dev(struct cmd_tbl *cmdtp, int flag, int argc,
 123                       char *const argv[])
 124{
 125        int dev;
 126        char *ep;
 127        struct blk_desc *blk_dev;
 128        int ret;
 129
 130        if (argc < 1 || argc > 3)
 131                return CMD_RET_USAGE;
 132
 133        if (argc == 1) {
 134                if (host_curr_device < 0) {
 135                        printf("No current host device\n");
 136                        return 1;
 137                }
 138                printf("Current host device %d\n", host_curr_device);
 139                return 0;
 140        }
 141
 142        dev = hextoul(argv[1], &ep);
 143        if (*ep) {
 144                printf("** Bad device specification %s **\n", argv[2]);
 145                return CMD_RET_USAGE;
 146        }
 147
 148        ret = host_get_dev_err(dev, &blk_dev);
 149        if (ret) {
 150                if (ret == -ENOENT)
 151                        puts("Not bound to a backing file\n");
 152                else if (ret == -ENODEV)
 153                        puts("Invalid host device number\n");
 154
 155                return 1;
 156        }
 157
 158        host_curr_device = dev;
 159        return 0;
 160}
 161
 162static struct cmd_tbl cmd_host_sub[] = {
 163        U_BOOT_CMD_MKENT(load, 7, 0, do_host_load, "", ""),
 164        U_BOOT_CMD_MKENT(ls, 3, 0, do_host_ls, "", ""),
 165        U_BOOT_CMD_MKENT(save, 6, 0, do_host_save, "", ""),
 166        U_BOOT_CMD_MKENT(size, 3, 0, do_host_size, "", ""),
 167        U_BOOT_CMD_MKENT(bind, 4, 0, do_host_bind, "", ""),
 168        U_BOOT_CMD_MKENT(info, 3, 0, do_host_info, "", ""),
 169        U_BOOT_CMD_MKENT(dev, 0, 1, do_host_dev, "", ""),
 170};
 171
 172static int do_host(struct cmd_tbl *cmdtp, int flag, int argc,
 173                   char *const argv[])
 174{
 175        struct cmd_tbl *c;
 176
 177        /* Skip past 'host' */
 178        argc--;
 179        argv++;
 180
 181        c = find_cmd_tbl(argv[0], cmd_host_sub,
 182                         ARRAY_SIZE(cmd_host_sub));
 183
 184        if (c)
 185                return c->cmd(cmdtp, flag, argc, argv);
 186        else
 187                return CMD_RET_USAGE;
 188}
 189
 190U_BOOT_CMD(
 191        host, 8, 1, do_host,
 192        "Miscellaneous host commands",
 193        "load hostfs - <addr> <filename> [<bytes> <offset>]  - "
 194                "load a file from host\n"
 195        "host ls hostfs - <filename>                    - list files on host\n"
 196        "host save hostfs - <addr> <filename> <bytes> [<offset>] - "
 197                "save a file to host\n"
 198        "host size hostfs - <filename> - determine size of file on host\n"
 199        "host bind [-r] <dev> [<filename>] - bind \"host\" device to file\n"
 200        "     -r = mark as removable\n"
 201        "host info [<dev>]            - show device binding & info\n"
 202        "host dev [<dev>] - Set or retrieve the current host device\n"
 203        "host commands use the \"hostfs\" device. The \"host\" device is used\n"
 204        "with standard IO commands such as fatls or ext2load"
 205);
 206