mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-11 23:47:24 +00:00
rockchip: px30: insert u-boot, spl-boot-device into U-Boot device tree
It is possible to boot U-Boot proper from a different storage medium than the one used by the BOOTROM to load the SPL. This information is stored in the u-boot,spl-boot-device Device Tree property and is accessible from U-Boot proper so that it has knowledge at runtime where it was loaded from. Let's add support for this feature for px30. Cc: Quentin Schulz <foss+uboot@0leil.net> Reviewed-by: Kever Yang <kever.yang@rock-chips.com> Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
This commit is contained in:
parent
3898237384
commit
600e0177e7
1 changed files with 51 additions and 0 deletions
|
@ -5,7 +5,9 @@
|
|||
#include <common.h>
|
||||
#include <clk.h>
|
||||
#include <dm.h>
|
||||
#include <fdt_support.h>
|
||||
#include <init.h>
|
||||
#include <spl.h>
|
||||
#include <asm/armv8/mmu.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch-rockchip/bootrom.h>
|
||||
|
@ -441,3 +443,52 @@ void board_debug_uart_init(void)
|
|||
#endif /* CONFIG_DEBUG_UART_BASE && CONFIG_DEBUG_UART_BASE == ... */
|
||||
}
|
||||
#endif /* CONFIG_DEBUG_UART_BOARD_INIT */
|
||||
|
||||
#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
|
||||
const char *spl_decode_boot_device(u32 boot_device)
|
||||
{
|
||||
int i;
|
||||
static const struct {
|
||||
u32 boot_device;
|
||||
const char *ofpath;
|
||||
} spl_boot_devices_tbl[] = {
|
||||
{ BOOT_DEVICE_MMC2, "/mmc@ff370000" },
|
||||
{ BOOT_DEVICE_MMC1, "/mmc@ff390000" },
|
||||
};
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(spl_boot_devices_tbl); ++i)
|
||||
if (spl_boot_devices_tbl[i].boot_device == boot_device)
|
||||
return spl_boot_devices_tbl[i].ofpath;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void spl_perform_fixups(struct spl_image_info *spl_image)
|
||||
{
|
||||
void *blob = spl_image->fdt_addr;
|
||||
const char *boot_ofpath;
|
||||
int chosen;
|
||||
|
||||
/*
|
||||
* Inject the ofpath of the device the full U-Boot (or Linux in
|
||||
* Falcon-mode) was booted from into the FDT, if a FDT has been
|
||||
* loaded at the same time.
|
||||
*/
|
||||
if (!blob)
|
||||
return;
|
||||
|
||||
boot_ofpath = spl_decode_boot_device(spl_image->boot_device);
|
||||
if (!boot_ofpath) {
|
||||
pr_err("%s: could not map boot_device to ofpath\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
chosen = fdt_find_or_add_subnode(blob, 0, "chosen");
|
||||
if (chosen < 0) {
|
||||
pr_err("%s: could not find/create '/chosen'\n", __func__);
|
||||
return;
|
||||
}
|
||||
fdt_setprop_string(blob, chosen,
|
||||
"u-boot,spl-boot-device", boot_ofpath);
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue