[PATCH v2] Fix socfpga GEN5 boot by spl+u-boot sfp on RAW

Jan Kiszka jan.kiszka at siemens.com
Mon Dec 1 08:45:48 CET 2025


On 29.11.25 07:48, Brian Sune wrote:
> Thanks to Jan Kiszka had provided info on
> u-boot is not able to boot by u-boot-with-spl.sfp.
> 
> All three TYPE, NUM, OFFSET mode methods
> are nonfunctional on combined raw boot.
> 
> 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 | 19 ++++++++++++++-----
>  include/part.h       |  4 +++-
>  3 files changed, 24 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

Proposed as separate patch in [1] as requested my Marek.

> @@ -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..6904ea3edb7 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,9 @@ 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) && \
> +    (defined(CONFIG_TARGET_SOCFPGA_CYCLONE5) || defined(CONFIG_TARGET_SOCFPGA_ARRIA5)))
>  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 +141,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 +426,12 @@ 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) && \
> +    (defined(CONFIG_TARGET_SOCFPGA_CYCLONE5) || defined(CONFIG_TARGET_SOCFPGA_ARRIA5)))
>  		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..91e49012e2f 100644
> --- a/include/part.h
> +++ b/include/part.h
> @@ -461,7 +461,9 @@ 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_PARTITION) || \
> +     (defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE) && \
> +     (defined(CONFIG_TARGET_SOCFPGA_CYCLONE5) || defined(CONFIG_TARGET_SOCFPGA_ARRIA5)))
>  #  define part_get_info_ptr(x)	x
>  # else
>  #  define part_get_info_ptr(x)	NULL

Two issues:
 - fixes for CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE mangled
   with socfpga changes
 - a lot if ugly board-specific ifdefs - my approach in [2] does not
   need that

Jan

[1]
https://patchwork.ozlabs.org/project/uboot/patch/db6aa161176dfcc4d2764e9411b4d195c9c3208c.1764574369.git.jan.kiszka@siemens.com/
[2] https://patchwork.ozlabs.org/project/uboot/list/?series=483978

-- 
Siemens AG, Foundational Technologies
Linux Expert Center


More information about the U-Boot mailing list