Skip to contentSkip to conversation

sunxi: Fix boot of Cubietruk and al.

PATCH Superseded Maxime Ripard 4 participants 10 messages Oct 19, 2017 – Nov 6, 2017

Subsystems (2)

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

v2 cover sunxi: Fix boot of Cubietruk and al.

Hi

Most featureful boards, such as the Cubietruck, have been broken since the release 2017.09 (the two variants of the Olinuxino-Lime2 and the cubietruck at least, possibly more since then).

This is due to a size increase of the binary that will trip us across the size we've been using in our default configuration since forever, and widely distributed through the u-boot-sunxi-with-spl.bin file.

We would have several ways to work around it. The first one would be to just increase the offset of the environment. However, since it would break all the environments of our users and possibly the custom partition scheme that they would have created, it doesn't really seem like a smart move.

The second one would be to move the environment to a filesystem file, which would also break all the existing users. This can be envisionned as a long term fix though.

Another one would be to start trimming down a bit our enabled options in order to reduce the size and to gain some extra space for users customisations. However, this will always result in pointless and endless discussions, so let's move away from that.

The final one that has been implemented would be to just build U-Boot using thumb2 to push back the issue until hopefully I'm no longer maintainer or the switch to the env filesystem would have been done.

I've also added a patch to make sure that the compilation breaks and that we can notice.

Maxime

Maxime Ripard (2):
sunxi: binman: Add U-Boot binary size check
sunxi: Enable THUMB build for the U-Boot binary

 arch/arm/Kconfig               |  1 +
 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 2 files changed, 12 insertions(+)
Signature · 1 line
2.14.2
#1 lore raw

PATCH v2 1/2 sunxi: binman: Add U-Boot binary size check

The U-boot binary may trip over its actual allocated size in the storage. In such a case, the environment will not be readable anymore (because corrupted when the new image was flashed), and any attempt at using saveenv to reconstruct the environment will result in a corrupted U-boot binary.

---
 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 1 file changed, 11 insertions(+)
arch/arm/dts/sunxi-u-boot.dtsi +11 -0
index 5adfd9bca2ec..b44660e8d37e 100644
@@ -1,5 +1,13 @@
 #include <config.h>
 
+/*
+ * This is the maximum size the U-boot binary can be, which is
+ * basically the start of the environment, minus the (padded) size of
+ * the SPL), minus the offset at which the generated file is supposed
+ * to be flashed in the MMC.
+ */
+#define UBOOT_MAX_SIZE	(CONFIG_ENV_OFFSET - CONFIG_SPL_PAD_TO - (8 << 10))
+
 / {
 	binman {
 		filename = "u-boot-sunxi-with-spl.bin";
@@ -8,6 +16,9 @@
 			filename = "spl/sunxi-spl.bin";
 		};
 		u-boot-img {
+#ifdef CONFIG_MMC
+			size = <UBOOT_MAX_SIZE>;
+#endif
 			pos = <CONFIG_SPL_PAD_TO>;
 		};
 	};
Signature · 1 line
2.14.2
#2 lore raw

PATCH 1/2 sunxi: binman: Add U-Boot binary size check

Quoted 5 lines · Maxime Ripard

The U-boot binary may trip over its actual allocated size in the storage. In such a case, the environment will not be readable anymore (because corrupted when the new image was flashed), and any attempt at using saveenv to reconstruct the environment will result in a corrupted U-boot binary.

nits: U-boot -> U-Boot

Please fix this globally in this commit.

Quoted 24 lines
---
 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 1 file changed, 11 insertions(+)
arch/arm/dts/sunxi-u-boot.dtsi +8 -0
index 5adfd9bca2ec..b44660e8d37e 100644
@@ -1,5 +1,13 @@
 #include <config.h>
 
+/*
+ * This is the maximum size the U-boot binary can be, which is
+ * basically the start of the environment, minus the (padded) size of
+ * the SPL), minus the offset at which the generated file is supposed
+ * to be flashed in the MMC.
+ */
+#define UBOOT_MAX_SIZE (CONFIG_ENV_OFFSET - CONFIG_SPL_PAD_TO - (8 << 10))
+
 / {
        binman {
                filename = "u-boot-sunxi-with-spl.bin";

arch/arm/dts/sunxi-u-boot.dtsi

Quoted 10 lines
arch/arm/dts/sunxi-u-boot.dtsi +3 -1
@@ -8,6 +16,9 @@
                        filename = "spl/sunxi-spl.bin";
                };
                u-boot-img {
+#ifdef CONFIG_MMC
+                       size = <UBOOT_MAX_SIZE>;
+#endif
                        pos = <CONFIG_SPL_PAD_TO>;
                };
        };
--

Regards,
Bin

#3 lore raw

PATCH v2 1/2 sunxi: binman: Add U-Boot binary size check

In reply to Maxime Ripard

Hi,

Quoted 4 lines · Maxime Ripard

The U-boot binary may trip over its actual allocated size in the storage. In such a case, the environment will not be readable anymore (because corrupted when the new image was flashed), and any attempt at using saveenv to reconstruct the environment will result in a corrupted U-boot binary.

Merci beaucoup for that v2 series!

Quoted 10 lines
---
 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 1 file changed, 11 insertions(+)
arch/arm/dts/sunxi-u-boot.dtsi +0 -0
index 5adfd9bca2ec..b44660e8d37e 100644

arch/arm/dts/sunxi-u-boot.dtsi line 9

Quoted 9 lines
arch/arm/dts/sunxi-u-boot.dtsi +7 -0
@@ -1,5 +1,13 @@
 #include <config.h>
 
+/*
+ * This is the maximum size the U-boot binary can be, which is
+ * basically the start of the environment, minus the (padded) size of
+ * the SPL), minus the offset at which the generated file is supposed
+ * to be flashed in the MMC.
+ */
+#define UBOOT_MAX_SIZE	(CONFIG_ENV_OFFSET - CONFIG_SPL_PAD_TO - (8 << 10))

Just bikeshedding: Can't we use:

	(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR << 9)

for the last two expressions?

But that's just a nit, so:

Cheers,
Andre.

Quoted 15 lines
arch/arm/dts/sunxi-u-boot.dtsi +4 -0
+
 / {
 	binman {
 		filename = "u-boot-sunxi-with-spl.bin";
@@ -8,6 +16,9 @@
 			filename = "spl/sunxi-spl.bin";
 		};
 		u-boot-img {
+#ifdef CONFIG_MMC
+			size = <UBOOT_MAX_SIZE>;
+#endif
 			pos = <CONFIG_SPL_PAD_TO>;
 		};
 	};
#4 lore raw

PATCH 1/2 sunxi: binman: Add U-Boot binary size check

In reply to Maxime Ripard

Am Donnerstag, 19. Oktober 2017, 16:04:18 CET schrieb Maxime Ripard:

Quoted 9 lines

The U-boot binary may trip over its actual allocated size in the storage. In such a case, the environment will not be readable anymore (because corrupted when the new image was flashed), and any attempt at using saveenv to reconstruct the environment will result in a corrupted U-boot binary.

---
 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 1 file changed, 11 insertions(+)

Hello,

I found that this patch causes the sunxi-fel tool to fail with:

sunxi-fel uboot u-boot-sunxi-with-spl.bin
U-Boot image data size mismatch: expected 516032, got 389212

Is there a patch for the sunxi tools missing?

Br,
Frank

#5 lore raw

PATCH v2 1/2 sunxi: binman: Add U-Boot binary size check

Hi Frank,

Quoted 11 lines · Frank Kunz

Am Donnerstag, 19. Oktober 2017, 16:04:18 CET schrieb Maxime Ripard:

Quoted 9 lines

The U-boot binary may trip over its actual allocated size in the storage. In such a case, the environment will not be readable anymore (because corrupted when the new image was flashed), and any attempt at using saveenv to reconstruct the environment will result in a corrupted U-boot binary.

---
 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 1 file changed, 11 insertions(+)
Quoted 6 lines

I found that this patch causes the sunxi-fel tool to fail with:

sunxi-fel uboot u-boot-sunxi-with-spl.bin
U-Boot image data size mismatch: expected 516032, got 389212

Is there a patch for the sunxi tools missing?

No, because no one reported it so far.

Can you test with:
http://code.bulix.org/mb0ic7-221765?raw

You'll need the zlib development files installed.

Maxime

Signature · 10 lines
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20171103/ecdda46c/attachment.sig>
#6 lore raw

PATCH 1/2 sunxi: binman: Add U-Boot binary size check

