summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <[email protected]>2025-01-15 18:27:20 -0700
committerTom Rini <[email protected]>2025-01-22 09:47:50 -0600
commitca055155f4179e92caae47ff21ee858884b47b21 (patch)
treeed50e57837732ba83c300ed8e8d0befbc61a9a9f
parent20ad3fa0e1af3982ddfe824aae1b8221c1f1fa0c (diff)
spl: Plumb in the relocating loader
This is fairly easy to use. The SPL loader sets up some fields in the spl_image_info struct and calls spl_reloc_prepare(). When SPL is ready to do the jump it must call spl_reloc_jump() instead of jump_to_image(). Add this logic. Signed-off-by: Simon Glass <[email protected]>
-rw-r--r--common/spl/spl.c12
-rw-r--r--include/spl.h1
2 files changed, 13 insertions, 0 deletions
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 09e6dc26f5e..7cfbab06419 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -826,6 +826,18 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
}
spl_board_prepare_for_boot();
+
+ if (CONFIG_IS_ENABLED(RELOC_LOADER)) {
+ int ret;
+
+ ret = spl_reloc_jump(&spl_image, jump_to_image);
+ if (ret) {
+ if (xpl_phase() == PHASE_VPL)
+ printf("jump failed %d\n", ret);
+ hang();
+ }
+ }
+
jump_to_image(&spl_image);
}
diff --git a/include/spl.h b/include/spl.h
index 9cfba98db55..7155e9c67aa 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -414,6 +414,7 @@ static inline void spl_load_init(struct spl_load_info *load,
load->read = h_read;
load->priv = priv;
spl_set_bl_len(load, bl_len);
+ xpl_set_phase(load, IH_PHASE_NONE);
}
/*