From 77f919f6cd5db012127fdbdd9dd506c5e4346a8f Mon Sep 17 00:00:00 2001 From: Mecid Date: Fri, 20 Feb 2026 21:55:32 +0100 Subject: [PATCH] Rock-4D: Add Edge + RK3576 Mainline U-Boot (with UFS support) (#9421) * Rock-4D: Edge (u-boot and kernel) * RK3576: Mainline u-boot ufs boot enablement patches * Rock-4D: Use Mainline u-boot 2026.04-rc2 * Rock-4D: Update KERNEL_TEST_TARGET to edge * Rock-4D: Use Mainline u-boot on vendor and edge * Remove vendor branch check for mainline uboot --- config/boards/radxa-rock-4d.conf | 77 +++++++- .../dt_uboot/rk3576-rock-4d-u-boot.dtsi | 16 ++ ...pl-Make-UFS-available-for-SPL-builds.patch | 168 ++++++++++++++++++ ...-make-device-resets-available-in-SPL.patch | 33 ++++ ...fs-rockchip-Add-device-reset-support.patch | 79 ++++++++ ...spl-Add-support-for-booting-from-UFS.patch | 97 ++++++++++ 6 files changed, 468 insertions(+), 2 deletions(-) create mode 100644 patch/u-boot/v2026.01/dt_uboot/rk3576-rock-4d-u-boot.dtsi create mode 100644 patch/u-boot/v2026.04/v5-1-4-spl-Make-UFS-available-for-SPL-builds.patch create mode 100644 patch/u-boot/v2026.04/v5-2-4-reset-rockchip-make-device-resets-available-in-SPL.patch create mode 100644 patch/u-boot/v2026.04/v5-3-4-ufs-rockchip-Add-device-reset-support.patch create mode 100644 patch/u-boot/v2026.04/v5-4-4-rockchip-spl-Add-support-for-booting-from-UFS.patch diff --git a/config/boards/radxa-rock-4d.conf b/config/boards/radxa-rock-4d.conf index c614be502d..73730e7817 100644 --- a/config/boards/radxa-rock-4d.conf +++ b/config/boards/radxa-rock-4d.conf @@ -4,8 +4,8 @@ BOARD_VENDOR="radxa" BOARDFAMILY="rk35xx" BOARD_MAINTAINER="HeyMeco" BOOTCONFIG="rock-4d-spi-rk3576_defconfig" -KERNEL_TARGET="vendor" -KERNEL_TEST_TARGET="vendor" +KERNEL_TARGET="vendor,edge" +KERNEL_TEST_TARGET="edge" FULL_DESKTOP="yes" BOOT_LOGO="desktop" BOOT_FDT_FILE="rockchip/rk3576-rock-4d-spi.dtb" @@ -16,6 +16,79 @@ IMAGE_PARTITION_TABLE="gpt" enable_extension "radxa-aic8800" AIC8800_TYPE="usb" +# Mainline U-Boot +function post_family_config__rock4d_use_mainline_uboot() { + + display_alert "$BOARD" "Using mainline U-Boot for $BOARD / $BRANCH" "info" + + declare -g DDR_BLOB="rk35/rk3576_ddr_lp4_2112MHz_lp5_2736MHz_v1.09.bin" + + # Use mainline ATF v2.14 (rk3576 support added in this release) + BOOT_SCENARIO="tpl-blob-atf-mainline" + prepare_boot_configuration + declare -g ATFBRANCH="tag:v2.14.0" + declare -g ATFPATCHDIR="atf-rockchip64/v2.14" + + declare -g BOOTCONFIG="rock-4d-rk3576_defconfig" + declare -g BOOTDELAY=1 + declare -g BOOTSOURCE="https://github.com/u-boot/u-boot.git" + declare -g BOOTBRANCH="tag:v2026.04-rc2" + declare -g BOOTPATCHDIR="v2026.04" + unset BOOT_FDT_FILE # mainline defconfig has DEFAULT_FDT_FILE set + + # Binman produces both eMMC/SD and SPI images; mainline ATF bl31.elf + DDR blob + declare -g UBOOT_TARGET_MAP="BL31=bl31.elf ROCKCHIP_TPL=${RKBIN_DIR}/${DDR_BLOB};;u-boot-rockchip.bin u-boot-rockchip-spi.bin" + + # Disable vendor-specific postprocessing; binman does all the work + unset uboot_custom_postprocess write_uboot_platform write_uboot_platform_mtd + + # Just use the binman-provided u-boot-rockchip.bin, which is ready-to-go + function write_uboot_platform() { + dd "if=$1/u-boot-rockchip.bin" "of=$2" bs=32k seek=1 conv=notrunc status=none + } + + function write_uboot_platform_mtd() { + flashcp -v -p "$1/u-boot-rockchip-spi.bin" /dev/mtd0 + } +} + +# Enable UFS and SPI environment storage for mainline U-Boot +function post_config_uboot_target__rock4d_enable_ufs_and_spi_env() { + + display_alert "$BOARD" "Enabling UFS and SPI env for ${BOOTBRANCH} u-boot" "info" + + # Enable RK3576 UFS storage support + run_host_command_logged scripts/config --enable CONFIG_SCSI + run_host_command_logged scripts/config --enable CONFIG_CMD_SCSI + run_host_command_logged scripts/config --enable CONFIG_UFS + run_host_command_logged scripts/config --enable CONFIG_UFS_ROCKCHIP + + # Enable SPL UFS boot support; SPL_DM_GPIO/SPL_GPIO/SPL_DM_RESET are required + # by UFS_ROCKCHIP when SPL_UFS_SUPPORT is set (no longer auto-implied by Kconfig in v5 patches) + run_host_command_logged scripts/config --enable CONFIG_SPL_UFS_SUPPORT + run_host_command_logged scripts/config --enable CONFIG_SPL_DM_GPIO + run_host_command_logged scripts/config --enable CONFIG_SPL_GPIO + run_host_command_logged scripts/config --enable CONFIG_SPL_DM_RESET + + # Store U-Boot environment in SPI flash + run_host_command_logged scripts/config --set-val CONFIG_ENV_IS_NOWHERE "n" + run_host_command_logged scripts/config --set-val CONFIG_ENV_IS_IN_SPI_FLASH "y" + run_host_command_logged scripts/config --set-val CONFIG_ENV_SECT_SIZE_AUTO "y" + run_host_command_logged scripts/config --set-val CONFIG_ENV_OVERWRITE "y" + run_host_command_logged scripts/config --set-val CONFIG_ENV_SIZE "0x20000" + run_host_command_logged scripts/config --set-val CONFIG_ENV_OFFSET "0xc00000" +} + +# "rockchip-common: boot SD card first, then eMMC, then UFS/NVMe" +# On Rock 4D, mmc0 is SD card, mmc1 is eMMC, scsi covers UFS +function pre_config_uboot_target__rock4d_boot_order() { + + declare -a rockchip_uboot_targets=("mmc0" "mmc1" "scsi" "nvme" "usb" "pxe" "dhcp") + display_alert "u-boot for ${BOARD}/${BRANCH}" "u-boot: adjust boot order to '${rockchip_uboot_targets[*]}'" "info" + sed -i -e "s/#define BOOT_TARGETS.*/#define BOOT_TARGETS \"${rockchip_uboot_targets[*]}\"/" include/configs/rockchip-common.h + regular_git diff -u include/configs/rockchip-common.h || true +} + function post_family_tweaks__rock-4d_naming_audios() { display_alert "$BOARD" "Renaming Rock-4D audios" "info" diff --git a/patch/u-boot/v2026.01/dt_uboot/rk3576-rock-4d-u-boot.dtsi b/patch/u-boot/v2026.01/dt_uboot/rk3576-rock-4d-u-boot.dtsi new file mode 100644 index 0000000000..f3f3699a01 --- /dev/null +++ b/patch/u-boot/v2026.01/dt_uboot/rk3576-rock-4d-u-boot.dtsi @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +#include "rk3576-u-boot.dtsi" + +&sfc0 { + flash@0 { + bootph-pre-ram; + bootph-some-ram; + }; +}; + +&ufshc { + vcc-supply = <&vcc_3v3_ufs_s0>; + vccq-supply = <&vcc_1v2_ufs_vccq_s0>; + vccq2-supply = <&vcc_1v8_ufs_vccq2_s0>; +}; diff --git a/patch/u-boot/v2026.04/v5-1-4-spl-Make-UFS-available-for-SPL-builds.patch b/patch/u-boot/v2026.04/v5-1-4-spl-Make-UFS-available-for-SPL-builds.patch new file mode 100644 index 0000000000..2868744c1a --- /dev/null +++ b/patch/u-boot/v2026.04/v5-1-4-spl-Make-UFS-available-for-SPL-builds.patch @@ -0,0 +1,168 @@ +diff --git a/MAINTAINERS b/MAINTAINERS +index 27ce73d83f48..ca31e57f018a 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -1861,6 +1861,7 @@ M: Neil Armstrong + M: Bhupesh Sharma + M: Neha Malcom Francis + S: Maintained ++F: common/spl/spl_ufs.c + F: drivers/ufs/ + + UPL +diff --git a/arch/arm/include/asm/spl.h b/arch/arm/include/asm/spl.h +index ee79a19c05c9..dd462ea6ad82 100644 +--- a/arch/arm/include/asm/spl.h ++++ b/arch/arm/include/asm/spl.h +@@ -30,6 +30,7 @@ enum { + BOOT_DEVICE_XIP, + BOOT_DEVICE_BOOTROM, + BOOT_DEVICE_SMH, ++ BOOT_DEVICE_UFS, + BOOT_DEVICE_NONE + }; + #endif +diff --git a/common/spl/Kconfig b/common/spl/Kconfig +index 4f4119f5806c..68f475717663 100644 +--- a/common/spl/Kconfig ++++ b/common/spl/Kconfig +@@ -1612,6 +1612,36 @@ config SPL_THERMAL + automatic power-off when the temperature gets too high or low. Other + devices may be discrete but connected on a suitable bus. + ++config SPL_UFS_SUPPORT ++ bool "Support loading from UFS" ++ depends on UFS ++ select SPL_LOAD_BLOCK ++ help ++ Enable support for UFS in SPL. This allows ++ use of UFS devices such as hard drives and flash drivers for ++ loading U-Boot. ++ ++config SPL_UFS_RAW_U_BOOT_DEVNUM ++ int "SCSI device number of the UFS device to load U-Boot from" ++ depends on SPL_UFS_SUPPORT ++ default 0 ++ help ++ UFS devices are usually configured with multiple LUNs, which present ++ themselves as sequentially numbered SCSI devices. Usually one would ++ get a default LUN 0 taking up most of the space on the device, with ++ a number of smaller LUNs following it. This option controls which of ++ them the SPL will attempt to load U-Boot from. Note that this is the ++ SCSI device number, which might differ from the UFS LUN if you have ++ multiple SCSI devices attached and recognized by the SPL. ++ ++config SPL_UFS_RAW_U_BOOT_SECTOR ++ hex "Address on the UFS to load U-Boot from" ++ depends on SPL_UFS_SUPPORT ++ default 0x800 if ARCH_ROCKCHIP ++ help ++ Address on the block device to load U-Boot from. ++ Units: UFS sectors (1 sector = 4096 bytes). ++ + config SPL_WATCHDOG + bool "Support watchdog drivers" + imply SPL_WDT if !HW_WATCHDOG +diff --git a/common/spl/Makefile b/common/spl/Makefile +index 4c9482bd3096..e18f3cf09484 100644 +--- a/common/spl/Makefile ++++ b/common/spl/Makefile +@@ -37,6 +37,7 @@ obj-$(CONFIG_$(PHASE_)DFU) += spl_dfu.o + obj-$(CONFIG_$(PHASE_)SPI_LOAD) += spl_spi.o + obj-$(CONFIG_$(PHASE_)RAM_SUPPORT) += spl_ram.o + obj-$(CONFIG_$(PHASE_)USB_SDP_SUPPORT) += spl_sdp.o ++obj-$(CONFIG_$(PHASE_)UFS_SUPPORT) += spl_ufs.o + endif + + obj-$(CONFIG_$(PHASE_)UPL) += spl_upl.o +diff --git a/common/spl/spl_ufs.c b/common/spl/spl_ufs.c +new file mode 100644 +index 000000000000..cef1843f40f3 +--- /dev/null ++++ b/common/spl/spl_ufs.c +@@ -0,0 +1,49 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * (C) Copyright 2025 Alexey Charkov ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static ulong spl_ufs_load_read(struct spl_load_info *load, ulong off, ulong size, void *buf) ++{ ++ struct blk_desc *bd = load->priv; ++ lbaint_t sector = off >> bd->log2blksz; ++ lbaint_t count = size >> bd->log2blksz; ++ ++ return blk_dread(bd, sector, count, buf) << bd->log2blksz; ++} ++ ++static int spl_ufs_load_image(struct spl_image_info *spl_image, ++ struct spl_boot_device *bootdev) ++{ ++ unsigned long sector = CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR; ++ int devnum = CONFIG_SPL_UFS_RAW_U_BOOT_DEVNUM; ++ struct spl_load_info load; ++ struct blk_desc *bd; ++ int err; ++ ++ /* try to recognize storage devices immediately */ ++ scsi_scan(false); ++ bd = blk_get_devnum_by_uclass_id(UCLASS_SCSI, devnum); ++ if (!bd) ++ return -ENODEV; ++ ++ spl_load_init(&load, spl_ufs_load_read, bd, bd->blksz); ++ err = spl_load(spl_image, bootdev, &load, 0, sector << bd->log2blksz); ++ if (err) { ++ puts("spl_ufs_load_image: ufs block read error\n"); ++ log_debug("(error=%d)\n", err); ++ return err; ++ } ++ ++ return 0; ++} ++ ++SPL_LOAD_IMAGE_METHOD("UFS", 0, BOOT_DEVICE_UFS, spl_ufs_load_image); +diff --git a/drivers/Makefile b/drivers/Makefile +index de993ae42ac7..43d0ba332818 100644 +--- a/drivers/Makefile ++++ b/drivers/Makefile +@@ -73,6 +73,7 @@ obj-$(CONFIG_SPL_USB_HOST) += usb/host/ + obj-$(CONFIG_SPL_SATA) += ata/ scsi/ + obj-$(CONFIG_SPL_LEGACY_BLOCK) += block/ + obj-$(CONFIG_SPL_THERMAL) += thermal/ ++obj-$(CONFIG_SPL_UFS_SUPPORT) += scsi/ ufs/ + + endif + endif +diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile +index b76de1b22a8b..c9af60d5d03c 100644 +--- a/drivers/scsi/Makefile ++++ b/drivers/scsi/Makefile +@@ -16,4 +16,7 @@ ifdef CONFIG_XPL_BUILD + ifdef CONFIG_SPL_SATA + obj-$(CONFIG_SCSI) += scsi.o scsi-uclass.o + endif ++ifdef CONFIG_SPL_UFS_SUPPORT ++obj-$(CONFIG_SCSI) += scsi.o scsi-uclass.o ++endif + endif +diff --git a/lib/Makefile b/lib/Makefile +index 70667f3728c2..d0ffabc2b476 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -147,6 +147,7 @@ else + obj-$(CONFIG_$(PHASE_)SPRINTF) += vsprintf.o + endif + obj-$(CONFIG_$(PHASE_)STRTO) += strto.o ++obj-$(CONFIG_$(PHASE_)UFS_SUPPORT) += charset.o + else + # Main U-Boot always uses the full printf support + obj-y += vsprintf.o strto.o diff --git a/patch/u-boot/v2026.04/v5-2-4-reset-rockchip-make-device-resets-available-in-SPL.patch b/patch/u-boot/v2026.04/v5-2-4-reset-rockchip-make-device-resets-available-in-SPL.patch new file mode 100644 index 0000000000..56c812fc08 --- /dev/null +++ b/patch/u-boot/v2026.04/v5-2-4-reset-rockchip-make-device-resets-available-in-SPL.patch @@ -0,0 +1,33 @@ +diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig +index 74c267dfc4e5..d35f3904e404 100644 +--- a/drivers/reset/Kconfig ++++ b/drivers/reset/Kconfig +@@ -99,6 +99,15 @@ config RESET_ROCKCHIP + though is that some reset signals, like I2C or MISC reset multiple + devices. + ++config SPL_RESET_ROCKCHIP ++ bool "SPL reset controller driver for Rockchip SoCs" ++ depends on SPL_DM_RESET && ARCH_ROCKCHIP && CLK ++ default y ++ help ++ Support for the reset controller on Rockchip SoCs in SPL. Select this ++ if you observe any reset-related warnings or errors when booting SPL, ++ such as when using UFS storage ++ + config RESET_HSDK + bool "Synopsys HSDK Reset Driver" + depends on DM_RESET && TARGET_HSDK +diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile +index ee5b009d1341..dc7d3b610e6e 100644 +--- a/drivers/reset/Makefile ++++ b/drivers/reset/Makefile +@@ -16,7 +16,7 @@ obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o + obj-$(CONFIG_RESET_UNIPHIER) += reset-uniphier.o + obj-$(CONFIG_RESET_AST2500) += reset-ast2500.o + obj-$(CONFIG_RESET_AST2600) += reset-ast2600.o +-obj-$(CONFIG_RESET_ROCKCHIP) += reset-rockchip.o rst-rk3528.o rst-rk3576.o rst-rk3588.o ++obj-$(CONFIG_$(PHASE_)RESET_ROCKCHIP) += reset-rockchip.o rst-rk3528.o rst-rk3576.o rst-rk3588.o + obj-$(CONFIG_RESET_MESON) += reset-meson.o + obj-$(CONFIG_RESET_SOCFPGA) += reset-socfpga.o + obj-$(CONFIG_RESET_MEDIATEK) += reset-mediatek.o diff --git a/patch/u-boot/v2026.04/v5-3-4-ufs-rockchip-Add-device-reset-support.patch b/patch/u-boot/v2026.04/v5-3-4-ufs-rockchip-Add-device-reset-support.patch new file mode 100644 index 0000000000..16be07f8c4 --- /dev/null +++ b/patch/u-boot/v2026.04/v5-3-4-ufs-rockchip-Add-device-reset-support.patch @@ -0,0 +1,79 @@ +diff --git a/drivers/ufs/Kconfig b/drivers/ufs/Kconfig +index 6c75bb2a0790..49472933de36 100644 +--- a/drivers/ufs/Kconfig ++++ b/drivers/ufs/Kconfig +@@ -76,6 +76,10 @@ config UFS_RENESAS_GEN5 + config UFS_ROCKCHIP + bool "Rockchip specific hooks to UFS controller platform driver" + depends on UFS ++ depends on DM_GPIO ++ depends on RESET_ROCKCHIP ++ depends on SPL_DM_GPIO || !SPL_UFS_SUPPORT ++ depends on SPL_RESET_ROCKCHIP || !SPL_UFS_SUPPORT + help + This selects the Rockchip specific additions to UFSHCD platform driver. + +diff --git a/drivers/ufs/ufs-rockchip.c b/drivers/ufs/ufs-rockchip.c +index 0384244387da..3576f6e7a2b6 100644 +--- a/drivers/ufs/ufs-rockchip.c ++++ b/drivers/ufs/ufs-rockchip.c +@@ -5,6 +5,7 @@ + * Copyright (C) 2025 Rockchip Electronics Co.Ltd. + */ + ++#include + #include + #include + #include +@@ -153,11 +154,31 @@ static int ufs_rockchip_common_init(struct ufs_hba *hba) + return err; + } + ++ err = gpio_request_by_name(dev, "reset-gpios", 0, &host->device_reset, ++ GPIOD_IS_OUT | GPIOD_ACTIVE_LOW); ++ if (err) { ++ dev_err(dev, "Cannot get reset GPIO\n"); ++ return err; ++ } ++ + host->hba = hba; + + return 0; + } + ++static int ufs_rockchip_device_reset(struct ufs_hba *hba) ++{ ++ struct ufs_rockchip_host *host = dev_get_priv(hba->dev); ++ ++ dm_gpio_set_value(&host->device_reset, true); ++ udelay(20); ++ ++ dm_gpio_set_value(&host->device_reset, false); ++ udelay(20); ++ ++ return 0; ++} ++ + static int ufs_rockchip_rk3576_init(struct ufs_hba *hba) + { + int ret = 0; +@@ -175,6 +196,7 @@ static struct ufs_hba_ops ufs_hba_rk3576_vops = { + .init = ufs_rockchip_rk3576_init, + .phy_initialization = ufs_rockchip_rk3576_phy_init, + .hce_enable_notify = ufs_rockchip_hce_enable_notify, ++ .device_reset = ufs_rockchip_device_reset, + }; + + static const struct udevice_id ufs_rockchip_of_match[] = { +diff --git a/drivers/ufs/ufs-rockchip.h b/drivers/ufs/ufs-rockchip.h +index 3dcb80f57020..50c2539da78a 100644 +--- a/drivers/ufs/ufs-rockchip.h ++++ b/drivers/ufs/ufs-rockchip.h +@@ -72,6 +72,7 @@ struct ufs_rockchip_host { + void __iomem *ufs_sys_ctrl; + void __iomem *mphy_base; + struct reset_ctl_bulk rsts; ++ struct gpio_desc device_reset; + struct clk ref_out_clk; + uint64_t caps; + uint32_t phy_config_mode; diff --git a/patch/u-boot/v2026.04/v5-4-4-rockchip-spl-Add-support-for-booting-from-UFS.patch b/patch/u-boot/v2026.04/v5-4-4-rockchip-spl-Add-support-for-booting-from-UFS.patch new file mode 100644 index 0000000000..1166b63a90 --- /dev/null +++ b/patch/u-boot/v2026.04/v5-4-4-rockchip-spl-Add-support-for-booting-from-UFS.patch @@ -0,0 +1,97 @@ +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; ++}; ++ + &ioc_grf { + bootph-all; + }; +@@ -176,6 +185,11 @@ + bootph-pre-ram; + }; + ++&ufshc { ++ bootph-pre-ram; ++ bootph-some-ram; ++}; ++ + &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@2a340000/flash@0", + [BROM_BOOTSOURCE_FSPI1_M1] = "/soc/spi@2a300000/flash@0", + [BROM_BOOTSOURCE_SD] = "/soc/mmc@2a310000", ++ [BROM_BOOTSOURCE_UFS] = "/soc/ufshc@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; +