Am Freitag, 3. November 2017, 09:42:44 CET schrieb Maxime Ripard:

Quoted 22 lines

Hi Frank,

Quoted 19 lines · Frank Kunz

Am Donnerstag, 19. Oktober 2017, 16:04:18 CET schrieb Maxime Ripard:

Quoted 7 lines

The U-boot binary may trip over its actual allocated size in the storage.
In such a case, the environment will not be readable anymore (because corrupted when the new image was flashed), and any attempt at using saveenv
to reconstruct the environment will result in a corrupted U-boot binary.

Quoted 5 lines

---

 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 1 file changed, 11 insertions(+)

I found that this patch causes the sunxi-fel tool to fail with:

sunxi-fel uboot u-boot-sunxi-with-spl.bin
U-Boot image data size mismatch: expected 516032, got 389212

Quoted 7 lines
Quoted 1 line

Is there a patch for the sunxi tools missing?

No, because no one reported it so far.

Can you test with:
http://code.bulix.org/mb0ic7-221765?raw

That works.

#7 lore raw

PATCH v2 1/2 sunxi: binman: Add U-Boot binary size check

Quoted 27 lines · Frank Kunz

Am Freitag, 3. November 2017, 09:42:44 CET schrieb Maxime Ripard:

Quoted 26 lines

Hi Frank,

Quoted 14 lines · Frank Kunz

Am Donnerstag, 19. Oktober 2017, 16:04:18 CET schrieb Maxime Ripard:

Quoted 7 lines

The U-boot binary may trip over its actual allocated size in the storage.
In such a case, the environment will not be readable anymore (because corrupted when the new image was flashed), and any attempt at using saveenv
to reconstruct the environment will result in a corrupted U-boot binary.

Quoted 5 lines

---

 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 1 file changed, 11 insertions(+)
Quoted 6 lines

I found that this patch causes the sunxi-fel tool to fail with:

sunxi-fel uboot u-boot-sunxi-with-spl.bin
U-Boot image data size mismatch: expected 516032, got 389212

Is there a patch for the sunxi tools missing?

No, because no one reported it so far.

Quoted 7 lines
Quoted 3 lines

Can you test with:
http://code.bulix.org/mb0ic7-221765?raw

That works.

I created a pull request for sunxi-tools to fix the issue. Thanks for the test, and sorry for the bug.

Maxime

Signature · 10 lines
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20171106/c7466c1b/attachment.sig>
#8 lore raw

PATCH v2 2/2 sunxi: Enable THUMB build for the U-Boot binary

In reply to Maxime Ripard

We start to get to the limit of our main U-Boot binary size (with some boards even crossing it). Enable its build using thumb2 to get some extra room.

---
 arch/arm/Kconfig | 1 +
 1 file changed, 1 insertion(+)
arch/arm/Kconfig +1 -0
index 64e0ee43f112..83b7aa51dc2c 100644
@@ -698,6 +698,7 @@ config ARCH_SUNXI
 	select SPL_SYS_MALLOC_SIMPLE if SPL
 	select SYS_NS16550
 	select SPL_SYS_THUMB_BUILD if !ARM64
+	select SYS_THUMB_BUILD if !ARM64
 	select USB if DISTRO_DEFAULTS
 	select USB_STORAGE if DISTRO_DEFAULTS
 	select USB_KEYBOARD if DISTRO_DEFAULTS
Signature · 1 line
2.14.2
#9 lore raw

v2 cover sunxi: Fix boot of Cubietruk and al.

In reply to Maxime Ripard

Hi Maxime,

On 19/10/17 15:04, Maxime Ripard wrote:

....

Quoted 6 lines

The final one that has been implemented would be to just build U-Boot using thumb2 to push back the issue until hopefully I'm no longer maintainer or the switch to the env filesystem would have been done.

I've also added a patch to make sure that the compilation breaks and that we can notice.

Can you please swap the patches? So that we get the fix before we break the build? This looks better in bisecting and buildman.

Cheers,
Andre.

Quoted 12 lines

Maxime

Maxime Ripard (2):
sunxi: binman: Add U-Boot binary size check
sunxi: Enable THUMB build for the U-Boot binary

 arch/arm/Kconfig               |  1 +
 arch/arm/dts/sunxi-u-boot.dtsi | 11 +++++++++++
 2 files changed, 12 insertions(+)