The eMMC HW partition 0 and 7 both mean USER HW partition. 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.r...@ifm.com>
Signed-off-by: Marek Vasut <ma...@denx.de>
---
Cc: Jaehoon Chung <jh80.ch...@samsung.com>
Cc: Peng Fan <peng....@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;
 
                if (CONFIG_IS_ENABLED(MMC_TINY))
-                       err = mmc_switch_part(mmc, hw_part);
+                       err = mmc_switch_part(mmc, part);
                else
-                       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));
+                               raw_sect + spl_mmc_raw_uboot_offset(part));
                if (!err)
                        return err;
 #endif
-- 
2.39.2

Reply via email to