mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/3] Rockchip: early boot time optimization
@ 2026-10-01  7:42 Sascha Hauer
  2026-10-01  7:42 ` [PATCH 1/3] ARM: rockchip: move to the load address with the MMU enabled Sascha Hauer
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Sascha Hauer @ 2026-10-01  7:42 UTC (permalink / raw)
  To: BAREBOX

On Rockchip boards the ROM loads the barebox binary to the start of DRAM where
later the TF-A is placed, so the first thing all 64bit Rockchip boards do is
to move away from that location. This is done with MMU disabled, so takes some
time. Instead of letting each board repeat this pattern, do the move in atf.c
at a place common for all Rockchip boards and turn on the MMU beforehand.

Also, both TF-A and OP-TEE hold the device tree passed to them in uncached memory,
so accessing it is slow. calling fdt_pack() on the device tree before passing
it squeezes the unused bytes out of the device tree and thus speed up TF-A
and OP-TEE by a few 100ms.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
Sascha Hauer (3):
      ARM: rockchip: move to the load address with the MMU enabled
      ARM: rockchip: boards: leave moving to the load address to atf.c
      ARM: rockchip: pack the device tree passed to TF-A and OP-TEE

 arch/arm/boards/pine64-pinetab2/lowlevel.c         | 10 +----
 arch/arm/boards/pine64-quartz64/lowlevel.c         |  5 +--
 arch/arm/boards/protonic-prtpuk/lowlevel.c         |  5 +--
 arch/arm/boards/protonic-rk356x/lowlevel.c         |  5 +--
 arch/arm/boards/qnap-tsx33/lowlevel.c              | 18 +--------
 arch/arm/boards/radxa-cm3/lowlevel.c               |  5 +--
 arch/arm/boards/radxa-rock3/lowlevel.c             |  5 +--
 arch/arm/boards/radxa-rock5/lowlevel.c             | 10 +----
 arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c    |  5 +--
 .../boards/rockchip-rk3562-kickpi-k3/lowlevel.c    |  5 +--
 .../boards/rockchip-rk3568-bpi-r2pro/lowlevel.c    |  5 +--
 arch/arm/boards/rockchip-rk3568-evb/lowlevel.c     |  5 +--
 arch/arm/boards/wolfvision-pf5/lowlevel.c          |  9 +----
 arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c |  5 +--
 arch/arm/mach-rockchip/atf.c                       | 47 +++++++++++++++++++---
 15 files changed, 58 insertions(+), 86 deletions(-)
---
base-commit: 4aa5dcd400d5b9cecfd24e68c6f05cd128c75c43
change-id: 20261001-rockchip-early-boottime-b981093bde02

Best regards,
-- 
Sascha Hauer <s.hauer@pengutronix.de>




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

* [PATCH 1/3] ARM: rockchip: move to the load address with the MMU enabled
  2026-10-01  7:42 [PATCH 0/3] Rockchip: early boot time optimization Sascha Hauer
@ 2026-10-01  7:42 ` Sascha Hauer
  2026-10-01  7:42 ` [PATCH 2/3] ARM: rockchip: boards: leave moving to the load address to atf.c Sascha Hauer
  2026-10-01  7:42 ` [PATCH 3/3] ARM: rockchip: pack the device tree passed to TF-A and OP-TEE Sascha Hauer
  2 siblings, 0 replies; 6+ messages in thread
From: Sascha Hauer @ 2026-10-01  7:42 UTC (permalink / raw)
  To: BAREBOX

The BootROM starts barebox at the beginning of DRAM, where TF-A and
OP-TEE are loaded to later. The board entry functions therefore copy
the whole image to the load address with relocate_to_adr_full() first
thing. At that point the MMU is off, so every access is uncached and
strictly ordered. On an RK3588 moving the 1.4 MB image takes 674 ms.

Add rockchip_move_to_load_address() and call it from the SoC entry
functions instead: it enables the MMU, maps the rest of the image
cacheable and copies it to the load address, then restarts the image
from there. On the second pass the image already runs at the load
address and the function returns right away. The move itself now takes
a few milliseconds, and loading TF-A and preparing its device tree
also profit from the MMU being on early.

The SoC lowlevel init clears SCTLR_EL3.M and C, so only call it while
the MMU is still off, i.e. on the first pass.

Boards still calling relocate_to_adr_full() already run at the load
address and are unaffected. They are converted in the next commit.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/arm/mach-rockchip/atf.c | 38 ++++++++++++++++++++++++++++++++++----
 1 file changed, 34 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-rockchip/atf.c b/arch/arm/mach-rockchip/atf.c
index 0b4566f8ae..e1ca197430 100644
--- a/arch/arm/mach-rockchip/atf.c
+++ b/arch/arm/mach-rockchip/atf.c
@@ -8,6 +8,7 @@
 #include <asm/atf_common.h>
 #include <asm/barebox-arm.h>
 #include <asm/mmu.h>
+#include <asm/cache.h>
 #include <asm-generic/memory_layout.h>
 #include <asm-generic/sections.h>
 #include <mach/rockchip/dmc.h>
@@ -131,6 +132,27 @@ static uintptr_t rk_load_optee(uintptr_t bl32, struct fwobj *bl32_fw)
 static phys_addr_t membase[ROCKCHIP_MAX_DRAM_RESOURCES];
 static resource_size_t memsize[ROCKCHIP_MAX_DRAM_RESOURCES];
 static int n_mem_resources;
+
+/*
+ * The BootROM starts us at the beginning of DRAM, where TF-A and OP-TEE go.
+ * Copy ourselves to @load_address with the MMU enabled and restart there.
+ * The SoC lowlevel init clears SCTLR_EL3.M, so it must run before this.
+ */
+static void rockchip_move_to_load_address(ulong load_address)
+{
+	void (*restart)(void) = (void *)load_address;
+
+	if ((ulong)__image_start == load_address)
+		return;
+
+	mmu_early_enable(membase[0], memsize[0]);
+	memcpy((void *)load_address, __image_start, barebox_image_size);
+	sync_caches_for_execution();
+
+	restart();
+	__builtin_unreachable();
+}
+
 static uintptr_t barebox_load_address; /* where barebox is loaded and started */
 static uintptr_t optee_load_address; /* standard SoC specific OP-TEE load address */
 static struct fwobj bl31; /* TF-A in barebox image */
