rockchip: rk3399: inject 'u-boot, spl-boot-device' for next-stage
This implements the new 'spl_perform_fixups' hook for RK3399-based boards and injects the /chosen/u-boot,spl-boot-device with an ofpath corresponding to the boot device used. The intended usage is for the full U-Boot stage to evaluate this in scripts and then adapt its boot-order when using distro-boot. Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Tested-by: Klaus Goger <klaus.goger@theobroma-systems.com>
This commit is contained in:
parent
2aa4abc1bd
commit
e5f2ecc750
@ -57,6 +57,54 @@ u32 spl_boot_device(void)
|
|||||||
return boot_device;
|
return boot_device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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_MMC1, "/dwmmc@fe320000" },
|
||||||
|
{ BOOT_DEVICE_MMC2, "/sdhci@fe330000" },
|
||||||
|
{ BOOT_DEVICE_SPI, "/spi@ff1d0000" },
|
||||||
|
};
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
#define TIMER_CHN10_BASE 0xff8680a0
|
#define TIMER_CHN10_BASE 0xff8680a0
|
||||||
#define TIMER_END_COUNT_L 0x00
|
#define TIMER_END_COUNT_L 0x00
|
||||||
#define TIMER_END_COUNT_H 0x04
|
#define TIMER_END_COUNT_H 0x04
|
||||||
|
Loading…
Reference in New Issue
Block a user