[PATCH v4 0/5] rpi: Tidy up booting

This series allows rpi to boot a compressed Ubuntu kernel with ~100MB ramdisk, by expanding the available space.
It also tidies up some strange behaviour with the provided FDT, where a separate pointer is maintained to it, even though U-Boot has copied it and placed it in its own space. This avoids strange bugs where it accidentally gets overwritten when loading a file into memory.
The patch to expand the devicetree was dropped, meaning that people should be careful to unset fdt_addr in the environment.
In version 2, it incorporates some changes to fdt_addr, etc. suggested by Tom, as well as adding myself as a maintainer.
Changes in v4: - Expand the comment on set_fdt_addr() - Update the commit message to talk in terms of my testing
Changes in v3: - Add to the existing comment block - Update the comment block with the new values, including compression
Changes in v2: - Add new patch to make myself an rpi maintainer - Add new patch to set bootm_size - Add new patch to drop fdt_high and initrd_high - Drop patch to allow expanding the devicetree during relocation
Simon Glass (5): rpi: Add myself to the list of maintainers rpi: Set bootm_size to 512MB rpi: Drop fdt_high and initrd_high rpi: Update environment to support booti and large initrd rpi: Use the U-Boot control FDT for fdt_addr
MAINTAINERS | 1 + board/raspberrypi/rpi/rpi.c | 20 +++++++++---------- board/raspberrypi/rpi/rpi.env | 37 +++++++++++++++++++---------------- 3 files changed, 31 insertions(+), 27 deletions(-)

Add my own name to the list, since existing maintainers are fairly busy.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v2)
Changes in v2: - Add new patch to make myself an rpi maintainer
MAINTAINERS | 1 + 1 file changed, 1 insertion(+)
diff --git a/MAINTAINERS b/MAINTAINERS index ba31f86feb6..8db1e605fc7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -210,6 +210,7 @@ N: aspeed ARM BROADCOM BCM283X / BCM27XX M: Matthias Brugger mbrugger@suse.com M: Peter Robinson pbrobinson@gmail.com +M: Simon Glass sjg@chromium.org S: Maintained F: arch/arm/dts/bcm283* F: arch/arm/mach-bcm283x/

Set this option so that all boot images stay within the bottom 512MB of memory. This should allow us to drop the fdt_high and initrd_high options.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Tom Rini trini@konsulko.com Suggested-by: Tom Rini trini@konsulko.com ---
(no changes since v3)
Changes in v3: - Add to the existing comment block
Changes in v2: - Add new patch to set bootm_size
board/raspberrypi/rpi/rpi.env | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/board/raspberrypi/rpi/rpi.env b/board/raspberrypi/rpi/rpi.env index 30228285edd..a327fccc77f 100644 --- a/board/raspberrypi/rpi/rpi.env +++ b/board/raspberrypi/rpi/rpi.env @@ -60,7 +60,12 @@ dfu_alt_info+=zImage fat 0 1 * Even with the smallest possible CPU-GPU memory split of the CPU getting * only 64M, the remaining 25M starting at 0x02700000 should allow quite * large initrds before they start colliding with U-Boot. + * + * Limit bootm_size to 512MB so that all boot images stay within the bottom + * 512MB of memory */ +bootm_size=0x20000000 + #ifdef CONFIG_ARM64 fdt_high=ffffffffffffffff initrd_high=ffffffffffffffff

These are not needed now since there is a bootm_size setting to keep things within the lower part of memory.
Drop them.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Tom Rini trini@konsulko.com Suggested-by: Tom Rini trini@konsulko.com ---
(no changes since v2)
Changes in v2: - Add new patch to drop fdt_high and initrd_high
board/raspberrypi/rpi/rpi.env | 7 ------- 1 file changed, 7 deletions(-)
diff --git a/board/raspberrypi/rpi/rpi.env b/board/raspberrypi/rpi/rpi.env index a327fccc77f..9b9fad82828 100644 --- a/board/raspberrypi/rpi/rpi.env +++ b/board/raspberrypi/rpi/rpi.env @@ -66,13 +66,6 @@ dfu_alt_info+=zImage fat 0 1 */ bootm_size=0x20000000
-#ifdef CONFIG_ARM64 -fdt_high=ffffffffffffffff -initrd_high=ffffffffffffffff -#else -fdt_high=ffffffff -initrd_high=ffffffff -#endif kernel_addr_r=0x00080000 scriptaddr=0x02400000 pxefile_addr_r=0x02500000

