A previous commit introduced the use of binman in the SPL.

After the binman_sym call over the 'pos' symbol, the output value is
checked against BINMAN_SYM_MISSING (-1UL). According to the
documentation (tools/binman/README), when it comes to the 'pos'

        This sets the position of an entry within the image. The first
        byte of the image is normally at position 0. If 'pos' is not
        provided, binman sets it to the end of the previous region, or
        the start of the image's entry area (normally 0) if there is no
        previous region.

So instead of checking if the return value is BINMAN_SYM_MISSING, we
should check if the value is not null.

The failure happens when using both files sunxi-spl(-with-ecc).bin and
u-boot-dtb.bin instead of u-boot-sunxi-with-spl.bin. This is because
u-boot-dtb.bin does not have the U-Boot header while it is present in
u-boot-sunwi-with-spl.bin. Not having the header forces the SPL to
discover where it should load U-Boot. The binman_sym call is supposed to
do that but fails. Because of the wrong check, the destination address
was set to 0 while it should have been somewhere in RAM. This,
obviously, stalls the board.

Fixes: 8bee2d251afb ("binman: Add binman symbol support to SPL")
Signed-off-by: Miquel Raynal <miquel.ray...@bootlin.com>
 common/spl/spl.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/common/spl/spl.c b/common/spl/spl.c
index b1ce56d0d0..cc0aa26452 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -127,8 +127,14 @@ void spl_set_header_raw_uboot(struct spl_image_info 
        ulong u_boot_pos = binman_sym(ulong, u_boot_any, pos);
        spl_image->size = CONFIG_SYS_MONITOR_LEN;
-       if (u_boot_pos != BINMAN_SYM_MISSING) {
-               /* biman does not support separate entry addresses at present */
+       /*
+        * Binman error cases: address of the end of the previous region or the
+        * start of the image's entry area (usually 0) if there is no previous
+        * region.
+        */
+       if (u_boot_pos) {
+               /* Binman does not support separate entry addresses */
                spl_image->entry_point = u_boot_pos;
                spl_image->load_addr = u_boot_pos;
        } else {

U-Boot mailing list

Reply via email to