mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
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>
This commit is contained in:
parent
c3a148f38f
commit
5a61bf17d8
1 changed files with 25 additions and 31 deletions
|
@ -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,22 +689,29 @@ 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);
|
||||
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))
|
||||
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");
|
||||
"Unsupported Boot Device %d\n",
|
||||
bootdev);
|
||||
} else {
|
||||
puts(SPL_TPL_PROMPT
|
||||
"Unsupported Boot Device!\n");
|
||||
}
|
||||
if (loader && !spl_load_image(spl_image, loader)) {
|
||||
}
|
||||
if (loader &&
|
||||
!spl_load_image(spl_image, loader)) {
|
||||
spl_image->boot_device = bootdev;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue