
On Tuesday 04 April 2023 20:05:15 Marek Vasut wrote:
The eMMC HW partition 0 and 7 both mean USER HW partition.
This is not truth!
Use this as a mean of propagating A/B copy selection within USER HW partition. The spl_mmc_get_uboot_raw_sector() can detect that a USER HW partition is in use and based on whether it is 0 or 7, select appropriate sector to load from.
Signed-off-by: Fedor Ross fedor.ross@ifm.com Signed-off-by: Marek Vasut marex@denx.de
Cc: Jaehoon Chung jh80.chung@samsung.com Cc: Peng Fan peng.fan@nxp.com
V2: Initialize the part variable, else it is passed uninitialized to mmc_load_image_raw_sector(..raw_sect + spl_mmc_raw_uboot_offset(part)); and that prevents pine64 from booting. Interestingly enough, there is no warning emitted, which sounds like a compiler bug. V3: Update on u-boot/master
common/spl/spl_mmc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c index f1f87d78ba7..865c395b9fe 100644 --- a/common/spl/spl_mmc.c +++ b/common/spl/spl_mmc.c @@ -412,7 +412,7 @@ int spl_mmc_load(struct spl_image_info *spl_image, static struct mmc *mmc; u32 boot_mode; int err = 0;
- __maybe_unused int hw_part = 0;
__maybe_unused int part = 0, hw_part = 0; int mmc_dev;
/* Perform peripheral init only once for an mmc device */
@@ -437,11 +437,12 @@ int spl_mmc_load(struct spl_image_info *spl_image, switch (boot_mode) { case MMCSD_MODE_EMMCBOOT: hw_part = spl_mmc_emmc_boot_partition(mmc);
part = hw_part == 7 ? 0 : hw_part;
... and so this change will break accessing eMMC part 7 / GP4.
if (CONFIG_IS_ENABLED(MMC_TINY))
err = mmc_switch_part(mmc, hw_part);
elseerr = mmc_switch_part(mmc, part);
err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), hw_part);
err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
if (err) {
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT @@ -471,7 +472,7 @@ int spl_mmc_load(struct spl_image_info *spl_image, #endif #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR err = mmc_load_image_raw_sector(spl_image, bootdev, mmc,
raw_sect + spl_mmc_raw_uboot_offset(hw_part));
if (!err) return err;raw_sect + spl_mmc_raw_uboot_offset(part));
#endif
2.39.2