@@ -202,7 +224,9 @@ void __noreturn rk3562_barebox_entry(void *fdt)
 	rk_scratch = (void *)arm_mem_scratch(memend);
 
 	if (current_el() == 3) {
-		rk3562_lowlevel_init();
+		if (!(get_cr() & CR_M))
+			rk3562_lowlevel_init();
+		rockchip_move_to_load_address(RK3562_BAREBOX_LOAD_ADDRESS);
 		rockchip_store_bootrom_iram(IOMEM(RK3562_IRAM_BASE));
 		ROCKCHIP_GET_ADDRESSES(RK3562, rk3562_bl31_bin, rk3562_bl32_bin);
 
@@ -236,7 +260,9 @@ void __noreturn rk3568_barebox_entry(void *fdt)
 	rk_scratch = (void *)arm_mem_scratch(memend);
 
 	if (current_el() == 3) {
-		rk3568_lowlevel_init();
+		if (!(get_cr() & CR_M))
+			rk3568_lowlevel_init();
+		rockchip_move_to_load_address(RK3568_BAREBOX_LOAD_ADDRESS);
 		rockchip_store_bootrom_iram(IOMEM(RK3568_IRAM_BASE));
 		ROCKCHIP_GET_ADDRESSES(RK3568, rk3568_bl31_bin, rk3568_bl32_bin);
 
@@ -273,7 +299,9 @@ void __noreturn rk3588_barebox_entry(void *fdt)
 	if (current_el() == 3) {
 		void *fdt_bl31 = NULL;
 
-		rk3588_lowlevel_init();
+		if (!(get_cr() & CR_M))
+			rk3588_lowlevel_init();
+		rockchip_move_to_load_address(RK3588_BAREBOX_LOAD_ADDRESS);
 		rockchip_store_bootrom_iram(IOMEM(RK3588_IRAM_BASE));
 		ROCKCHIP_GET_ADDRESSES(RK3588, rk3588_bl31_bin, rk3588_bl32_bin);
 
@@ -308,7 +336,9 @@ void __noreturn rk3576_barebox_entry(void *fdt)
 	if (current_el() == 3) {
 		void *fdt_scratch = NULL;
 
-		rk3576_lowlevel_init();
+		if (!(get_cr() & CR_M))
+			rk3576_lowlevel_init();
+		rockchip_move_to_load_address(RK3576_BAREBOX_LOAD_ADDRESS);
 		rockchip_store_bootrom_iram(IOMEM(RK3576_IRAM_BASE));
 		ROCKCHIP_GET_ADDRESSES(RK3576, rk3576_bl31_bin, rk3576_bl32_bin);
 

-- 
2.47.3




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

* [PATCH 2/3] ARM: rockchip: boards: leave moving to the load address to atf.c
  2026-10-01  7:42 [PATCH 0/3] Rockchip: early boot time optimization Sascha Hauer
  2026-10-01  7:42 ` [PATCH 1/3] ARM: rockchip: move to the load address with the MMU enabled Sascha Hauer
@ 2026-10-01  7:42 ` Sascha Hauer
  2026-10-01  8:30   ` Ahmad Fatoum
  2026-10-01  7:42 ` [PATCH 3/3] ARM: rockchip: pack the device tree passed to TF-A and OP-TEE Sascha Hauer
  2 siblings, 1 reply; 6+ messages in thread
From: Sascha Hauer @ 2026-10-01  7:42 UTC (permalink / raw)
  To: BAREBOX

The SoC entry functions now move barebox to the load address themselves,
with the MMU enabled. Stop doing it upfront with relocate_to_adr_full(),
which copies the image with the MMU off, and just relocate in place.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/arm/boards/pine64-pinetab2/lowlevel.c           | 10 ++--------
 arch/arm/boards/pine64-quartz64/lowlevel.c           |  5 +----
 arch/arm/boards/protonic-prtpuk/lowlevel.c           |  5 +----
 arch/arm/boards/protonic-rk356x/lowlevel.c           |  5 +----
 arch/arm/boards/qnap-tsx33/lowlevel.c                | 18 ++----------------
 arch/arm/boards/radxa-cm3/lowlevel.c                 |  5 +----
 arch/arm/boards/radxa-rock3/lowlevel.c               |  5 +----
 arch/arm/boards/radxa-rock5/lowlevel.c               | 10 ++--------
 arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c      |  5 +----
 arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c |  5 +----
 arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c |  5 +----
 arch/arm/boards/rockchip-rk3568-evb/lowlevel.c       |  5 +----
 arch/arm/boards/wolfvision-pf5/lowlevel.c            |  9 +--------
 arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c   |  5 +----
 14 files changed, 17 insertions(+), 80 deletions(-)

diff --git a/arch/arm/boards/pine64-pinetab2/lowlevel.c b/arch/arm/boards/pine64-pinetab2/lowlevel.c
index 73ca6866f0..63286bf630 100644
--- a/arch/arm/boards/pine64-pinetab2/lowlevel.c
+++ b/arch/arm/boards/pine64-pinetab2/lowlevel.c
@@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_pinetab2_v0, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
@@ -26,10 +23,7 @@ ENTRY_FUNCTION(start_pinetab2_v2, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/pine64-quartz64/lowlevel.c b/arch/arm/boards/pine64-quartz64/lowlevel.c
index 7723d47860..6a1169d24a 100644
--- a/arch/arm/boards/pine64-quartz64/lowlevel.c
+++ b/arch/arm/boards/pine64-quartz64/lowlevel.c
@@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_quartz64a, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/protonic-prtpuk/lowlevel.c b/arch/arm/boards/protonic-prtpuk/lowlevel.c
index 08de527bf6..df1588d343 100644
--- a/arch/arm/boards/protonic-prtpuk/lowlevel.c
+++ b/arch/arm/boards/protonic-prtpuk/lowlevel.c
@@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_prtpuk, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3576_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/protonic-rk356x/lowlevel.c b/arch/arm/boards/protonic-rk356x/lowlevel.c
index 830d708b6e..1959881951 100644
--- a/arch/arm/boards/protonic-rk356x/lowlevel.c
+++ b/arch/arm/boards/protonic-rk356x/lowlevel.c
@@ -22,10 +22,7 @@ ENTRY_FUNCTION(start_mecsbc, r0, r1, r2)
 
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/qnap-tsx33/lowlevel.c b/arch/arm/boards/qnap-tsx33/lowlevel.c
index c5458937d1..88e94471d2 100644
--- a/arch/arm/boards/qnap-tsx33/lowlevel.c
+++ b/arch/arm/boards/qnap-tsx33/lowlevel.c
@@ -13,14 +13,7 @@ extern char __dtb_rk3568_qnap_ts433eu_start[];
 
 ENTRY_FUNCTION(start_rk3568_qnap_ts433, r0, r1, r2)
 {
-	/*
-	 * Image execution starts at 0x0, but this is used for ATF and
-	 * OP-TEE later, so move away from here.
-	 */
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
@@ -35,14 +28,7 @@ ENTRY_FUNCTION(start_rk3568_qnap_ts433, r0, r1, r2)
  */
 ENTRY_FUNCTION(start_rk3568_qnap_ts433eu, r0, r1, r2)
 {
-	/*
-	 * Image execution starts at 0x0, but this is used for ATF and
-	 * OP-TEE later, so move away from here.
-	 */
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/radxa-cm3/lowlevel.c b/arch/arm/boards/radxa-cm3/lowlevel.c
index e1b453f21f..2c91444d46 100644
--- a/arch/arm/boards/radxa-cm3/lowlevel.c
+++ b/arch/arm/boards/radxa-cm3/lowlevel.c
@@ -21,10 +21,7 @@ ENTRY_FUNCTION(start_radxa_cm3_io, r0, r1, r2)
 
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/radxa-rock3/lowlevel.c b/arch/arm/boards/radxa-rock3/lowlevel.c
index ec407404b9..50ec27d272 100644
--- a/arch/arm/boards/radxa-rock3/lowlevel.c
+++ b/arch/arm/boards/radxa-rock3/lowlevel.c
@@ -22,10 +22,7 @@ ENTRY_FUNCTION(start_rock3a, r0, r1, r2)
 
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/radxa-rock5/lowlevel.c b/arch/arm/boards/radxa-rock5/lowlevel.c
index e70752be31..f00c394c4d 100644
--- a/arch/arm/boards/radxa-rock5/lowlevel.c
+++ b/arch/arm/boards/radxa-rock5/lowlevel.c
@@ -15,10 +15,7 @@ ENTRY_FUNCTION(start_rock5b, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3588_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
@@ -29,10 +26,7 @@ ENTRY_FUNCTION(start_rock5t, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3588_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c b/arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c
index 474f1a1332..9e083514e1 100644
--- a/arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c
+++ b/arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c
@@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_rk3562_evb2, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3562_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c b/arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c
index 4afe83189d..b56f8d62cf 100644
--- a/arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c
+++ b/arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c
@@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_rk3562_kickpi_k3, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3562_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c b/arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c
index 12c2445287..021438e12f 100644
--- a/arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c
+++ b/arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c
@@ -26,10 +26,7 @@ ENTRY_FUNCTION(start_rk3568_bpi_r2pro, r0, r1, r2)
 	//clear bit 6 for 3v3 as it was set to 1v8
 	writel(RK_CLRBITS(BIT(6)), PMU_GRF_IO_VSEL1);
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/rockchip-rk3568-evb/lowlevel.c b/arch/arm/boards/rockchip-rk3568-evb/lowlevel.c
index d5ae70049e..a238f8bd73 100644
--- a/arch/arm/boards/rockchip-rk3568-evb/lowlevel.c
+++ b/arch/arm/boards/rockchip-rk3568-evb/lowlevel.c
@@ -22,10 +22,7 @@ ENTRY_FUNCTION(start_rk3568_evb, r0, r1, r2)
 
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/wolfvision-pf5/lowlevel.c b/arch/arm/boards/wolfvision-pf5/lowlevel.c
index c20ca4ae13..49fb2143d7 100644
--- a/arch/arm/boards/wolfvision-pf5/lowlevel.c
+++ b/arch/arm/boards/wolfvision-pf5/lowlevel.c
@@ -21,14 +21,7 @@ ENTRY_FUNCTION(start_rk3568_wolfvision_pf5, r0, r1, r2)
 	 */
 	writel(RK_SETBITS(0x30), 0xfdc20140);
 
-	/*
-	 * Image execution starts at 0x0, but this is used for ATF and
-	 * OP-TEE later, so move away from here.
-	 */
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 
diff --git a/arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c b/arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c
index 2fa921eee0..45ba471d24 100644
--- a/arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c
+++ b/arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c
@@ -14,10 +14,7 @@ ENTRY_FUNCTION(start_orangepi_5_plus, r0, r1, r2)
 {
 	putc_ll('>');
 
-	if (current_el() == 3)
-		relocate_to_adr_full(RK3588_BAREBOX_LOAD_ADDRESS);
-	else
-		relocate_to_current_adr();
+	relocate_to_current_adr();
 
 	setup_c();
 

-- 
2.47.3




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

* [PATCH 3/3] ARM: rockchip: pack the device tree passed to TF-A and OP-TEE
  2026-10-01  7:42 [PATCH 0/3] Rockchip: early boot time optimization Sascha Hauer
  2026-10-01  7:42 ` [PATCH 1/3] ARM: rockchip: move to the load address with the MMU enabled Sascha Hauer
  2026-10-01  7:42 ` [PATCH 2/3] ARM: rockchip: boards: leave moving to the load address to atf.c Sascha Hauer
@ 2026-10-01  7:42 ` Sascha Hauer
  2 siblings, 0 replies; 6+ messages in thread
From: Sascha Hauer @ 2026-10-01  7:42 UTC (permalink / raw)
  To: BAREBOX

rockchip_create_optee_fdt() builds a device tree with just the memory
nodes, but fdt_create_empty_tree() sets its totalsize to the size of the
whole scratch buffer, i.e. CONFIG_ARCH_ROCKCHIP_ATF_FDT_SIZE (384 KiB).

TF-A and OP-TEE both call fdt_open_into() on the device tree, which
copies totalsize bytes regardless of the actual content. TF-A does this
with the MMU disabled and OP-TEE through an uncached mapping. On an
RK3588 this takes 185 ms in TF-A and another 182 ms in OP-TEE.

Pack the device tree so that totalsize matches its content. OP-TEE can
still expand it in place, the scratch buffer keeps its size.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/arm/mach-rockchip/atf.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-rockchip/atf.c b/arch/arm/mach-rockchip/atf.c
index e1ca197430..4b88de8317 100644
--- a/arch/arm/mach-rockchip/atf.c
+++ b/arch/arm/mach-rockchip/atf.c
@@ -172,7 +172,7 @@ static int rockchip_create_optee_fdt(void *buf, int bufsize)
 {
 	unsigned long base[ROCKCHIP_MAX_DRAM_RESOURCES];
 	unsigned long size[ARRAY_SIZE(base)];
-	int i, root;
+	int i, root, ret;
 
 	if (fdt_create_empty_tree(buf, bufsize) != 0)
 		return -EINVAL;
@@ -187,7 +187,12 @@ static int rockchip_create_optee_fdt(void *buf, int bufsize)
 		size[i] = memsize[i];
 	}
 
-	return fdt_fixup_mem(buf, base, size, n_mem_resources);
+	ret = fdt_fixup_mem(buf, base, size, n_mem_resources);
+	if (ret)
+		return ret;
+
+	/* TF-A and OP-TEE copy the whole totalsize, keep it small */
+	return fdt_pack(buf);
 }
 
 static void rockchip_atf_load_bl31(void *fdt)

-- 
2.47.3




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

* Re: [PATCH 2/3] ARM: rockchip: boards: leave moving to the load address to atf.c
  2026-10-01  7:42 ` [PATCH 2/3] ARM: rockchip: boards: leave moving to the load address to atf.c Sascha Hauer
@ 2026-10-01  8:30   ` Ahmad Fatoum
  2026-10-01 10:19     ` Sascha Hauer
  0 siblings, 1 reply; 6+ messages in thread
From: Ahmad Fatoum @ 2026-10-01  8:30 UTC (permalink / raw)
  To: Sascha Hauer, BAREBOX

Hello Sascha,

On 10/1/26 9:42 AM, Sascha Hauer wrote:
> The SoC entry functions now move barebox to the load address themselves,
> with the MMU enabled. Stop doing it upfront with relocate_to_adr_full(),
> which copies the image with the MMU off, and just relocate in place.
> 
> Assisted-by: Claude:claude-opus-5-5
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Will an out-of-tree board that still has the same old pattern continue
to work normally?

Thanks,
Ahmad


> ---
>  arch/arm/boards/pine64-pinetab2/lowlevel.c           | 10 ++--------
>  arch/arm/boards/pine64-quartz64/lowlevel.c           |  5 +----
>  arch/arm/boards/protonic-prtpuk/lowlevel.c           |  5 +----
>  arch/arm/boards/protonic-rk356x/lowlevel.c           |  5 +----
>  arch/arm/boards/qnap-tsx33/lowlevel.c                | 18 ++----------------
>  arch/arm/boards/radxa-cm3/lowlevel.c                 |  5 +----
>  arch/arm/boards/radxa-rock3/lowlevel.c               |  5 +----
>  arch/arm/boards/radxa-rock5/lowlevel.c               | 10 ++--------
>  arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c      |  5 +----
>  arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c |  5 +----
>  arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c |  5 +----
>  arch/arm/boards/rockchip-rk3568-evb/lowlevel.c       |  5 +----
>  arch/arm/boards/wolfvision-pf5/lowlevel.c            |  9 +--------
>  arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c   |  5 +----
>  14 files changed, 17 insertions(+), 80 deletions(-)
> 
> diff --git a/arch/arm/boards/pine64-pinetab2/lowlevel.c b/arch/arm/boards/pine64-pinetab2/lowlevel.c
> index 73ca6866f0..63286bf630 100644
> --- a/arch/arm/boards/pine64-pinetab2/lowlevel.c
> +++ b/arch/arm/boards/pine64-pinetab2/lowlevel.c
> @@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_pinetab2_v0, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> @@ -26,10 +23,7 @@ ENTRY_FUNCTION(start_pinetab2_v2, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/pine64-quartz64/lowlevel.c b/arch/arm/boards/pine64-quartz64/lowlevel.c
> index 7723d47860..6a1169d24a 100644
> --- a/arch/arm/boards/pine64-quartz64/lowlevel.c
> +++ b/arch/arm/boards/pine64-quartz64/lowlevel.c
> @@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_quartz64a, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/protonic-prtpuk/lowlevel.c b/arch/arm/boards/protonic-prtpuk/lowlevel.c
> index 08de527bf6..df1588d343 100644
> --- a/arch/arm/boards/protonic-prtpuk/lowlevel.c
> +++ b/arch/arm/boards/protonic-prtpuk/lowlevel.c
> @@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_prtpuk, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3576_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/protonic-rk356x/lowlevel.c b/arch/arm/boards/protonic-rk356x/lowlevel.c
> index 830d708b6e..1959881951 100644
> --- a/arch/arm/boards/protonic-rk356x/lowlevel.c
> +++ b/arch/arm/boards/protonic-rk356x/lowlevel.c
> @@ -22,10 +22,7 @@ ENTRY_FUNCTION(start_mecsbc, r0, r1, r2)
>  
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/qnap-tsx33/lowlevel.c b/arch/arm/boards/qnap-tsx33/lowlevel.c
> index c5458937d1..88e94471d2 100644
> --- a/arch/arm/boards/qnap-tsx33/lowlevel.c
> +++ b/arch/arm/boards/qnap-tsx33/lowlevel.c
> @@ -13,14 +13,7 @@ extern char __dtb_rk3568_qnap_ts433eu_start[];
>  
>  ENTRY_FUNCTION(start_rk3568_qnap_ts433, r0, r1, r2)
>  {
> -	/*
> -	 * Image execution starts at 0x0, but this is used for ATF and
> -	 * OP-TEE later, so move away from here.
> -	 */
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> @@ -35,14 +28,7 @@ ENTRY_FUNCTION(start_rk3568_qnap_ts433, r0, r1, r2)
>   */
>  ENTRY_FUNCTION(start_rk3568_qnap_ts433eu, r0, r1, r2)
>  {
> -	/*
> -	 * Image execution starts at 0x0, but this is used for ATF and
> -	 * OP-TEE later, so move away from here.
> -	 */
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/radxa-cm3/lowlevel.c b/arch/arm/boards/radxa-cm3/lowlevel.c
> index e1b453f21f..2c91444d46 100644
> --- a/arch/arm/boards/radxa-cm3/lowlevel.c
> +++ b/arch/arm/boards/radxa-cm3/lowlevel.c
> @@ -21,10 +21,7 @@ ENTRY_FUNCTION(start_radxa_cm3_io, r0, r1, r2)
>  
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/radxa-rock3/lowlevel.c b/arch/arm/boards/radxa-rock3/lowlevel.c
> index ec407404b9..50ec27d272 100644
> --- a/arch/arm/boards/radxa-rock3/lowlevel.c
> +++ b/arch/arm/boards/radxa-rock3/lowlevel.c
> @@ -22,10 +22,7 @@ ENTRY_FUNCTION(start_rock3a, r0, r1, r2)
>  
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/radxa-rock5/lowlevel.c b/arch/arm/boards/radxa-rock5/lowlevel.c
> index e70752be31..f00c394c4d 100644
> --- a/arch/arm/boards/radxa-rock5/lowlevel.c
> +++ b/arch/arm/boards/radxa-rock5/lowlevel.c
> @@ -15,10 +15,7 @@ ENTRY_FUNCTION(start_rock5b, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3588_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> @@ -29,10 +26,7 @@ ENTRY_FUNCTION(start_rock5t, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3588_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c b/arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c
> index 474f1a1332..9e083514e1 100644
> --- a/arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c
> +++ b/arch/arm/boards/rockchip-rk3562-evb2/lowlevel.c
> @@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_rk3562_evb2, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3562_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c b/arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c
> index 4afe83189d..b56f8d62cf 100644
> --- a/arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c
> +++ b/arch/arm/boards/rockchip-rk3562-kickpi-k3/lowlevel.c
> @@ -12,10 +12,7 @@ ENTRY_FUNCTION(start_rk3562_kickpi_k3, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3562_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c b/arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c
> index 12c2445287..021438e12f 100644
> --- a/arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c
> +++ b/arch/arm/boards/rockchip-rk3568-bpi-r2pro/lowlevel.c
> @@ -26,10 +26,7 @@ ENTRY_FUNCTION(start_rk3568_bpi_r2pro, r0, r1, r2)
>  	//clear bit 6 for 3v3 as it was set to 1v8
>  	writel(RK_CLRBITS(BIT(6)), PMU_GRF_IO_VSEL1);
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/rockchip-rk3568-evb/lowlevel.c b/arch/arm/boards/rockchip-rk3568-evb/lowlevel.c
> index d5ae70049e..a238f8bd73 100644
> --- a/arch/arm/boards/rockchip-rk3568-evb/lowlevel.c
> +++ b/arch/arm/boards/rockchip-rk3568-evb/lowlevel.c
> @@ -22,10 +22,7 @@ ENTRY_FUNCTION(start_rk3568_evb, r0, r1, r2)
>  
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/wolfvision-pf5/lowlevel.c b/arch/arm/boards/wolfvision-pf5/lowlevel.c
> index c20ca4ae13..49fb2143d7 100644
> --- a/arch/arm/boards/wolfvision-pf5/lowlevel.c
> +++ b/arch/arm/boards/wolfvision-pf5/lowlevel.c
> @@ -21,14 +21,7 @@ ENTRY_FUNCTION(start_rk3568_wolfvision_pf5, r0, r1, r2)
>  	 */
>  	writel(RK_SETBITS(0x30), 0xfdc20140);
>  
> -	/*
> -	 * Image execution starts at 0x0, but this is used for ATF and
> -	 * OP-TEE later, so move away from here.
> -	 */
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> diff --git a/arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c b/arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c
> index 2fa921eee0..45ba471d24 100644
> --- a/arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c
> +++ b/arch/arm/boards/xunlong-orangepi-5-plus/lowlevel.c
> @@ -14,10 +14,7 @@ ENTRY_FUNCTION(start_orangepi_5_plus, r0, r1, r2)
>  {
>  	putc_ll('>');
>  
> -	if (current_el() == 3)
> -		relocate_to_adr_full(RK3588_BAREBOX_LOAD_ADDRESS);
> -	else
> -		relocate_to_current_adr();
> +	relocate_to_current_adr();
>  
>  	setup_c();
>  
> 

-- 
Pengutronix e.K.                  |                             |
Steuerwalder Str. 21              | http://www.pengutronix.de/  |
31137 Hildesheim, Germany         | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686  | Fax:   +49-5121-206917-5555 |




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

* Re: [PATCH 2/3] ARM: rockchip: boards: leave moving to the load address to atf.c
  2026-10-01  8:30   ` Ahmad Fatoum
@ 2026-10-01 10:19     ` Sascha Hauer
  0 siblings, 0 replies; 6+ messages in thread
From: Sascha Hauer @ 2026-10-01 10:19 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: BAREBOX

On 2026-10-01 10:30, Ahmad Fatoum wrote:
> Hello Sascha,
> 
> On 10/1/26 9:42 AM, Sascha Hauer wrote:
> > The SoC entry functions now move barebox to the load address themselves,
> > with the MMU enabled. Stop doing it upfront with relocate_to_adr_full(),
> > which copies the image with the MMU off, and just relocate in place.
> > 
> > Assisted-by: Claude:claude-opus-5-5
> > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> 
> Will an out-of-tree board that still has the same old pattern continue
> to work normally?

Yes. That board would relocate the binary in the board code and
rockchip_move_to_load_address() would bail out early due to
__image_start == load_address. The MMU would then be enabled in
rockchip_atf_load_bl31() as before.

Sascha

--
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |




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

end of thread, other threads:[~2026-10-01 10:21 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-01  7:42 [PATCH 0/3] Rockchip: early boot time optimization Sascha Hauer
2026-10-01  7:42 ` [PATCH 1/3] ARM: rockchip: move to the load address with the MMU enabled Sascha Hauer
2026-10-01  7:42 ` [PATCH 2/3] ARM: rockchip: boards: leave moving to the load address to atf.c Sascha Hauer
2026-10-01  8:30   ` Ahmad Fatoum
2026-10-01 10:19     ` Sascha Hauer
2026-10-01  7:42 ` [PATCH 3/3] ARM: rockchip: pack the device tree passed to TF-A and OP-TEE Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox