[PATCH 7/7] rockchip: mkimage: Add rk3576 align and sd-card workaround
Alexey Charkov
alchark at flipper.net
Mon Jul 13 12:02:48 CEST 2026
From: Jonas Karlman <jonas at kwiboo.se>
The BootROM on RK3576 has an issue loading boot images from an SD-card.
This issue can be worked around by injecting an initial boot image
before TPL that:
writel(0x3ffff800, 0x3ff803b0)
Prepend an image containing binary code that does this and return to
BootROM to load next image, TPL.
Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
[switch from pre-built binary to from-source build via existing Makefiles,
add commentary on what the magic write does based on JTAG debugging of
the boot process]
Signed-off-by: Alexey Charkov <alchark at flipper.net>
---
arch/arm/mach-rockchip/rk3576/Makefile | 10 +++++++++
arch/arm/mach-rockchip/rk3576/rk3576-boost.c | 31 ++++++++++++++++++++++++++++
tools/rkcommon.c | 22 +++++++++++++++++++-
3 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-rockchip/rk3576/Makefile b/arch/arm/mach-rockchip/rk3576/Makefile
index cbc58257deba..464def20c17f 100644
--- a/arch/arm/mach-rockchip/rk3576/Makefile
+++ b/arch/arm/mach-rockchip/rk3576/Makefile
@@ -7,3 +7,13 @@
obj-y += rk3576.o
obj-y += clk_rk3576.o
obj-y += syscon_rk3576.o
+
+# BootROM "boost" stub: a freestanding bit of AArch64 code that pokes a fix-up
+# value into SRAM so the ROM can boot from SD/eMMC. mkimage prepends it to the
+# init image, so it must exist in the build dir.
+quiet_cmd_rk3576boost = BOOST $@
+ cmd_rk3576boost = $(CC) -nostdlib -ffreestanding -Os -c -o $@.o $< && \
+ $(OBJCOPY) -O binary -j .text $@.o $@
+$(obj)/rk3576-boost.bin: $(src)/rk3576-boost.c FORCE
+ $(call if_changed,rk3576boost)
+always-y += rk3576-boost.bin
diff --git a/arch/arm/mach-rockchip/rk3576/rk3576-boost.c b/arch/arm/mach-rockchip/rk3576/rk3576-boost.c
new file mode 100644
index 000000000000..abccf4cb1b9e
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3576/rk3576-boost.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+// Copyright Contributors to the U-Boot project.
+
+/*
+ * Early initialization code to be executed before RAM training on RK3576.
+ * At the moment this only contains a BootROM fixup for booting from an SD card
+ *
+ * Anything in this file is to be compiled into a freestanding raw executable
+ * binary and prepended to the RKNS image by mkimage during build
+ */
+
+#include <stdint.h>
+
+#define SYS_SRAM_BASE 0x3ff80000
+#define OFFSET 0x03b0
+
+int _start(void)
+{
+ uint32_t *sram = (void *)(SYS_SRAM_BASE + OFFSET);
+
+ /*
+ * Relocate the SDMMC IDMAC DMA descriptor buffer to the (unused) top
+ * of SRAM instead of the boot ROM default at 0x3ff80160, which sits
+ * inside the ROM's global state area. This prevents large multi-page
+ * SDMMC reads from overrunning adjacent ROM state and breaking the
+ * boot process
+ */
+ *(sram) = 0x3ffff800;
+
+ return 0;
+}
diff --git a/tools/rkcommon.c b/tools/rkcommon.c
index 81361cde4823..b4654beb659d 100644
--- a/tools/rkcommon.c
+++ b/tools/rkcommon.c
@@ -158,7 +158,7 @@ static struct spl_info spl_infos[] = {
{ "rk3506", "RK35", 0xC000 - 0x1000, false, RK_HEADER_V2 },
{ "rk3528", "RK35", 0x10000 - 0x1000, false, RK_HEADER_V2 },
{ "rk3568", "RK35", 0x10000 - 0x1000, false, RK_HEADER_V2 },
- { "rk3576", "RK35", 0x80000 - 0x1000, false, RK_HEADER_V2 },
+ { "rk3576", "RK35", 0x80000 - 0x1000, false, RK_HEADER_V2, 8 },
{ "rk3588", "RK35", 0x100000 - 0x1000, false, RK_HEADER_V2 },
{ "rv1108", "RK11", 0x1800, false, RK_HEADER_V1 },
{ "rv1126", "110B", 0x10000 - 0x1000, false, RK_HEADER_V1 },
@@ -288,6 +288,26 @@ int rkcommon_check_params(struct image_tool_params *params)
return EXIT_FAILURE;
}
+ if (!strcmp(params->imagename, "rk3576")) {
+ char *boost = "arch/arm/mach-rockchip/rk3576/rk3576-boost.bin";
+
+ size = rkcommon_get_aligned_filesize(params, boost);
+ if (size < 0) {
+ fprintf(stderr,
+ "Error: rk3576-boost.bin is required but missing\n");
+ return EXIT_FAILURE;
+ }
+
+ for (i = ARRAY_SIZE(spl_params.images) - 1; i > 0; i--)
+ spl_params.images[i] = spl_params.images[i - 1];
+
+ spl_params.images[0].file = boost;
+ spl_params.images[0].size = size;
+
+ spl_params.images[0].address = 0x3ffc0000;
+ spl_params.images[1].address = 0x3ff81000;
+ }
+
return EXIT_SUCCESS;
err_spl_info:
--
2.53.0
More information about the U-Boot
mailing list