mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 15:41:40 +00:00
rockchip: spl: support a 'same-as-spl'-specifier in the spl-boot-order
It is often desirable to configure the spl-boot-order (i.e. the order that SPL probes devices to find the FIT image containing a full U-Boot) such that it contains 'the same device the SPL stage was booted from' early on. To support this, we introduce the 'same-as-spl' specifier for the spl-boot-order property. This commit adds: - documentation for the new board_spl_was_booted_from() function that individual SoCs/boards should provide, if they can determine where the SPL was booted from - implements the new board_spl_was_booted_from() stub function - adds support for handling the 'same-as-spl' specifier and calling into the per-SoC/per-board support code. This also updates the documentation for the 'u-boot,spl-boot-order' property. Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
dbad01cab5
commit
80e9f88e67
2 changed files with 39 additions and 2 deletions
|
@ -76,6 +76,24 @@ static int spl_node_to_boot_device(int node)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* board_spl_was_booted_from() - retrieves the of-path the SPL was loaded from
|
||||||
|
*
|
||||||
|
* To support a 'same-as-spl' specification in the search-order for the next
|
||||||
|
* stage, we need a SoC- or board-specific way to handshake with what 'came
|
||||||
|
* before us' (either a BROM or TPL stage) and map the info retrieved onto
|
||||||
|
* a OF path.
|
||||||
|
*
|
||||||
|
* Returns
|
||||||
|
* NULL, on failure or if the device could not be identified
|
||||||
|
* a of_path (a string), on success
|
||||||
|
*/
|
||||||
|
__weak const char *board_spl_was_booted_from(void)
|
||||||
|
{
|
||||||
|
debug("%s: no support for 'same-as-spl' for this board\n", __func__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void board_boot_order(u32 *spl_boot_list)
|
void board_boot_order(u32 *spl_boot_list)
|
||||||
{
|
{
|
||||||
const void *blob = gd->fdt_blob;
|
const void *blob = gd->fdt_blob;
|
||||||
|
@ -97,8 +115,17 @@ void board_boot_order(u32 *spl_boot_list)
|
||||||
(conf = fdt_stringlist_get(blob, chosen_node,
|
(conf = fdt_stringlist_get(blob, chosen_node,
|
||||||
"u-boot,spl-boot-order", elem, NULL));
|
"u-boot,spl-boot-order", elem, NULL));
|
||||||
elem++) {
|
elem++) {
|
||||||
|
const char *alias;
|
||||||
|
|
||||||
|
/* Handle the case of 'same device the SPL was loaded from' */
|
||||||
|
if (strncmp(conf, "same-as-spl", 11) == 0) {
|
||||||
|
conf = board_spl_was_booted_from();
|
||||||
|
if (!conf)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* First check if the list element is an alias */
|
/* First check if the list element is an alias */
|
||||||
const char *alias = fdt_get_alias(blob, conf);
|
alias = fdt_get_alias(blob, conf);
|
||||||
if (alias)
|
if (alias)
|
||||||
conf = alias;
|
conf = alias;
|
||||||
|
|
||||||
|
|
|
@ -56,10 +56,20 @@ Each list element of the property should specify a device to be probed
|
||||||
in the order they are listed: references (i.e. implicit paths), a full
|
in the order they are listed: references (i.e. implicit paths), a full
|
||||||
path or an alias is expected for each entry.
|
path or an alias is expected for each entry.
|
||||||
|
|
||||||
|
A special specifier "same-as-spl" can be used at any position in the
|
||||||
|
boot-order to direct U-Boot to insert the device the SPL was booted
|
||||||
|
from there. Whether this is indeed inserted or silently ignored (if
|
||||||
|
it is not supported on any given SoC/board or if the boot-device is
|
||||||
|
not available to continue booting from) is implementation-defined.
|
||||||
|
Note that if "same-as-spl" expands to an actual node for a given
|
||||||
|
board, the corresponding node may appear multiple times in the
|
||||||
|
boot-order (as there currently exists no mechanism to suppress
|
||||||
|
duplicates from the list).
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
/ {
|
/ {
|
||||||
chosen {
|
chosen {
|
||||||
u-boot,spl-boot-order = &sdmmc, "/sdhci@fe330000";
|
u-boot,spl-boot-order = "same-as-spl", &sdmmc, "/sdhci@fe330000";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue