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