From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Mecid Date: Fri, 20 Feb 2026 21:55:32 +0100 Subject: [ARCHEOLOGY] Rock-4D: Add Edge + RK3576 Mainline U-Boot (with UFS support) (#9421) > X-Git-Archeology: > recovered message: > * Rock-4D: Edge (u-boot and kernel) > X-Git-Archeology: > recovered message: > * RK3576: Mainline u-boot ufs boot enablement patches > X-Git-Archeology: > recovered message: > * Rock-4D: Use Mainline u-boot 2026.04-rc2 > X-Git-Archeology: > recovered message: > * Rock-4D: Update KERNEL_TEST_TARGET to edge > X-Git-Archeology: > recovered message: > * Rock-4D: Use Mainline u-boot on vendor and edge > X-Git-Archeology: > recovered message: > * Remove vendor branch check for mainline uboot > X-Git-Archeology: - Revision 77f919f6cd5db012127fdbdd9dd506c5e4346a8f: https://github.com/armbian/build/commit/77f919f6cd5db012127fdbdd9dd506c5e4346a8f > X-Git-Archeology: Date: Fri, 20 Feb 2026 21:55:32 +0100 > X-Git-Archeology: From: Mecid > X-Git-Archeology: Subject: Rock-4D: Add Edge + RK3576 Mainline U-Boot (with UFS support) (#9421) > X-Git-Archeology: --- MAINTAINERS | 1 + arch/arm/include/asm/spl.h | 1 + common/spl/Kconfig | 30 ++++++ common/spl/Makefile | 1 + common/spl/spl_ufs.c | 49 ++++++++++ drivers/Makefile | 1 + drivers/scsi/Makefile | 3 + lib/Makefile | 1 + 8 files changed, 87 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 111111111111..222222222222 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1890,6 +1890,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 111111111111..222222222222 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 111111111111..222222222222 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -1613,6 +1613,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 111111111111..222222222222 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..111111111111 --- /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 111111111111..222222222222 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 111111111111..222222222222 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 111111111111..222222222222 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 -- Armbian