* [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
* 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
* [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
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