diff options
author | Simon Glass | 2022-04-30 00:56:52 -0600 |
---|---|---|
committer | Tom Rini | 2022-05-02 09:58:13 -0400 |
commit | f86ca5ad8f780d306e79d49ffe4f5cf1edef37b9 (patch) | |
tree | a2eac09d5cb3376288fc135b1563abb1af7bbb16 /common/spl | |
parent | d3eba95a7e9b6b89404a3ddb2945f03cff4effb4 (diff) |
Introduce Verifying Program Loader (VPL)
Add support for VPL, a new phase of U-Boot. This runs after TPL. It is
responsible for selecting which SPL binary to run, based on a
verified-boot process.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common/spl')
-rw-r--r-- | common/spl/Kconfig | 15 | ||||
-rw-r--r-- | common/spl/spl.c | 25 |
2 files changed, 36 insertions, 4 deletions
diff --git a/common/spl/Kconfig b/common/spl/Kconfig index ac61b25a066..be098668f0e 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -1,4 +1,4 @@ -menu "SPL / TPL" +menu "SPL / TPL / VPL" config SUPPORT_SPL bool @@ -6,6 +6,9 @@ config SUPPORT_SPL config SUPPORT_TPL bool +config SUPPORT_VPL + bool + config SPL_DFU_NO_RESET bool @@ -302,6 +305,16 @@ config SPL_READ_ONLY writeable memory) of anything it wants to modify, such as device-private data. +config TPL_SEPARATE_BSS + bool "BSS section is in a different memory region from text" + default y if SPL_SEPARATE_BSS + help + Some platforms need a large BSS region in TPL and can provide this + because RAM is already set up. In this case BSS can be moved to RAM. + This option should then be enabled so that the correct device tree + location is used. Normally we put the device tree at the end of BSS + but with this option enabled, it goes at _image_binary_end. + config SPL_BANNER_PRINT bool "Enable output of the SPL banner 'U-Boot SPL ...'" default y diff --git a/common/spl/spl.c b/common/spl/spl.c index c9750ee1637..c8c463f80bd 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -61,6 +61,11 @@ binman_sym_declare(ulong, u_boot_spl, image_pos); binman_sym_declare(ulong, u_boot_spl, size); #endif +#ifdef CONFIG_VPL +binman_sym_declare(ulong, u_boot_vpl, image_pos); +binman_sym_declare(ulong, u_boot_vpl, size); +#endif + /* Define board data structure */ static struct bd_info bdata __attribute__ ((section(".data"))); @@ -146,14 +151,22 @@ void spl_fixup_fdt(void *fdt_blob) #if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) ulong spl_get_image_pos(void) { - return spl_phase() == PHASE_TPL ? +#ifdef CONFIG_VPL + if (spl_next_phase() == PHASE_VPL) + return binman_sym(ulong, u_boot_vpl, image_pos); +#endif + return spl_next_phase() == PHASE_SPL ? binman_sym(ulong, u_boot_spl, image_pos) : binman_sym(ulong, u_boot_any, image_pos); } ulong spl_get_image_size(void) { - return spl_phase() == PHASE_TPL ? +#ifdef CONFIG_VPL + if (spl_next_phase() == PHASE_VPL) + return binman_sym(ulong, u_boot_vpl, size); +#endif + return spl_next_phase() == PHASE_SPL ? binman_sym(ulong, u_boot_spl, size) : binman_sym(ulong, u_boot_any, size); } @@ -161,7 +174,11 @@ ulong spl_get_image_size(void) ulong spl_get_image_text_base(void) { - return spl_phase() == PHASE_TPL ? CONFIG_SPL_TEXT_BASE : +#ifdef CONFIG_VPL + if (spl_next_phase() == PHASE_VPL) + return CONFIG_VPL_TEXT_BASE; +#endif + return spl_next_phase() == PHASE_SPL ? CONFIG_SPL_TEXT_BASE : CONFIG_SYS_TEXT_BASE; } @@ -466,6 +483,8 @@ static enum bootstage_id get_bootstage_id(bool start) if (IS_ENABLED(CONFIG_TPL_BUILD) && phase == PHASE_TPL) return start ? BOOTSTAGE_ID_START_TPL : BOOTSTAGE_ID_END_TPL; + else if (IS_ENABLED(CONFIG_VPL_BUILD) && phase == PHASE_VPL) + return start ? BOOTSTAGE_ID_START_VPL : BOOTSTAGE_ID_END_VPL; else return start ? BOOTSTAGE_ID_START_SPL : BOOTSTAGE_ID_END_SPL; } |