diff options
-rw-r--r-- | common/cmd_part.c | 53 | ||||
-rw-r--r-- | include/config_cmd_default.h | 1 | ||||
-rw-r--r-- | include/config_distro_bootcmd.h | 3 |
3 files changed, 44 insertions, 13 deletions
diff --git a/common/cmd_part.c b/common/cmd_part.c index c99f527..d04588e 100644 --- a/common/cmd_part.c +++ b/common/cmd_part.c @@ -53,29 +53,57 @@ static int do_part_list(int argc, char * const argv[]) { int ret; block_dev_desc_t *desc; + char *var = NULL; + bool bootable = false; + int i; - if (argc < 2 || argc > 3) + if (argc < 2) return CMD_RET_USAGE; + if (argc > 2) { + for (i = 2; i < argc ; i++) { + if (argv[i][0] == '-') { + if (!strcmp(argv[i], "-bootable")) { + bootable = true; + } else { + printf("Unknown option %s\n", argv[i]); + return CMD_RET_USAGE; + } + } else { + var = argv[i]; + break; + } + } + + /* Loops should have been exited at the last argument, which + * as it contained the variable */ + if (argc != i + 1) + return CMD_RET_USAGE; + } + ret = get_device(argv[0], argv[1], &desc); if (ret < 0) return 1; - if (argc == 3) { + if (var != NULL) { int p; - char str[512] = { 0, }; + char str[512] = { '\0', }; disk_partition_t info; for (p = 1; p < 128; p++) { + char t[5]; int r = get_partition_info(desc, p, &info); - if (r == 0) { - char t[5]; - sprintf(t, "%s%d", str[0] ? " " : "", p); - strcat(str, t); - } + if (r != 0) + continue; + + if (bootable && !info.bootable) + continue; + + sprintf(t, "%s%d", str[0] ? " " : "", p); + strcat(str, t); } - setenv(argv[2], str); + setenv(var, str); return 0; } @@ -98,7 +126,7 @@ static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } U_BOOT_CMD( - part, 5, 1, do_part, + part, CONFIG_SYS_MAXARGS, 1, do_part, "disk partition related commands", "part uuid <interface> <dev>:<part>\n" " - print partition UUID\n" @@ -106,6 +134,7 @@ U_BOOT_CMD( " - set environment variable to partition UUID\n" "part list <interface> <dev>\n" " - print a device's partition table\n" - "part list <interface> <dev> <varname>\n" - " - set environment variable to the list of partitions" + "part list <interface> <dev> [flags] <varname>\n" + " - set environment variable to the list of partitions\n" + " flags can be -bootable (list only bootable partitions)" ); diff --git a/include/config_cmd_default.h b/include/config_cmd_default.h index 73c9544..e79a13b 100644 --- a/include/config_cmd_default.h +++ b/include/config_cmd_default.h @@ -21,6 +21,7 @@ #define CONFIG_CMD_CONSOLE /* coninfo */ #define CONFIG_CMD_ECHO /* echo arguments */ #define CONFIG_CMD_EDITENV /* editenv */ +#define CONFIG_CMD_ENV_EXISTS /* query whether env variables exists */ #define CONFIG_CMD_FPGA /* FPGA configuration Support */ #define CONFIG_CMD_IMI /* iminfo */ #define CONFIG_CMD_ITEST /* Integer (and string) test */ diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h index 73f093f..d71e58d 100644 --- a/include/config_distro_bootcmd.h +++ b/include/config_distro_bootcmd.h @@ -213,7 +213,8 @@ "done\0" \ \ "scan_dev_for_boot_part=" \ - "part list ${devtype} ${devnum} devplist; " \ + "part list ${devtype} ${devnum} -bootable devplist; " \ + "env exists devplist || setenv devplist 1; " \ "for bootpart in ${devplist}; do " \ "if fstype ${devtype} ${devnum}:${bootpart} " \ "bootfstype; then " \ |