Add support for moving from TPL->VPL->SPL so that the VPL build can fit
properly into the boot flow.

Use #ifdefs to avoid creating unwanted symbols which Binman would then
try (and perhaps fail) to provide.

Add debugging to indicate the next phase.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 common/spl/spl.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/common/spl/spl.c b/common/spl/spl.c
index 7cfbab06419..6b75910e243 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -50,8 +50,10 @@ u32 *boot_params_ptr = NULL;
 
 #if CONFIG_IS_ENABLED(BINMAN_UBOOT_SYMBOLS)
 /* See spl.h for information about this */
+#if defined(CONFIG_SPL_BUILD)
 binman_sym_declare(ulong, u_boot_any, image_pos);
 binman_sym_declare(ulong, u_boot_any, size);
+#endif
 
 #ifdef CONFIG_TPL
 binman_sym_declare(ulong, u_boot_spl_any, image_pos);
@@ -179,9 +181,15 @@ ulong spl_get_image_pos(void)
        if (xpl_next_phase() == PHASE_VPL)
                return binman_sym(ulong, u_boot_vpl_any, image_pos);
 #endif
-       return xpl_next_phase() == PHASE_SPL ?
-               binman_sym(ulong, u_boot_spl_any, image_pos) :
-               binman_sym(ulong, u_boot_any, image_pos);
+#if defined(CONFIG_TPL) && !defined(CONFIG_VPL)
+       if (xpl_next_phase() == PHASE_SPL)
+               return binman_sym(ulong, u_boot_spl_any, image_pos);
+#endif
+#if defined(CONFIG_SPL_BUILD)
+       return binman_sym(ulong, u_boot_any, image_pos);
+#endif
+
+       return BINMAN_SYM_MISSING;
 }
 
 ulong spl_get_image_size(void)
@@ -263,14 +271,20 @@ void spl_set_header_raw_uboot(struct spl_image_info 
*spl_image)
         */
        if (u_boot_pos && u_boot_pos != BINMAN_SYM_MISSING) {
                /* Binman does not support separated entry addresses */
-               spl_image->entry_point = u_boot_pos;
-               spl_image->load_addr = u_boot_pos;
+               spl_image->entry_point = spl_get_image_text_base();
+               spl_image->load_addr = spl_get_image_text_base();
+               spl_image->size = spl_get_image_size();
+               log_debug("Next load addr %lx\n", spl_image->load_addr);
        } else {
                spl_image->entry_point = CONFIG_SYS_UBOOT_START;
                spl_image->load_addr = CONFIG_TEXT_BASE;
+               log_debug("Default load addr %x (u_boot_pos=%lx)\n",
+                         CONFIG_TEXT_BASE, u_boot_pos);
        }
        spl_image->os = IH_OS_U_BOOT;
-       spl_image->name = "U-Boot";
+       spl_image->name = xpl_name(xpl_next_phase());
+       log_debug("Next phase: %s at %lx size %lx\n", spl_image->name,
+                 spl_image->load_addr, (ulong)spl_image->size);
 }
 
 __weak int spl_parse_board_header(struct spl_image_info *spl_image,
-- 
2.43.0

Reply via email to