[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