[PATCH v1] Fix socfpga GEN5 boot by spl+u-boot sfp on RAW
Brian Sune
briansune at gmail.com
Thu Nov 27 20:21:36 CET 2025
Thanks to Jan Kiszka had provided info on
u-boot is not able to boot by u-boot-with-spl.sfp.
All three TYPE, #, OFFSET mode methods are
nonfunctionable on combined raw boot.
Explain a bit on the cause and solutions.
The major cause is spl+u-boot structure is
defined as 4x[spl+zero_pad] + u-boot.img.
Deal to this configuration since GEN5 is used,
the spl would require to seek by an offset
on top of the spl offset. This means for
each spl=0x10000 the offset is 0x40000.
However latest u-boot do not consider this
major structure on GEN5 socfpga.
Meanwhile, the default include file as Jan
pointed out is completely wrong syntax and
caused issue.
Combining both concepts, the minimum fix
patch is provide as follows.
1) Offset is control and default set to a
proper offset under:
SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
2) Only GEN5 socfpga will be affected and
minimized contamination on other devices.
3) Only one compuatation adjustment is made
on spl_mmc_load. And simply introduce the
offset adding by the kconfig offset control.
It should be 0 by default and gate as well.
So no possible harm should be done.
Signed-off-by: Brian Sune <briansune at gmail.com>
---
common/spl/Kconfig | 8 +++++++-
common/spl/spl_mmc.c | 17 ++++++++++++-----
include/part.h | 3 ++-
3 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 8dade2b501e..554509146d8 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -574,6 +574,7 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE
bool "MMC raw mode: by partition type"
depends on DOS_PARTITION
+ select SPL_LOAD_BLOCK
help
Use partition type for specifying U-Boot partition on MMC/SD in
raw mode. U-Boot will be loaded from the first partition of this
@@ -600,8 +601,13 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
config SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
hex "U-Boot main hardware partition image offset"
- depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
+ depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR || \
+ (SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION && \
+ (TARGET_SOCFPGA_CYCLONE5 || TARGET_SOCFPGA_ARRIA5)) || \
+ (SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE && \
+ (TARGET_SOCFPGA_CYCLONE5 || TARGET_SOCFPGA_ARRIA5))
default 0x10 if ARCH_SUNXI
+ default 0x200 if TARGET_SOCFPGA_CYCLONE5 || TARGET_SOCFPGA_ARRIA5
default 0x0
help
On some platforms SPL location depends on hardware partition. The ROM
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index d8ce3a84614..e50391e49e5 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -5,6 +5,7 @@
*
* Aneesh V <aneesh at ti.com>
*/
+
#include <dm.h>
#include <log.h>
#include <part.h>
@@ -28,7 +29,9 @@ static ulong h_spl_load_read(struct spl_load_info *load, ulong off,
static __maybe_unused unsigned long spl_mmc_raw_uboot_offset(int part)
{
-#if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR)
+#if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR) || \
+ IS_ENABLED(CONFIG_TARGET_SOCFPGA_CYCLONE5) || \
+ IS_ENABLED(CONFIG_TARGET_SOCFPGA_ARRIA5)
if (part == 0)
return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET;
#endif
@@ -106,7 +109,8 @@ static int spl_mmc_find_device(struct mmc **mmcp, int mmc_dev)
return 0;
}
-#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
+#if defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION) || \
+ defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE)
static int mmc_load_image_raw_partition(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev,
struct mmc *mmc, int partition,
@@ -136,7 +140,9 @@ static int mmc_load_image_raw_partition(struct spl_image_info *spl_image,
return ret;
}
-#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
+#if defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR) || \
+ defined(CONFIG_TARGET_SOCFPGA_CYCLONE5) || \
+ defined(CONFIG_TARGET_SOCFPGA_ARRIA5)
return mmc_load_image_raw_sector(spl_image, bootdev, mmc, info.start + sector);
#else
return mmc_load_image_raw_sector(spl_image, bootdev, mmc, info.start);
@@ -419,10 +425,11 @@ int spl_mmc_load(struct spl_image_info *spl_image,
raw_sect = spl_mmc_get_uboot_raw_sector(mmc, raw_sect);
-#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
+#if defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION) || \
+ defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE)
ret = mmc_load_image_raw_partition(spl_image, bootdev,
mmc, raw_part,
- raw_sect);
+ raw_sect + spl_mmc_raw_uboot_offset(part));
if (!ret)
return 0;
#endif
diff --git a/include/part.h b/include/part.h
index 6caaa6526aa..378769b6bef 100644
--- a/include/part.h
+++ b/include/part.h
@@ -461,7 +461,8 @@ ulong disk_blk_erase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt);
#ifdef CONFIG_XPL_BUILD
# define part_print_ptr(x) NULL
# if defined(CONFIG_SPL_FS_EXT4) || defined(CONFIG_SPL_FS_FAT) || \
- defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION)
+ defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION) || \
+ defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE)
# define part_get_info_ptr(x) x
# else
# define part_get_info_ptr(x) NULL
--
2.34.1
More information about the U-Boot
mailing list