]> Git Repo - u-boot.git/blame - cmd/host.c
Merge branch '2022-10-11-assorted-fixes-and-updates'
[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>
09140113 7#include <command.h>
40fd0508 8#include <dm.h>
d304931f 9#include <fs.h>
f4d8de48
HN
10#include <part.h>
11#include <sandboxblockdev.h>
336d4615 12#include <dm/device_compat.h>
1221ce45 13#include <linux/errno.h>
d304931f 14
9b97b6ba
SS
15static int host_curr_device = -1;
16
09140113
SG
17static int do_host_load(struct cmd_tbl *cmdtp, int flag, int argc,
18 char *const argv[])
d304931f 19{
9ade4857 20 return do_load(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
d304931f
SG
21}
22
09140113
SG
23static int do_host_ls(struct cmd_tbl *cmdtp, int flag, int argc,
24 char *const argv[])
d304931f
SG
25{
26 return do_ls(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
27}
28
09140113
SG
29static int do_host_size(struct cmd_tbl *cmdtp, int flag, int argc,
30 char *const argv[])
49afb379
SB
31{
32 return do_size(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
33}
34
09140113
SG
35static int do_host_save(struct cmd_tbl *cmdtp, int flag, int argc,
36 char *const argv[])
7eb2c8d5 37{
9ade4857 38 return do_save(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
7eb2c8d5
SG
39}
40
09140113
SG
41static int do_host_bind(struct cmd_tbl *cmdtp, int flag, int argc,
42 char *const argv[])
f4d8de48 43{
1758551e 44 bool removable = false;
1503c2c7
SG
45 const char *dev_str;
46 char *file;
47 char *ep;
48 int dev;
49
803e9c1c
SG
50 /* Skip 'bind' */
51 argc--;
52 argv++;
1758551e
SG
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)
f4d8de48 63 return CMD_RET_USAGE;
803e9c1c 64 dev_str = argv[0];
7e5f460e 65 dev = hextoul(dev_str, &ep);
f4d8de48
HN
66 if (*ep) {
67 printf("** Bad device specification %s **\n", dev_str);
68 return CMD_RET_USAGE;
69 }
803e9c1c 70 file = argc > 1 ? argv[1] : NULL;
1503c2c7 71
1758551e 72 return !!host_dev_bind(dev, file, removable);
f4d8de48
HN
73}
74
09140113
SG
75static int do_host_info(struct cmd_tbl *cmdtp, int flag, int argc,
76 char *const argv[])
f4d8de48
HN
77{
78 if (argc < 1 || argc > 2)
79 return CMD_RET_USAGE;
80 int min_dev = 0;
32c8566f 81 int max_dev = SANDBOX_HOST_MAX_DEVICES - 1;
f4d8de48
HN
82 if (argc >= 2) {
83 char *ep;
84 char *dev_str = argv[1];
7e5f460e 85 int dev = hextoul(dev_str, &ep);
f4d8de48
HN
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++) {
4101f687 96 struct blk_desc *blk_dev;
f4d8de48
HN
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 }
40fd0508
SG
109 struct host_block_dev *host_dev;
110
111#ifdef CONFIG_BLK
c69cda25 112 host_dev = dev_get_plat(blk_dev->bdev);
40fd0508
SG
113#else
114 host_dev = blk_dev->priv;
115#endif
f4d8de48
HN
116 printf("%12lu %s\n", (unsigned long)blk_dev->lba,
117 host_dev->filename);
118 }
119 return 0;
120}
121
09140113
SG
122static int do_host_dev(struct cmd_tbl *cmdtp, int flag, int argc,
123 char *const argv[])
9b97b6ba
SS
124{
125 int dev;
126 char *ep;
4101f687 127 struct blk_desc *blk_dev;
9b97b6ba
SS
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
7e5f460e 142 dev = hextoul(argv[1], &ep);
9b97b6ba
SS
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
09140113 162static struct cmd_tbl cmd_host_sub[] = {
bacfb1df
SS
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, "", ""),
49afb379 166 U_BOOT_CMD_MKENT(size, 3, 0, do_host_size, "", ""),
1758551e 167 U_BOOT_CMD_MKENT(bind, 4, 0, do_host_bind, "", ""),
bacfb1df 168 U_BOOT_CMD_MKENT(info, 3, 0, do_host_info, "", ""),
9b97b6ba 169 U_BOOT_CMD_MKENT(dev, 0, 1, do_host_dev, "", ""),
d304931f
SG
170};
171
09140113
SG
172static int do_host(struct cmd_tbl *cmdtp, int flag, int argc,
173 char *const argv[])
d304931f 174{
09140113 175 struct cmd_tbl *c;
d304931f 176
bacfb1df 177 /* Skip past 'host' */
d304931f
SG
178 argc--;
179 argv++;
180
bacfb1df
SS
181 c = find_cmd_tbl(argv[0], cmd_host_sub,
182 ARRAY_SIZE(cmd_host_sub));
d304931f
SG
183
184 if (c)
185 return c->cmd(cmdtp, flag, argc, argv);
186 else
187 return CMD_RET_USAGE;
188}
189
bacfb1df
SS
190U_BOOT_CMD(
191 host, 8, 1, do_host,
192 "Miscellaneous host commands",
4d907025 193 "load hostfs - <addr> <filename> [<bytes> <offset>] - "
7eb2c8d5 194 "load a file from host\n"
bacfb1df
SS
195 "host ls hostfs - <filename> - list files on host\n"
196 "host save hostfs - <addr> <filename> <bytes> [<offset>] - "
7eb2c8d5 197 "save a file to host\n"
6baa692f 198 "host size hostfs - <filename> - determine size of file on host\n"
1758551e
SG
199 "host bind [-r] <dev> [<filename>] - bind \"host\" device to file\n"
200 " -r = mark as removable\n"
bacfb1df 201 "host info [<dev>] - show device binding & info\n"
9b97b6ba 202 "host dev [<dev>] - Set or retrieve the current host device\n"
bacfb1df 203 "host commands use the \"hostfs\" device. The \"host\" device is used\n"
4d907025 204 "with standard IO commands such as fatls or ext2load"
d304931f 205);
This page took 0.235967 seconds and 4 git commands to generate.