The existing values don't provide for decompressing an arm64 boot-image. Add those values and move things apart a bit so that a 50MB kernel can be accommodated.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v3)
Changes in v3: - Update the comment block with the new values, including compression
board/raspberrypi/rpi/rpi.env | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/board/raspberrypi/rpi/rpi.env b/board/raspberrypi/rpi/rpi.env index 9b9fad82828..9ac9d6768ca 100644 --- a/board/raspberrypi/rpi/rpi.env +++ b/board/raspberrypi/rpi/rpi.env @@ -48,28 +48,33 @@ dfu_alt_info+=zImage fat 0 1 * * scriptaddr and pxefile_addr_r can be pretty much anywhere that doesn't * conflict with something else. Reserving 1M for each of them at - * 0x02400000-0x02500000 and 0x02500000-0x02600000 should be plenty. + * 0x05400000-0x05500000 and 0x05500000-0x05600000 should be plenty. * * On ARM, both the DTB and any possible initrd must be loaded such that they * fit inside the lowmem mapping in Linux. In practice, this usually means not * more than ~700M away from the start of the kernel image but this number can * be larger OR smaller depending on e.g. the 'vmalloc=xxxM' command line * parameter given to the kernel. So reserving memory from low to high - * satisfies this constraint again. Reserving 1M at 0x02600000-0x02700000 for - * the DTB leaves rest of the free RAM to the initrd starting at 0x02700000. - * Even with the smallest possible CPU-GPU memory split of the CPU getting - * only 64M, the remaining 25M starting at 0x02700000 should allow quite - * large initrds before they start colliding with U-Boot. + * satisfies this constraint again. Reserving 1M at 0x05600000-0x05700000 for + * the DTB leaves rest of the free RAM to the initrd starting at 0x05700000. + * This means that the board must have at least 128MB of RAM available to + * U-Boot, more if the initrd is large. * - * Limit bootm_size to 512MB so that all boot images stay within the bottom + * For compressed kernels, the maximum size is just under 32MB, with an area for + * decompression at 0x02000000 with space for 52MB, which is plenty for current + * kernels. + * + * limit bootm_size to 512MB so that all boot images stay within the bottom * 512MB of memory */ bootm_size=0x20000000
kernel_addr_r=0x00080000 -scriptaddr=0x02400000 -pxefile_addr_r=0x02500000 -fdt_addr_r=0x02600000 -ramdisk_addr_r=0x02700000 +kernel_comp_addr_r=0x02000000 +kernel_comp_size=0x03400000 +scriptaddr=0x05400000 +pxefile_addr_r=0x05500000 +fdt_addr_r=0x05600000 +ramdisk_addr_r=0x05700000
boot_targets=mmc usb pxe dhcp

The fdt_addr variable is used in extlinux as a fallback devicetree if none is provided by the boot command. Otherwise the only use in U-Boot seems to me efi_install_fdt() when the internal FDT is required.
The existing mechanism uses the devicetree provided to U-Boot, but in its original, unrelocated position. In my testing on an rpi_4, this ends up at 2b35ef00 which is not a convenient place in memory, if the ramdisk is large.
U-Boot already deals with this sort of problem by relocating the FDT to a safe address.
So use the control-FDT address instead.
Remove the existing comment, which is confusing, since the FDT is not actually passed unmodified to the kernel: U-Boot adds various things using its FDT-fixup mechanism.
Note that board_get_usable_ram_top() reduces the RAM top for boards with less RAM. This behaviour is left unchanged as there is no other mechanism for U-Boot to handle this.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v4: - Expand the comment on set_fdt_addr() - Update the commit message to talk in terms of my testing
Changes in v2: - Drop patch to allow expanding the devicetree during relocation
board/raspberrypi/rpi/rpi.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c index c46fe4b2350..f74006e0968 100644 --- a/board/raspberrypi/rpi/rpi.c +++ b/board/raspberrypi/rpi/rpi.c @@ -3,6 +3,8 @@ * (C) Copyright 2012-2016 Stephen Warren */
+#define LOG_CATEGORY LOGC_BOARD + #include <config.h> #include <dm.h> #include <env.h> @@ -326,18 +328,13 @@ static void set_fdtfile(void) }
/* - * If the firmware provided a valid FDT at boot time, let's expose it in - * ${fdt_addr} so it may be passed unmodified to the kernel. + * Allow U-Boot to use its control FDT with extlinux if one is not provided. + * This will then go through the usual fixups that U-Boot does, before being + * handed off to Linux */ static void set_fdt_addr(void) { - if (env_get("fdt_addr")) - return; - - if (fdt_magic(fw_dtb_pointer) != FDT_MAGIC) - return; - - env_set_hex("fdt_addr", fw_dtb_pointer); + env_set_hex("fdt_addr", (ulong)gd->fdt_blob); }
/* @@ -571,7 +568,10 @@ int ft_board_setup(void *blob, struct bd_info *bd) { int node;
- update_fdt_from_fw(blob, (void *)fw_dtb_pointer); + if (blob == gd->fdt_blob) + log_debug("Same FDT: nothing to do\n"); + else + update_fdt_from_fw(blob, (void *)gd->fdt_blob);
node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); if (node < 0)

Hi,
On Thu, 19 Dec 2024 at 17:34, Simon Glass sjg@chromium.org wrote:
This series allows rpi to boot a compressed Ubuntu kernel with ~100MB ramdisk, by expanding the available space.
It also tidies up some strange behaviour with the provided FDT, where a separate pointer is maintained to it, even though U-Boot has copied it and placed it in its own space. This avoids strange bugs where it accidentally gets overwritten when loading a file into memory.
The patch to expand the devicetree was dropped, meaning that people should be careful to unset fdt_addr in the environment.
In version 2, it incorporates some changes to fdt_addr, etc. suggested by Tom, as well as adding myself as a maintainer.
Changes in v4:
- Expand the comment on set_fdt_addr()
- Update the commit message to talk in terms of my testing
Changes in v3:
- Add to the existing comment block
- Update the comment block with the new values, including compression
Changes in v2:
- Add new patch to make myself an rpi maintainer
- Add new patch to set bootm_size
- Add new patch to drop fdt_high and initrd_high
- Drop patch to allow expanding the devicetree during relocation
Simon Glass (5): rpi: Add myself to the list of maintainers rpi: Set bootm_size to 512MB rpi: Drop fdt_high and initrd_high rpi: Update environment to support booti and large initrd rpi: Use the U-Boot control FDT for fdt_addr
MAINTAINERS | 1 + board/raspberrypi/rpi/rpi.c | 20 +++++++++---------- board/raspberrypi/rpi/rpi.env | 37 +++++++++++++++++++---------------- 3 files changed, 31 insertions(+), 27 deletions(-)
-- 2.34.1
Are there any comments on this series, or can it be applied?
Regards, Simon
participants (1)
-
Simon Glass