Merge tag 'u-boot-ufs-20260313' of https://source.denx.de/u-boot/custodians/u-boot-ufs into next

- ufs_hba_ops callbacks cleanup
- Rockchip UFS reset support
- UFS support in SPL
This commit is contained in:
Tom Rini
2026-03-13 09:01:53 -06:00
13 changed files with 152 additions and 17 deletions

View File

@@ -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

View File

@@ -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

49
common/spl/spl_ufs.c Normal file
View File

@@ -0,0 +1,49 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* (C) Copyright 2025 Alexey Charkov <alchark@gmail.com>
*/
#include <spl.h>
#include <spl_load.h>
#include <scsi.h>
#include <errno.h>
#include <image.h>
#include <linux/compiler.h>
#include <log.h>
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);