diff mbox series

[1/2] spl: riscv: Disable SPL_BINMAN_UBOOT_SYMBOLS by default

Message ID 20250407033744.4025-2-ziyao@disroot.org
State Changes Requested
Delegated to: Andes
Headers show
Series Fix binman_sym functionality on RISC-V port | expand

Commit Message

Yao Zi April 7, 2025, 3:37 a.m. UTC
The default binman configuration of RISC-V wraps proper U-Boot into a
FIT image instead of shipping a plain image, thus there's no
"u_boot_any" entry by default. Let's disable the option to prevent
binman from looking for a plain proper U-Boot image, failing the build
with message like

  Section '/binman/spl-img': Symbol '_binman_u_boot_any_prop_size'
     in entry '/binman/spl-img/mkimage/u-boot-spl/u-boot-spl-nodtb':
       Entry 'u-boot-any' not found in list (u-boot-spl-nodtb,
       u-boot-spl-dtb,u-boot-spl,mkimage,spl-img)

Signed-off-by: Yao Zi <ziyao@disroot.org>
---
 common/spl/Kconfig | 2 ++
 1 file changed, 2 insertions(+)

Comments

Simon Glass April 7, 2025, 10:50 a.m. UTC | #1
Hi Yao,

On Mon, 7 Apr 2025 at 15:38, Yao Zi <ziyao@disroot.org> wrote:
>
> The default binman configuration of RISC-V wraps proper U-Boot into a
> FIT image instead of shipping a plain image, thus there's no
> "u_boot_any" entry by default. Let's disable the option to prevent
> binman from looking for a plain proper U-Boot image, failing the build
> with message like
>
>   Section '/binman/spl-img': Symbol '_binman_u_boot_any_prop_size'
>      in entry '/binman/spl-img/mkimage/u-boot-spl/u-boot-spl-nodtb':
>        Entry 'u-boot-any' not found in list (u-boot-spl-nodtb,
>        u-boot-spl-dtb,u-boot-spl,mkimage,spl-img)

Do you know where the symbol is being referenced? This sounds like a bug to me.

It is likely to be spl_get_image_pos(), perhaps called from
spl_set_header_raw_uboot().

If you are using FIT that function should not be called.

>
> Signed-off-by: Yao Zi <ziyao@disroot.org>
> ---
>  common/spl/Kconfig | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> index 7d6780936d1..356ddab38de 100644
> --- a/common/spl/Kconfig
> +++ b/common/spl/Kconfig
> @@ -214,6 +214,8 @@ config SPL_BINMAN_UBOOT_SYMBOLS
>         bool "Declare binman symbols for U-Boot phases in SPL"
>         depends on SPL_BINMAN_SYMBOLS
>         default n if ARCH_IMX8M || ARCH_IMX8ULP || ARCH_IMX9
> +       # A FIT image is created with default binman configuration of RISC-V
> +       default n if RISCV
>         default y
>         help
>           This enables use of symbols in SPL which refer to U-Boot phases,
> --
> 2.49.0
>

Regards,
Simon
Jonas Karlman April 7, 2025, 11:22 a.m. UTC | #2
Hi,

On 2025-04-07 05:37, Yao Zi wrote:
> The default binman configuration of RISC-V wraps proper U-Boot into a
> FIT image instead of shipping a plain image, thus there's no
> "u_boot_any" entry by default. Let's disable the option to prevent
> binman from looking for a plain proper U-Boot image, failing the build
> with message like
> 
>   Section '/binman/spl-img': Symbol '_binman_u_boot_any_prop_size'
>      in entry '/binman/spl-img/mkimage/u-boot-spl/u-boot-spl-nodtb':
>        Entry 'u-boot-any' not found in list (u-boot-spl-nodtb,
>        u-boot-spl-dtb,u-boot-spl,mkimage,spl-img)
> 
> Signed-off-by: Yao Zi <ziyao@disroot.org>
> ---
>  common/spl/Kconfig | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> index 7d6780936d1..356ddab38de 100644
> --- a/common/spl/Kconfig
> +++ b/common/spl/Kconfig
> @@ -214,6 +214,8 @@ config SPL_BINMAN_UBOOT_SYMBOLS
>  	bool "Declare binman symbols for U-Boot phases in SPL"
>  	depends on SPL_BINMAN_SYMBOLS
>  	default n if ARCH_IMX8M || ARCH_IMX8ULP || ARCH_IMX9
> +	# A FIT image is created with default binman configuration of RISC-V

Use of a FIT does not really matter, Rockchip use a FIT for U-Boot
proper and symbols can be located.

> +	default n if RISCV
>  	default y
>  	help
>  	  This enables use of symbols in SPL which refer to U-Boot phases,

