bootstd: Allow hunting for bootdevs of a given priority

Add a way to run the hunter function for a particular priority, so that
new bootdevs can be found.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2023-01-17 10:48:07 -07:00 committed by Tom Rini
parent d73420e4fe
commit 79a7d4a61f
3 changed files with 61 additions and 0 deletions

View file

@ -742,6 +742,31 @@ int bootdev_hunt(const char *spec, bool show)
return result; return result;
} }
int bootdev_hunt_prio(enum bootdev_prio_t prio, bool show)
{
struct bootdev_hunter *start;
int n_ent, i;
int result;
start = ll_entry_start(struct bootdev_hunter, bootdev_hunter);
n_ent = ll_entry_count(struct bootdev_hunter, bootdev_hunter);
result = 0;
log_debug("Hunting for priority %d\n", prio);
for (i = 0; i < n_ent; i++) {
struct bootdev_hunter *info = start + i;
int ret;
if (prio != info->prio)
continue;
ret = bootdev_hunt_drv(info, i, show);
if (ret && ret != -ENOENT)
result = ret;
}
return result;
}
void bootdev_list_hunters(struct bootstd_priv *std) void bootdev_list_hunters(struct bootstd_priv *std)
{ {
struct bootdev_hunter *orig, *start; struct bootdev_hunter *orig, *start;

View file

@ -284,6 +284,17 @@ void bootdev_list_hunters(struct bootstd_priv *std);
*/ */
int bootdev_hunt(const char *spec, bool show); int bootdev_hunt(const char *spec, bool show);
/**
* bootdev_hunt_prio() - Hunt for bootdevs of a particular priority
*
* This runs all hunters which can find bootdevs of the given priority.
*
* @prio: Priority to use
* @show: true to show each hunter as it is used
* Returns: 0 if OK, -ve on error
*/
int bootdev_hunt_prio(enum bootdev_prio_t prio, bool show);
#if CONFIG_IS_ENABLED(BOOTSTD) #if CONFIG_IS_ENABLED(BOOTSTD)
/** /**
* bootdev_setup_for_dev() - Bind a new bootdev device (deprecated) * bootdev_setup_for_dev() - Bind a new bootdev device (deprecated)

View file

@ -363,3 +363,28 @@ static int bootdev_test_bootable(struct unit_test_state *uts)
return 0; return 0;
} }
BOOTSTD_TEST(bootdev_test_bootable, UT_TESTF_DM | UT_TESTF_SCAN_FDT); BOOTSTD_TEST(bootdev_test_bootable, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
/* Check hunting for bootdev of a particular priority */
static int bootdev_test_hunt_prio(struct unit_test_state *uts)
{
test_set_skip_delays(true);
console_record_reset_enable();
ut_assertok(bootdev_hunt_prio(BOOTDEVP_2_SCAN_FAST, false));
ut_assert_nextline("scanning bus for devices...");
ut_assert_skip_to_line(" Type: Hard Disk");
ut_assert_nextlinen(" Capacity:");
ut_assert_console_end();
/* now try a different priority, verbosely */
ut_assertok(bootdev_hunt_prio(BOOTDEVP_3_SCAN_SLOW, true));
ut_assert_nextline("Hunting with: ide");
ut_assert_nextline("Bus 0: not available ");
ut_assert_nextline("Hunting with: usb");
ut_assert_nextline(
"Bus usb@1: scanning bus usb@1 for devices... 5 USB Device(s) found");
ut_assert_console_end();
return 0;
}
BOOTSTD_TEST(bootdev_test_hunt_prio, UT_TESTF_DM | UT_TESTF_SCAN_FDT);