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 <[email protected]> --- 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 @@ -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 <[email protected]> */ + #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 -- 2.34.1