Maybe something like this is what you instead want to use:

diff --git a/arch/riscv/dts/binman.dtsi b/arch/riscv/dts/binman.dtsi
index ceb916b74a73..e1a5ad573bbe 100644
--- a/arch/riscv/dts/binman.dtsi
+++ b/arch/riscv/dts/binman.dtsi
@@ -30,20 +30,19 @@
 				uboot {
 					description = "U-Boot";
 					type = "standalone";
-					os = "U-Boot";
+					os = "u-boot";
 					arch = "riscv";
 					compression = "none";
 					load = /bits/ 64 <CONFIG_TEXT_BASE>;
 
-					uboot_blob: blob-ext {
-						filename = "u-boot-nodtb.bin";
+					uboot_blob: u-boot-nodtb {
 					};
 				};
 #else
 				linux {
 					description = "Linux";
 					type = "standalone";
-					os = "Linux";
+					os = "linux";
 					arch = "riscv";
 					compression = "none";
 					load = /bits/ 64 <CONFIG_TEXT_BASE>;
diff --git a/arch/riscv/dts/starfive-visionfive2-binman.dtsi b/arch/riscv/dts/starfive-visionfive2-binman.dtsi
index 05787bdb92db..6e083bf0537a 100644
--- a/arch/riscv/dts/starfive-visionfive2-binman.dtsi
+++ b/arch/riscv/dts/starfive-visionfive2-binman.dtsi
@@ -20,6 +20,7 @@
 			args = "-T sfspl";
 
 			u-boot-spl {
+				no-write-symbols;
 			};
 		};
 	};

Regards,
Jonas
Yao Zi April 8, 2025, 4:21 p.m. UTC | #3
On Mon, Apr 07, 2025 at 10:50:07PM +1200, Simon Glass wrote:
> Hi Yao,
> 
> On Mon, 7 Apr 2025 at 15:38, Yao Zi <ziyao@disroot.org> wrote:
> >
> > The default binman configuration of RISC-V wraps proper U-Boot into a
> > FIT image instead of shipping a plain image, thus there's no
> > "u_boot_any" entry by default. Let's disable the option to prevent
> > binman from looking for a plain proper U-Boot image, failing the build
> > with message like
> >
> >   Section '/binman/spl-img': Symbol '_binman_u_boot_any_prop_size'
> >      in entry '/binman/spl-img/mkimage/u-boot-spl/u-boot-spl-nodtb':
> >        Entry 'u-boot-any' not found in list (u-boot-spl-nodtb,
> >        u-boot-spl-dtb,u-boot-spl,mkimage,spl-img)
> 
> Do you know where the symbol is being referenced? This sounds like a bug to me.
> 
> It is likely to be spl_get_image_pos(), perhaps called from
> spl_set_header_raw_uboot().

The symbol is referenced in common/spl/spl.c:54,

	#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

> If you are using FIT that function should not be called.

The place where binman_sym() is used isn't where an entry in .binman_sym
section is introduced. Instead, binman_sym_declare() actually defines
the entry.

So whether spl_get_image_pos() is invoked doesn't affect the failure,
since in both cases binman_sym_declare() puts an entry into .binman_sym,
confusing binman.

imho SPL_BINMAN_UBOOT_SYMBOLS should depend on !SPL_LOAD_FIT in an ideal
world, but I'm not sure the impact on current codebase thus limited the
change to RISC-V only.

Best regards,
Yao Zi

> >
> > Signed-off-by: Yao Zi <ziyao@disroot.org>
> > ---
> >  common/spl/Kconfig | 2 ++
> >  1 file changed, 2 insertions(+)
> >
> > diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> > index 7d6780936d1..356ddab38de 100644
> > --- a/common/spl/Kconfig
> > +++ b/common/spl/Kconfig
> > @@ -214,6 +214,8 @@ config SPL_BINMAN_UBOOT_SYMBOLS
> >         bool "Declare binman symbols for U-Boot phases in SPL"
> >         depends on SPL_BINMAN_SYMBOLS
> >         default n if ARCH_IMX8M || ARCH_IMX8ULP || ARCH_IMX9
> > +       # A FIT image is created with default binman configuration of RISC-V
> > +       default n if RISCV
> >         default y
> >         help
> >           This enables use of symbols in SPL which refer to U-Boot phases,
> > --
> > 2.49.0
> >
> 
> Regards,
> Simon
Yao Zi April 9, 2025, 4:27 a.m. UTC | #4
On Mon, Apr 07, 2025 at 01:22:37PM +0200, Jonas Karlman wrote:
> Hi,
> 
> On 2025-04-07 05:37, Yao Zi wrote:
> > The default binman configuration of RISC-V wraps proper U-Boot into a
> > FIT image instead of shipping a plain image, thus there's no
> > "u_boot_any" entry by default. Let's disable the option to prevent
> > binman from looking for a plain proper U-Boot image, failing the build
> > with message like
> > 
> >   Section '/binman/spl-img': Symbol '_binman_u_boot_any_prop_size'
> >      in entry '/binman/spl-img/mkimage/u-boot-spl/u-boot-spl-nodtb':
> >        Entry 'u-boot-any' not found in list (u-boot-spl-nodtb,
> >        u-boot-spl-dtb,u-boot-spl,mkimage,spl-img)
> > 
> > Signed-off-by: Yao Zi <ziyao@disroot.org>
> > ---
> >  common/spl/Kconfig | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> > index 7d6780936d1..356ddab38de 100644
> > --- a/common/spl/Kconfig
> > +++ b/common/spl/Kconfig
> > @@ -214,6 +214,8 @@ config SPL_BINMAN_UBOOT_SYMBOLS
> >  	bool "Declare binman symbols for U-Boot phases in SPL"
> >  	depends on SPL_BINMAN_SYMBOLS
> >  	default n if ARCH_IMX8M || ARCH_IMX8ULP || ARCH_IMX9
> > +	# A FIT image is created with default binman configuration of RISC-V
> 
> Use of a FIT does not really matter, Rockchip use a FIT for U-Boot
> proper and symbols can be located.

You're right. binman is able to match a U-Boot blob in FIT image as long
as its entry name is correct. We should replace blob-ext with
u-boot-nodtb here.

> 
> > +	default n if RISCV
> >  	default y
> >  	help
> >  	  This enables use of symbols in SPL which refer to U-Boot phases,
> 
> Maybe something like this is what you instead want to use:
> 
> diff --git a/arch/riscv/dts/binman.dtsi b/arch/riscv/dts/binman.dtsi
> index ceb916b74a73..e1a5ad573bbe 100644
> --- a/arch/riscv/dts/binman.dtsi
> +++ b/arch/riscv/dts/binman.dtsi
> @@ -30,20 +30,19 @@
>  				uboot {
>  					description = "U-Boot";
>  					type = "standalone";
> -					os = "U-Boot";
> +					os = "u-boot";
>  					arch = "riscv";
>  					compression = "none";
>  					load = /bits/ 64 <CONFIG_TEXT_BASE>;
>  
> -					uboot_blob: blob-ext {
> -						filename = "u-boot-nodtb.bin";
> +					uboot_blob: u-boot-nodtb {

I think the change to uboot_blob node is enough to fix the binman
issue, right?

The value of property "os" is probably wrong since spl_fit.c compares it
to "u-boot" case-sensitively to look for a U-Boot image. But this should
go in another patch IMHO.

>  					};
>  				};
>  #else
>  				linux {
>  					description = "Linux";
>  					type = "standalone";
> -					os = "Linux";
> +					os = "linux";
>  					arch = "riscv";
>  					compression = "none";
>  					load = /bits/ 64 <CONFIG_TEXT_BASE>;
> 
> diff --git a/arch/riscv/dts/starfive-visionfive2-binman.dtsi b/arch/riscv/dts/starfive-visionfive2-binman.dtsi
> index 05787bdb92db..6e083bf0537a 100644
> --- a/arch/riscv/dts/starfive-visionfive2-binman.dtsi
> +++ b/arch/riscv/dts/starfive-visionfive2-binman.dtsi
> @@ -20,6 +20,7 @@
>  			args = "-T sfspl";
>  
>  			u-boot-spl {
> +				no-write-symbols;
>  			};
>  		};
>  	};
> 

At the very first sight I wrongly thought "no-write-symbols" would
prevent binman to function and should be avoided. But visionfive2's case
seems actually special as its spl and proper U-Boot are split into
different images, where binman cannot help much.

I've applied the fix of uboot_blob node to my WIP branch of TH1520 SPL
support and verified it does fix the binman error. Thanks for your hint
and review! I'll include the fix and drop this patch in v2.

> Regards,
> Jonas

Thanks,
Yao Zi
diff mbox series

Patch

diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 7d6780936d1..356ddab38de 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -214,6 +214,8 @@  config SPL_BINMAN_UBOOT_SYMBOLS
 	bool "Declare binman symbols for U-Boot phases in SPL"
 	depends on SPL_BINMAN_SYMBOLS
 	default n if ARCH_IMX8M || ARCH_IMX8ULP || ARCH_IMX9
+	# A FIT image is created with default binman configuration of RISC-V
+	default n if RISCV
 	default y
 	help
 	  This enables use of symbols in SPL which refer to U-Boot phases,