[PATCH v5 4/4] rockchip: spl: Add support for booting from UFS

Jonas Karlman jonas at kwiboo.se
Wed Mar 11 00:18:31 CET 2026


Hi Alexey,

On 1/20/2026 7:09 PM, Alexey Charkov wrote:
> Add the required architecture-specific lookups to enable U-boot SPL to
> load images from UFS storage devices on Rockchip RK3576, which has a
> boot ROM capable of loading the SPL image from UFS.
> 
> Signed-off-by: Alexey Charkov <alchark at gmail.com>
> ---
>  arch/arm/dts/rk3576-u-boot.dtsi              | 16 +++++++++++++++-
>  arch/arm/include/asm/arch-rockchip/bootrom.h |  1 +
>  arch/arm/mach-rockchip/rk3576/rk3576.c       |  1 +
>  arch/arm/mach-rockchip/spl-boot-order.c      | 14 ++++++++++++++
>  4 files changed, 31 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/dts/rk3576-u-boot.dtsi b/arch/arm/dts/rk3576-u-boot.dtsi
> index dc3771b556a3..e442e94f7132 100644
> --- a/arch/arm/dts/rk3576-u-boot.dtsi
> +++ b/arch/arm/dts/rk3576-u-boot.dtsi
> @@ -12,7 +12,7 @@
>  	};
>  
>  	chosen {
> -		u-boot,spl-boot-order = "same-as-spl", &sdmmc, &sdhci;
> +		u-boot,spl-boot-order = "same-as-spl", &sdmmc, &sdhci, &ufshc;
>  	};
>  
>  	dmc {
> @@ -81,6 +81,15 @@
>  	bootph-some-ram;
>  };
>  
> +&gpio4 {
> +	/* This is specifically for GPIO4_D0, which is the only 1.2V capable
> +	 * pin on RK3576 available for use as the UFS device reset, thus
> +	 * &gpio4 is required for booting from UFS on RK3576.
> +	 */
> +	bootph-pre-ram;
> +	bootph-some-ram;
> +};

Please wrap this in a #ifdef CONFIG_SPL_UFS_SUPPORT or similar, we only
need to include gpio4 in spl/u-boot-spl.dtb when SPL_UFS_SUPPORT is
enabled.

> +
>  &ioc_grf {
>  	bootph-all;
>  };

Please add following UFS related pinconf node to SPL, it is referenced
by ufs_rstgpio:

&pcfg_pull_down {
	bootph-pre-ram;
	bootph-some-ram;
};

> @@ -176,6 +185,11 @@
>  	bootph-pre-ram;
>  };
>  
> +&ufshc {
> +	bootph-pre-ram;
> +	bootph-some-ram;
> +};

Please add following UFS related pinctrl nodes to SPL:

&ufs_refclk {
	bootph-pre-ram;
	bootph-some-ram;
};

&ufs_rstgpio {
	bootph-pre-ram;
	bootph-some-ram;
};

Above changes depends on the 438f1fe833e0 from devicetree-rebasing,
please pick and include that in a v6.

With above fixed this is:

Reviewed-by: Jonas Karlman <jonas at kwiboo.se>

Also feel free to pick "rockchip: rk3576-rock-4d: Enable UFS support"
from my rk3576 branch [1] in a v6. That branch also include FIXUPs
with the changes I have requested and tested on a ROCK 4D.

[1] https://source.denx.de/u-boot/contributors/kwiboo/u-boot/-/commits/rk3576

Regards,
Jonas

> +
>  &xin24m {
>  	bootph-all;
>  };
> diff --git a/arch/arm/include/asm/arch-rockchip/bootrom.h b/arch/arm/include/asm/arch-rockchip/bootrom.h
> index b15938c021d6..f9ecb6858f04 100644
> --- a/arch/arm/include/asm/arch-rockchip/bootrom.h
> +++ b/arch/arm/include/asm/arch-rockchip/bootrom.h
> @@ -51,6 +51,7 @@ enum {
>  	BROM_BOOTSOURCE_SPINOR = 3,
>  	BROM_BOOTSOURCE_SPINAND = 4,
>  	BROM_BOOTSOURCE_SD = 5,
> +	BROM_BOOTSOURCE_UFS = 7,
>  	BROM_BOOTSOURCE_I2C = 8,
>  	BROM_BOOTSOURCE_SPI = 9,
>  	BROM_BOOTSOURCE_USB = 10,
> diff --git a/arch/arm/mach-rockchip/rk3576/rk3576.c b/arch/arm/mach-rockchip/rk3576/rk3576.c
> index a1e8a7572fa4..46cf60dc77c7 100644
> --- a/arch/arm/mach-rockchip/rk3576/rk3576.c
> +++ b/arch/arm/mach-rockchip/rk3576/rk3576.c
> @@ -46,6 +46,7 @@ const char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = {
>  	[BROM_BOOTSOURCE_FSPI0] = "/soc/spi at 2a340000/flash at 0",
>  	[BROM_BOOTSOURCE_FSPI1_M1] = "/soc/spi at 2a300000/flash at 0",
>  	[BROM_BOOTSOURCE_SD] = "/soc/mmc at 2a310000",
> +	[BROM_BOOTSOURCE_UFS] = "/soc/ufshc at 2a2d0000",
>  };
>  
>  static struct mm_region rk3576_mem_map[] = {
> diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c
> index 6572dde29f65..d2dd5e10935f 100644
> --- a/arch/arm/mach-rockchip/spl-boot-order.c
> +++ b/arch/arm/mach-rockchip/spl-boot-order.c
> @@ -76,6 +76,9 @@ static int spl_node_to_boot_device(int node)
>  	if (!uclass_find_device_by_of_offset(UCLASS_SPI_FLASH, node, &parent))
>  		return BOOT_DEVICE_SPI;
>  
> +	if (!uclass_find_device_by_of_offset(UCLASS_UFS, node, &parent))
> +		return BOOT_DEVICE_UFS;
> +
>  	return -1;
>  }
>  
> @@ -231,6 +234,17 @@ int spl_decode_boot_device(u32 boot_device, char *buf, size_t buflen)
>  		return -ENODEV;
>  	}
>  
> +	if (boot_device == BOOT_DEVICE_UFS) {
> +		ret = uclass_find_device(UCLASS_UFS, 0, &dev);
> +		if (ret) {
> +			debug("%s: could not find device for UFS: %d\n",
> +			      __func__, ret);
> +			return ret;
> +		}
> +
> +		return ofnode_get_path(dev_ofnode(dev), buf, buflen);
> +	}
> +
>  #if CONFIG_IS_ENABLED(BLK)
>  	dev_num = (boot_device == BOOT_DEVICE_MMC1) ? 0 : 1;
>  
> 



More information about the U-Boot mailing list