1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
// SPDX-License-Identifier: GPL-2.0+
/*
* 'bootmeth' command
*
* Copyright 2021 Google LLC
* Written by Simon Glass <sjg@chromium.org>
*/
#include <bootdev.h>
#include <bootmeth.h>
#include <bootstd.h>
#include <command.h>
#include <dm.h>
#include <env.h>
#include <malloc.h>
#include <dm/uclass-internal.h>
static int do_bootmeth_list(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct bootstd_priv *std;
struct udevice *dev;
bool use_order;
bool all = false;
int ret;
int i;
if (argc > 1 && *argv[1] == '-') {
all = strchr(argv[1], 'a');
argc--;
argv++;
}
ret = bootstd_get_priv(&std);
if (ret) {
printf("Cannot get bootstd (err=%d)\n", ret);
return CMD_RET_FAILURE;
}
printf("Order Seq Name Description\n");
printf("----- --- ------------------ ------------------\n");
/*
* Use the ordering if we have one, so long as we are not trying to list
* all bootmethds
*/
use_order = std->bootmeth_count && !all;
if (use_order)
dev = std->bootmeth_order[0];
else
ret = uclass_find_first_device(UCLASS_BOOTMETH, &dev);
for (i = 0; dev;) {
struct bootmeth_uc_plat *ucp = dev_get_uclass_plat(dev);
int order = i;
/*
* With the -a flag we may list bootdevs that are not in the
* ordering. Find their place in the order
*/
if (all && std->bootmeth_count) {
int j;
/* Find the position of this bootmeth in the order */
order = -1;
for (j = 0; j < std->bootmeth_count; j++) {
if (std->bootmeth_order[j] == dev)
order = j;
}
}
if (ucp->flags & BOOTMETHF_GLOBAL)
printf("%5s", "glob");
else if (order == -1)
printf("%5s", "-");
else
printf("%5x", order);
printf(" %3x %-19.19s %s\n", dev_seq(dev), dev->name,
ucp->desc);
i++;
if (use_order)
dev = std->bootmeth_order[i];
else
uclass_find_next_device(&dev);
}
printf("----- --- ------------------ ------------------\n");
printf("(%d bootmeth%s)\n", i, i != 1 ? "s" : "");
return 0;
}
static int do_bootmeth_order(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
int ret;
ret = bootmeth_set_order(argv[1]);
if (ret) {
printf("Failed (err=%d)\n", ret);
return CMD_RET_FAILURE;
}
env_set("bootmeths", argv[1]);
return 0;
}
static int do_bootmeth_set(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
int ret;
if (argc < 4) {
printf("Required parameters not provided\n");
return CMD_RET_FAILURE;
}
ret = bootmeth_set_property(argv[1], argv[2], argv[3]);
if (ret) {
printf("Failed (err=%d)\n", ret);
return CMD_RET_FAILURE;
}
return 0;
}
U_BOOT_LONGHELP(bootmeth,
"list [-a] - list available bootmeths (-a all)\n"
"bootmeth order [<bd> ...] - select bootmeth order / subset to use\n"
"bootmeth set <bootmeth> <property> <value> - set optional property");
U_BOOT_CMD_WITH_SUBCMDS(bootmeth, "Boot methods", bootmeth_help_text,
U_BOOT_SUBCMD_MKENT(list, 2, 1, do_bootmeth_list),
U_BOOT_SUBCMD_MKENT(order, CONFIG_SYS_MAXARGS, 1, do_bootmeth_order),
U_BOOT_SUBCMD_MKENT(set, CONFIG_SYS_MAXARGS, 1, do_bootmeth_set));
|