bootstd: support scanning a single partition

The "bootflow" command currently doesn't support scanning a single
partition. This is inconvenient in setups with multiple bootable
partitions within a single disk, but only one is desired.

Support scanning a single disk partition. Specifically, support the
syntax:
	bootflow scan mmc1:4
which scans only mmc device 1, partition 4.

Signed-off-by: Nam Cao <namcao@linutronix.de>
This commit is contained in:
Nam Cao 2024-02-21 13:41:44 +01:00 committed by Tom Rini
parent c15d73d189
commit 1132471405
4 changed files with 43 additions and 2 deletions

View file

@ -172,8 +172,10 @@ int bootdev_find_in_blk(struct udevice *dev, struct udevice *blk,
*/
iter->max_part = MAX_PART_PER_BOOTDEV;
/* If this is the whole disk, check if we have bootable partitions */
if (!iter->part) {
if (iter->flags & BOOTFLOWIF_SINGLE_PARTITION) {
/* a particular partition was specified, scan it without checking */
} else if (!iter->part) {
/* This is the whole disk, check if we have bootable partitions */
iter->first_bootable = part_get_bootable(desc);
log_debug("checking bootable=%d\n", iter->first_bootable);
} else if (allow_any_part) {
@ -710,8 +712,37 @@ int bootdev_setup_iter(struct bootflow_iter *iter, const char *label,
struct udevice *bootstd, *dev = NULL;
bool show = iter->flags & BOOTFLOWIF_SHOW;
int method_flags;
char buf[32];
int ret;
if (label) {
const char *end = strchr(label, ':');
if (end) {
size_t len = (size_t)(end - label);
const char *part = end + 1;
if (len + 1 > sizeof(buf)) {
log_err("label \"%s\" is way too long\n", label);
return -EINVAL;
}
memcpy(buf, label, len);
buf[len] = '\0';
label = buf;
unsigned long tmp;
if (strict_strtoul(part, 0, &tmp)) {
log_err("Invalid partition number: %s\n", part);
return -EINVAL;
}
iter->flags |= BOOTFLOWIF_SINGLE_PARTITION;
iter->part = tmp;
}
}
ret = uclass_first_device_err(UCLASS_BOOTSTD, &bootstd);
if (ret) {
log_err("Missing bootstd device\n");