[PATCH v3 2/4] rockchip: Add support for RAM boot from maskrom mode

Kever Yang kever.yang at rock-chips.com
Sun Nov 16 13:37:39 CET 2025


On 2025/8/3 06:07, Jonas Karlman wrote:
> The BootROM in Rockchip SoCs will enter maskrom mode when boot firmware
> cannot be found in nand/spi/mmc storage.
>
> In maskrom mode the USB OTG port can accept one of two custom commands.
>
> Initially a 0x471 command to load TPL into SRAM. After TPL has been
> executed and it has returned back-to-BROM, a 0x472 command to load SPL
> into start of DRAM.
>
> Add two binman images that can be used to RAM boot from maskrom mode:
> - u-boot-rockchip-usb471.bin that contains TPL to init DRAM.
> - u-boot-rockchip-usb472.bin that contains SPL and the normal FIT
>    payload with i.e. U-Boot proper, TF-A and FDT.
>
> A config fragment rockchip-ramboot.config can be used to enable building
> of these two binman images, e.g.:
>
>    make generic-rk3588_defconfig rockchip-ramboot.config
>
> These binman images can be used with the proprietary rkbin boot_merger
> tool to create a special loader image that can be used with tools such
> as rkdeveloptool or rockusb tools to RAM boot from maskrom, e.g.:
>
>    Create loader image:
>      $ ../rkbin/tools/boot_merger ./RK3588MINIALL.ini
>
>    Boot from maskrom:
>      $ rkdeveloptool db u-boot-rockchip-rk3588-loader.bin
>     or
>      $ rockusb download-boot u-boot-rockchip-rk3588-loader.bin
>
> Another option that does not require use of proprietary tools is using
> open source tools such as rkflashtool or rkusbboot that can load the
> binman images directly without any need to first create a special loader
> image to RAM boot from maskrom, e.g.:
>
>    $ rkflashtool l < u-boot-rockchip-usb471.bin
>    $ rkflashtool L < u-boot-rockchip-usb472.bin
>   or
>    $ rkusbboot u-boot-rockchip-usb471.bin u-boot-rockchip-usb472.bin
>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
> Tested-by: Arnaud Patard <arnaud.patard at collabora.com>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever
> ---
> Changes in v3:
> - Use read_brom_bootsource_id() to support RAM boot on RK3576
> - Add a rockchip-ramboot.config fragment to enable the Kconfig option
> - Update commit message to highlight that the binman images can be used
>    directly without use of the proprietary rkbin boot_merger tool
>
> Changes in v2:
> - Use fit_template instead of common_part
> - Collect t-b tag
> ---
>   arch/arm/dts/rockchip-u-boot.dtsi       | 33 +++++++++++++++++++++++++
>   arch/arm/mach-rockchip/Kconfig          |  8 ++++++
>   arch/arm/mach-rockchip/spl-boot-order.c | 14 ++++++++---
>   board/rockchip/rockchip-ramboot.config  |  1 +
>   boot/Kconfig                            |  3 +++
>   5 files changed, 56 insertions(+), 3 deletions(-)
>   create mode 100644 board/rockchip/rockchip-ramboot.config
>
> diff --git a/arch/arm/dts/rockchip-u-boot.dtsi b/arch/arm/dts/rockchip-u-boot.dtsi
> index cc2feed6464f..71d7623fe2ca 100644
> --- a/arch/arm/dts/rockchip-u-boot.dtsi
> +++ b/arch/arm/dts/rockchip-u-boot.dtsi
> @@ -226,5 +226,38 @@
>   		};
>   	};
>   #endif /* CONFIG_ROCKCHIP_SPI_IMAGE */
> +
> +#ifdef CONFIG_ROCKCHIP_MASKROM_IMAGE
> +	simple-bin-usb471 {
> +		filename = "u-boot-rockchip-usb471.bin";
> +
> +#ifdef CONFIG_ROCKCHIP_EXTERNAL_TPL
> +		rockchip-tpl {
> +		};
> +#elif defined(CONFIG_TPL)
> +		u-boot-tpl {
> +			no-write-symbols;
> +		};
> +#endif
> +	};
> +
> +	simple-bin-usb472 {
> +		filename = "u-boot-rockchip-usb472.bin";
> +		pad-byte = <0x00>;
> +
> +		u-boot-spl {
> +			no-write-symbols;
> +		};
> +
> +#ifdef HAS_FIT
> +		fit {
> +			insert-template = <&fit_template>;
> +#else
> +		u-boot-img {
> +#endif
> +			offset = <(CONFIG_SPL_LOAD_FIT_ADDRESS - CFG_SYS_SDRAM_BASE)>;
> +		};
> +	};
> +#endif /* CONFIG_ROCKCHIP_MASKROM_IMAGE */
>   };
>   #endif /* CONFIG_SPL */
> diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
> index c9ce30760292..e32e49ff59ac 100644
> --- a/arch/arm/mach-rockchip/Kconfig
> +++ b/arch/arm/mach-rockchip/Kconfig
> @@ -706,6 +706,14 @@ config ROCKCHIP_SPI_IMAGE
>   	  option to produce a SPI-flash image containing U-Boot. The image
>   	  is built by binman. U-Boot sits near the start of the image.
>   
> +config ROCKCHIP_MASKROM_IMAGE
> +	bool "Build a maskrom mode image for Rockchip"
> +	depends on TPL || ROCKCHIP_EXTERNAL_TPL
> +	select SPL_RAM_DEVICE
> +	help
> +	  Rockchip SoCs support maskrom mode boot over USB. Enable this
> +	  option to produce maskrom mode boot images containing U-Boot.
> +
>   config LNX_KRNL_IMG_TEXT_OFFSET_BASE
>   	default TEXT_BASE
>   
> diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c
> index 6b1b84dc86d1..15f1cba8e8fd 100644
> --- a/arch/arm/mach-rockchip/spl-boot-order.c
> +++ b/arch/arm/mach-rockchip/spl-boot-order.c
> @@ -8,6 +8,7 @@
>   #include <log.h>
>   #include <mmc.h>
>   #include <spl.h>
> +#include <asm/arch-rockchip/bootrom.h>
>   #include <asm/global_data.h>
>   #include <dm/uclass-internal.h>
>   
> @@ -98,15 +99,22 @@ __weak const char *board_spl_was_booted_from(void)
>   
>   void board_boot_order(u32 *spl_boot_list)
>   {
> +	int idx = 0;
> +
> +	/* Add RAM boot for maskrom mode boot over USB */
> +	if (BROM_BOOTSOURCE_ID_ADDR && CONFIG_IS_ENABLED(RAM_DEVICE) &&
> +	    read_brom_bootsource_id() == BROM_BOOTSOURCE_USB) {
> +		spl_boot_list[idx++] = BOOT_DEVICE_RAM;
> +	}
> +
>   	/* In case of no fdt (or only plat), use spl_boot_device() */
>   	if (!CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_PLATDATA)) {
> -		spl_boot_list[0] = spl_boot_device();
> +		spl_boot_list[idx++] = spl_boot_device();
>   		return;
>   	}
>   
>   	const void *blob = gd->fdt_blob;
>   	int chosen_node = fdt_path_offset(blob, "/chosen");
> -	int idx = 0;
>   	int elem;
>   	int boot_device;
>   	int node;
> @@ -115,7 +123,7 @@ void board_boot_order(u32 *spl_boot_list)
>   	if (chosen_node < 0) {
>   		debug("%s: /chosen not found, using spl_boot_device()\n",
>   		      __func__);
> -		spl_boot_list[0] = spl_boot_device();
> +		spl_boot_list[idx++] = spl_boot_device();
>   		return;
>   	}
>   
> diff --git a/board/rockchip/rockchip-ramboot.config b/board/rockchip/rockchip-ramboot.config
> new file mode 100644
> index 000000000000..312363e542b7
> --- /dev/null
> +++ b/board/rockchip/rockchip-ramboot.config
> @@ -0,0 +1 @@
> +CONFIG_ROCKCHIP_MASKROM_IMAGE=y
> diff --git a/boot/Kconfig b/boot/Kconfig
> index 2ff6f0037384..2afad56ddfa6 100644
> --- a/boot/Kconfig
> +++ b/boot/Kconfig
> @@ -257,6 +257,9 @@ config SPL_LOAD_FIT_ADDRESS
>   	hex "load address of fit image"
>   	depends on SPL_LOAD_FIT
>   	default 0x44000000 if ARCH_IMX8M
> +	default 0x60080000 if ARCH_ROCKCHIP && SPL_TEXT_BASE = 0x60000000
> +	default 0x40200000 if ARCH_ROCKCHIP && SPL_TEXT_BASE = 0x40000000
> +	default 0x00200000 if ARCH_ROCKCHIP && SPL_TEXT_BASE = 0x00000000
>   	default 0x0
>   	help
>   	  Specify the load address of the fit image that will be loaded


More information about the U-Boot mailing list