200 lines
6.6 KiB
Diff
200 lines
6.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Mecid <[email protected]>
|
|
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 <[email protected]>
|
|
> 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 <[email protected]>
|
|
M: Bhupesh Sharma <[email protected]>
|
|
M: Neha Malcom Francis <[email protected]>
|
|
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 <[email protected]>
|
|
+ */
|
|
+
|
|
+#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);
|
|
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
|
|
|