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();
|
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,
|
__weak int spl_check_board_image(struct spl_image_info *spl_image,
|
||||||
const struct spl_boot_device *bootdev)
|
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,
|
static int boot_from_devices(struct spl_image_info *spl_image,
|
||||||
u32 spl_boot_list[], int count)
|
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 ret = -ENODEV;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -702,20 +689,27 @@ static int boot_from_devices(struct spl_image_info *spl_image,
|
||||||
|
|
||||||
if (CONFIG_IS_ENABLED(SHOW_ERRORS))
|
if (CONFIG_IS_ENABLED(SHOW_ERRORS))
|
||||||
ret = -ENXIO;
|
ret = -ENXIO;
|
||||||
loader = spl_ll_find_loader(bootdev);
|
for (loader = drv; loader != drv + n_ents; loader++) {
|
||||||
if (!CONFIG_IS_ENABLED(SILENT_CONSOLE)) {
|
if (bootdev != loader->boot_device)
|
||||||
if (loader)
|
continue;
|
||||||
printf("Trying to boot from %s\n",
|
if (!CONFIG_IS_ENABLED(SILENT_CONSOLE)) {
|
||||||
spl_loader_name(loader));
|
if (loader)
|
||||||
else if (CONFIG_IS_ENABLED(SHOW_ERRORS))
|
printf("Trying to boot from %s\n",
|
||||||
printf(SPL_TPL_PROMPT
|
spl_loader_name(loader));
|
||||||
"Unsupported Boot Device %d\n", bootdev);
|
else if (CONFIG_IS_ENABLED(SHOW_ERRORS)) {
|
||||||
else
|
printf(SPL_TPL_PROMPT
|
||||||
puts(SPL_TPL_PROMPT "Unsupported Boot Device!\n");
|
"Unsupported Boot Device %d\n",
|
||||||
}
|
bootdev);
|
||||||
if (loader && !spl_load_image(spl_image, loader)) {
|
} else {
|
||||||
spl_image->boot_device = bootdev;
|
puts(SPL_TPL_PROMPT
|
||||||
return 0;
|
"Unsupported Boot Device!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loader &&
|
||||||
|
!spl_load_image(spl_image, loader)) {
|
||||||
|
spl_image->boot_device = bootdev;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue