All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] sunxi: SPL FIT support for 32-bit sunxi SoCs
@ 2021-10-13  2:30 Samuel Holland
  2021-10-13  2:30 ` [PATCH 1/3] Kconfig: Remove an impossible condition Samuel Holland
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Samuel Holland @ 2021-10-13  2:30 UTC (permalink / raw)
  To: u-boot, Jagan Teki, Andre Przywara, Simon Glass
  Cc: Samuel Holland, Masahiro Yamada

This series makes the necessary changes so 32-bit sunxi SoCs can load
additional device trees or firmware from SPL along with U-Boot proper.

There was no existing binman entry property that put the FIT at the
right offset. The minimum offset is 32k, but this matches neither the
SPL size (which is no more than 24k on some SoCs) nor the FIT alignment
(which is 512 bytes in practice due to SPL size constraints). So instead
of adding a new property, I fixed what is arguably a bug in the offset
property -- though this strategy will not work if someone is
intentionally creating overlapping entries.


Samuel Holland (3):
  Kconfig: Remove an impossible condition
  binman: Prevent entries in a section from overlapping
  sunxi: binman: Enable SPL FIT loading for 32-bit SoCs

 Kconfig                        |  2 +-
 arch/arm/Kconfig               |  1 +
 arch/arm/dts/sunxi-u-boot.dtsi | 46 ++++++++++++++++++++++------------
 common/spl/Kconfig             |  3 +--
 tools/binman/entry.py          |  4 ++-
 5 files changed, 36 insertions(+), 20 deletions(-)

-- 
2.32.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] Kconfig: Remove an impossible condition
  2021-10-13  2:30 [PATCH 0/3] sunxi: SPL FIT support for 32-bit sunxi SoCs Samuel Holland
@ 2021-10-13  2:30 ` Samuel Holland
  2021-10-13  2:30 ` [PATCH 2/3] binman: Prevent entries in a section from overlapping Samuel Holland
  2021-10-13  2:30 ` [PATCH 3/3] sunxi: binman: Enable SPL FIT loading for 32-bit SoCs Samuel Holland
  2 siblings, 0 replies; 5+ messages in thread
From: Samuel Holland @ 2021-10-13  2:30 UTC (permalink / raw)
  To: u-boot, Jagan Teki, Andre Przywara, Simon Glass
  Cc: Samuel Holland, Masahiro Yamada

ARCH_SUNXI selects BINMAN, so the condition "!BINMAN && ARCH_SUNXI"
is impossible to satisfy.

Signed-off-by: Samuel Holland <samuel@sholland.org>
---

 Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Kconfig b/Kconfig
index 931a22806e..ede20d74c9 100644
--- a/Kconfig
+++ b/Kconfig
@@ -359,7 +359,7 @@ config BUILD_TARGET
 	default "u-boot-spl.kwb" if ARCH_MVEBU && SPL
 	default "u-boot-elf.srec" if RCAR_GEN3
 	default "u-boot.itb" if !BINMAN && SPL_LOAD_FIT && (ARCH_ROCKCHIP || \
-				ARCH_SUNXI || RISCV || ARCH_ZYNQMP)
+				RISCV || ARCH_ZYNQMP)
 	default "u-boot.kwb" if ARCH_KIRKWOOD
 	default "u-boot-with-spl.bin" if ARCH_AT91 && SPL_NAND_SUPPORT
 	default "u-boot-with-spl.imx" if ARCH_MX6 && SPL
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] binman: Prevent entries in a section from overlapping
  2021-10-13  2:30 [PATCH 0/3] sunxi: SPL FIT support for 32-bit sunxi SoCs Samuel Holland
  2021-10-13  2:30 ` [PATCH 1/3] Kconfig: Remove an impossible condition Samuel Holland
@ 2021-10-13  2:30 ` Samuel Holland
  2021-10-13 18:06   ` Simon Glass
  2021-10-13  2:30 ` [PATCH 3/3] sunxi: binman: Enable SPL FIT loading for 32-bit SoCs Samuel Holland
  2 siblings, 1 reply; 5+ messages in thread
From: Samuel Holland @ 2021-10-13  2:30 UTC (permalink / raw)
  To: u-boot, Jagan Teki, Andre Przywara, Simon Glass
  Cc: Samuel Holland, Masahiro Yamada

Currently, if the "offset" property is given for an entry, the section's
running offset is completely ignored. This causes entries to overlap if
the provided offset is less than the size of the entries earlier in the
section. Avoid the overlap by only using the provided offset when it is
greater than the running offset.

The motivation for this change is the rule used by SPL to find U-Boot on
sunxi boards: U-Boot starts 32 KiB after the start of SPL, unless SPL is
larger than 32 KiB, in which case U-Boot immediately follows SPL.

Signed-off-by: Samuel Holland <samuel@sholland.org>
---

 tools/binman/entry.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/binman/entry.py b/tools/binman/entry.py
index 70222718ea..61822eb5e4 100644
--- a/tools/binman/entry.py
+++ b/tools/binman/entry.py
@@ -404,7 +404,9 @@ class Entry(object):
             if self.offset_unset:
                 self.Raise('No offset set with offset-unset: should another '
                            'entry provide this correct offset?')
-            self.offset = tools.Align(offset, self.align)
+        elif self.offset > offset:
+            offset = self.offset
+        self.offset = tools.Align(offset, self.align)
         needed = self.pad_before + self.contents_size + self.pad_after
         needed = tools.Align(needed, self.align_size)
         size = self.size
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] sunxi: binman: Enable SPL FIT loading for 32-bit SoCs
  2021-10-13  2:30 [PATCH 0/3] sunxi: SPL FIT support for 32-bit sunxi SoCs Samuel Holland
  2021-10-13  2:30 ` [PATCH 1/3] Kconfig: Remove an impossible condition Samuel Holland
  2021-10-13  2:30 ` [PATCH 2/3] binman: Prevent entries in a section from overlapping Samuel Holland
@ 2021-10-13  2:30 ` Samuel Holland
  2 siblings, 0 replies; 5+ messages in thread
From: Samuel Holland @ 2021-10-13  2:30 UTC (permalink / raw)
  To: u-boot, Jagan Teki, Andre Przywara, Simon Glass
  Cc: Samuel Holland, Masahiro Yamada

Now that Crust (SCP firmware) has support for H3, we need a FIT image to
load it. H3 also needs to load a SoC-specific eGon blob to support CPU 0
hotplug. Let's first enable FIT support before adding extra firmware.

Update the binman description to work on either 32-bit or 64-bit SoCs:
 - Make BL31 optional, since it is not used on 32-bit SoCs (though BL32
   may be used in the future).
 - Explicitly set the minimum offset of the FIT to 32 KiB, since SPL on
   some boards is still only 24 KiB large even with FIT support enabled.
   CONFIG_SPL_PAD_TO cannot be used because it is not defined for H616.

FIT unlocks more features (signatures, multiple DTBs, etc.), so enable
it by default. A10 (sun4i) only has 24 KiB of SRAM A1, so it needs
SPL_FIT_IMAGE_TINY. For simplicity, enable that option everywhere.

Signed-off-by: Samuel Holland <samuel@sholland.org>
---

 arch/arm/Kconfig               |  1 +
 arch/arm/dts/sunxi-u-boot.dtsi | 46 ++++++++++++++++++++++------------
 common/spl/Kconfig             |  3 +--
 3 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index d8c041a877..f80f237f7e 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1062,6 +1062,7 @@ config ARCH_SUNXI
 	imply SPL_GPIO
 	imply SPL_LIBCOMMON_SUPPORT
 	imply SPL_LIBGENERIC_SUPPORT
+	imply SPL_LOAD_FIT
 	imply SPL_MMC if MMC
 	imply SPL_POWER
 	imply SPL_SERIAL
diff --git a/arch/arm/dts/sunxi-u-boot.dtsi b/arch/arm/dts/sunxi-u-boot.dtsi
index 4a6ed3a7dd..ad1f976329 100644
--- a/arch/arm/dts/sunxi-u-boot.dtsi
+++ b/arch/arm/dts/sunxi-u-boot.dtsi
@@ -1,13 +1,19 @@
 #include <config.h>
 
-#ifdef CONFIG_MACH_SUN50I_H6
-#define BL31_ADDR 0x104000
-#define  SCP_ADDR 0x114000
-#elif defined(CONFIG_MACH_SUN50I_H616)
-#define BL31_ADDR 0x40000000
+#ifdef CONFIG_ARM64
+#define ARCH "arm64"
 #else
-#define BL31_ADDR  0x44000
-#define  SCP_ADDR  0x50000
+#define ARCH "arm"
+#endif
+
+#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H5)
+#define BL31_ADDR	0x00044000
+#define SCP_ADDR	0x00050000
+#elif defined(CONFIG_MACH_SUN50I_H6)
+#define BL31_ADDR	0x00104000
+#define SCP_ADDR	0x00114000
+#elif defined(CONFIG_MACH_SUN50I_H616)
+#define BL31_ADDR	0x40000000
 #endif
 
 / {
@@ -30,30 +36,33 @@
 			filename = "spl/sunxi-spl.bin";
 		};
 
-#ifdef CONFIG_ARM64
+#ifdef CONFIG_SPL_LOAD_FIT
 		fit {
-			description = "Configuration to load ATF before U-Boot";
+			description = "Configuration to load U-Boot and firmware";
+			offset = <32768>;
 			#address-cells = <1>;
 			fit,fdt-list = "of-list";
 
 			images {
 				uboot {
-					description = "U-Boot (64-bit)";
+					description = "U-Boot";
 					type = "standalone";
 					os = "u-boot";
-					arch = "arm64";
+					arch = ARCH;
 					compression = "none";
 					load = <CONFIG_SYS_TEXT_BASE>;
+					entry = <CONFIG_SYS_TEXT_BASE>;
 
 					u-boot-nodtb {
 					};
 				};
 
+#ifdef BL31_ADDR
 				atf {
 					description = "ARM Trusted Firmware";
 					type = "firmware";
 					os = "arm-trusted-firmware";
-					arch = "arm64";
+					arch = ARCH;
 					compression = "none";
 					load = <BL31_ADDR>;
 					entry = <BL31_ADDR>;
@@ -63,6 +72,7 @@
 						missing-msg = "atf-bl31-sunxi";
 					};
 				};
+#endif
 
 #ifdef SCP_ADDR
 				scp {
@@ -91,19 +101,23 @@
 
 				@config-SEQ {
 					description = "NAME";
+#ifdef BL31_ADDR
 					firmware = "atf";
-#ifndef SCP_ADDR
-					loadables = "uboot";
 #else
-					loadables = "scp", "uboot";
+					firmware = "uboot";
+#endif
+					loadables =
+#ifdef SCP_ADDR
+						    "scp",
 #endif
+						    "uboot";
 					fdt = "fdt-SEQ";
 				};
 			};
 		};
 #else
 		u-boot-img {
-			offset = <CONFIG_SPL_PAD_TO>;
+			offset = <32768>;
 		};
 #endif
 	};
diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 17ce2f6b61..cad8125c4b 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -443,8 +443,7 @@ config SPL_MD5
 config SPL_FIT_IMAGE_TINY
 	bool "Remove functionality from SPL FIT loading to reduce size"
 	depends on SPL_FIT
-	default y if MACH_SUN50I || MACH_SUN50I_H5 || SUN50I_GEN_H6
-	default y if ARCH_IMX8M
+	default y if ARCH_IMX8M || ARCH_SUNXI
 	help
 	  Enable this to reduce the size of the FIT image loading code
 	  in SPL, if space for the SPL binary is very tight.
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/3] binman: Prevent entries in a section from overlapping
  2021-10-13  2:30 ` [PATCH 2/3] binman: Prevent entries in a section from overlapping Samuel Holland
@ 2021-10-13 18:06   ` Simon Glass
  0 siblings, 0 replies; 5+ messages in thread
From: Simon Glass @ 2021-10-13 18:06 UTC (permalink / raw)
  To: Samuel Holland
  Cc: U-Boot Mailing List, Jagan Teki, Andre Przywara, Masahiro Yamada

Hi Samuel,

On Tue, 12 Oct 2021 at 20:30, Samuel Holland <samuel@sholland.org> wrote:
>
> Currently, if the "offset" property is given for an entry, the section's
> running offset is completely ignored. This causes entries to overlap if
> the provided offset is less than the size of the entries earlier in the
> section. Avoid the overlap by only using the provided offset when it is
> greater than the running offset.
>
> The motivation for this change is the rule used by SPL to find U-Boot on
> sunxi boards: U-Boot starts 32 KiB after the start of SPL, unless SPL is
> larger than 32 KiB, in which case U-Boot immediately follows SPL.
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
> ---
>
>  tools/binman/entry.py | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/tools/binman/entry.py b/tools/binman/entry.py
> index 70222718ea..61822eb5e4 100644
> --- a/tools/binman/entry.py
> +++ b/tools/binman/entry.py
> @@ -404,7 +404,9 @@ class Entry(object):
>              if self.offset_unset:
>                  self.Raise('No offset set with offset-unset: should another '
>                             'entry provide this correct offset?')
> -            self.offset = tools.Align(offset, self.align)
> +        elif self.offset > offset:
> +            offset = self.offset
> +        self.offset = tools.Align(offset, self.align)
>          needed = self.pad_before + self.contents_size + self.pad_after
>          needed = tools.Align(needed, self.align_size)
>          size = self.size
> --
> 2.32.0
>

The behaviour needs to be deterministic, here. You have two cases, as
I understand it

- you want the offset to be set to the running offset, if the previous
section is >=32KB
- you want the offset to be set to the 'offset' property otherwise

I see a few options:

- Add a new 'sunxi-spl-pad' etype between SPL and U-Boot for the
padding. It can decide its own size
- Add a new 'min-size' property to entries, update the packer, use it
in the SPL node, set to 32KB

There are probably others. No need to worry about it if you are just
putting out ideas, but we do need a test for any new behaivour:

binman test -T

needs to pass with 100% code coverage.

Regards,
Simon

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-10-13 18:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-13  2:30 [PATCH 0/3] sunxi: SPL FIT support for 32-bit sunxi SoCs Samuel Holland
2021-10-13  2:30 ` [PATCH 1/3] Kconfig: Remove an impossible condition Samuel Holland
2021-10-13  2:30 ` [PATCH 2/3] binman: Prevent entries in a section from overlapping Samuel Holland
2021-10-13 18:06   ` Simon Glass
2021-10-13  2:30 ` [PATCH 3/3] sunxi: binman: Enable SPL FIT loading for 32-bit SoCs Samuel Holland

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.