aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorSimon Glass2022-10-20 18:23:07 -0600
committerTom Rini2022-10-31 11:03:18 -0400
commit5a61bf17d893c269b9cec383ebdd7c1d5348a853 (patch)
treeb7e0cc40263cb510dee77934fcad0190fbd778a7 /common
parentc3a148f38f006c04bca0d695a38bc45c35c159fa (diff)
spl: Allow multiple loaders of the same time
At present we only support a single loader of each time. Extra ones are ignored. This means that only one BOOT_DEVICE_BOARD can be used in the SPL image. This is inconvenient since we sometimes want to provide several board-specific drivers, albeit at different priorties. Add support for this. This should have no functional change for existing boards. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/spl/spl.c56
1 files changed, 25 insertions, 31 deletions
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 4635e77e979..6f2014b0e22 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -630,23 +630,6 @@ __weak void board_boot_order(u32 *spl_boot_list)
spl_boot_list[0] = spl_boot_device();
}
-static struct spl_image_loader *spl_ll_find_loader(uint boot_device)
-{
- struct spl_image_loader *drv =
- ll_entry_start(struct spl_image_loader, spl_image_loader);
- const int n_ents =
- ll_entry_count(struct spl_image_loader, spl_image_loader);
- struct spl_image_loader *entry;
-
- for (entry = drv; entry != drv + n_ents; entry++) {
- if (boot_device == entry->boot_device)
- return entry;
- }
-
- /* Not found */
- return NULL;
-}
-
__weak int spl_check_board_image(struct spl_image_info *spl_image,
const struct spl_boot_device *bootdev)
{
@@ -693,6 +676,10 @@ static int spl_load_image(struct spl_image_info *spl_image,
static int boot_from_devices(struct spl_image_info *spl_image,
u32 spl_boot_list[], int count)
{
+ struct spl_image_loader *drv =
+ ll_entry_start(struct spl_image_loader, spl_image_loader);
+ const int n_ents =
+ ll_entry_count(struct spl_image_loader, spl_image_loader);
int ret = -ENODEV;
int i;
@@ -702,20 +689,27 @@ static int boot_from_devices(struct spl_image_info *spl_image,
if (CONFIG_IS_ENABLED(SHOW_ERRORS))
ret = -ENXIO;
- loader = spl_ll_find_loader(bootdev);
- if (!CONFIG_IS_ENABLED(SILENT_CONSOLE)) {
- if (loader)
- printf("Trying to boot from %s\n",
- spl_loader_name(loader));
- else if (CONFIG_IS_ENABLED(SHOW_ERRORS))
- printf(SPL_TPL_PROMPT
- "Unsupported Boot Device %d\n", bootdev);
- else
- puts(SPL_TPL_PROMPT "Unsupported Boot Device!\n");
- }
- if (loader && !spl_load_image(spl_image, loader)) {
- spl_image->boot_device = bootdev;
- return 0;
+ for (loader = drv; loader != drv + n_ents; loader++) {
+ if (bootdev != loader->boot_device)
+ continue;
+ if (!CONFIG_IS_ENABLED(SILENT_CONSOLE)) {
+ if (loader)
+ printf("Trying to boot from %s\n",
+ spl_loader_name(loader));
+ else if (CONFIG_IS_ENABLED(SHOW_ERRORS)) {
+ printf(SPL_TPL_PROMPT
+ "Unsupported Boot Device %d\n",
+ bootdev);
+ } else {
+ puts(SPL_TPL_PROMPT
+ "Unsupported Boot Device!\n");
+ }
+ }
+ if (loader &&
+ !spl_load_image(spl_image, loader)) {
+ spl_image->boot_device = bootdev;
+ return 0;
+ }
}
}