Support for burning into the correct eMMC HW boot partition was broken and
removed in commit 96be2f072768 ("mvebu: bubt: Drop dead code"). Reimplement
this functionality and bring it back again.

Fixes: 96be2f072768 ("mvebu: bubt: Drop dead code")
Signed-off-by: Pali Rohár <p...@kernel.org>
---
 cmd/mvebu/bubt.c       | 53 ++++++++++++++++++++++++++++++++++++++----
 doc/mvebu/cmd/bubt.txt | 21 ++++++++++++-----
 2 files changed, 63 insertions(+), 11 deletions(-)

diff --git a/cmd/mvebu/bubt.c b/cmd/mvebu/bubt.c
index 2bcdf145f64a..4bad9a69527c 100644
--- a/cmd/mvebu/bubt.c
+++ b/cmd/mvebu/bubt.c
@@ -189,6 +189,11 @@ static int mmc_burn_image(size_t image_size)
 #ifdef CONFIG_BLK
        struct blk_desc *blk_desc;
 #endif
+#ifdef CONFIG_SUPPORT_EMMC_BOOT
+       u8              part;
+       u8              orig_part;
+#endif
+
        mmc = find_mmc_device(mmc_dev_num);
        if (!mmc) {
                printf("No SD/MMC/eMMC card found\n");
@@ -202,6 +207,38 @@ static int mmc_burn_image(size_t image_size)
                return err;
        }
 
+#ifdef CONFIG_BLK
+       blk_desc = mmc_get_blk_desc(mmc);
+       if (!blk_desc) {
+               printf("Error - failed to obtain block descriptor\n");
+               return -ENODEV;
+       }
+#endif
+
+#ifdef CONFIG_SUPPORT_EMMC_BOOT
+#ifdef CONFIG_BLK
+       orig_part = blk_desc->hwpart;
+#else
+       orig_part = mmc->block_dev.hwpart;
+#endif
+
+       part = (mmc->part_config >> 3) & PART_ACCESS_MASK;
+
+       if (part == 7)
+               part = 0;
+
+#ifdef CONFIG_BLK
+       err = blk_dselect_hwpart(blk_desc, part);
+#else
+       err = mmc_switch_part(mmc, part);
+#endif
+
+       if (err) {
+               printf("Error - MMC partition switch failed\n");
+               return err;
+       }
+#endif
+
        /* SD reserves LBA-0 for MBR and boots from LBA-1,
         * MMC/eMMC boots from LBA-0
         */
@@ -211,11 +248,6 @@ static int mmc_burn_image(size_t image_size)
        if (image_size % mmc->write_bl_len)
                blk_count += 1;
 
-       blk_desc = mmc_get_blk_desc(mmc);
-       if (!blk_desc) {
-               printf("Error - failed to obtain block descriptor\n");
-               return -ENODEV;
-       }
        blk_written = blk_dwrite(blk_desc, start_lba, blk_count,
                                 (void *)get_load_addr());
 #else
@@ -227,6 +259,17 @@ static int mmc_burn_image(size_t image_size)
                                                 start_lba, blk_count,
                                                 (void *)get_load_addr());
 #endif /* CONFIG_BLK */
+
+#ifdef CONFIG_SUPPORT_EMMC_BOOT
+#ifdef CONFIG_BLK
+       err = blk_dselect_hwpart(blk_desc, orig_part);
+#else
+       err = mmc_switch_part(mmc, orig_part);
+#endif
+       if (err)
+               printf("Error - MMC failed to switch back to original 
partition\n");
+#endif
+
        if (blk_written != blk_count) {
                printf("Error - written %#lx blocks\n", blk_written);
                return -ENOSPC;
diff --git a/doc/mvebu/cmd/bubt.txt b/doc/mvebu/cmd/bubt.txt
index 6051243f1165..1fe1f07dd187 100644
--- a/doc/mvebu/cmd/bubt.txt
+++ b/doc/mvebu/cmd/bubt.txt
@@ -14,8 +14,7 @@ Examples:
 
 Notes:
 - For the TFTP interface set serverip and ipaddr.
-- To burn image to SD/eMMC device, the target is defined
-  by parameters CONFIG_SYS_MMC_ENV_DEV and CONFIG_SYS_MMC_ENV_PART.
+- To burn image to SD/eMMC device, the target is defined by HW partition.
 
 Bubt command details (burn image step by-step)
 ----------------------------------------------
@@ -40,10 +39,20 @@ Notes:
   Number 0 is used for user data partition and should not be utilized for 
storing
   boot images and U-Boot environment in RAW mode since it will break file 
system
   structures usually located here.
-  The default boot partition is BOOT0. It is selected by the following 
parameter:
-  CONFIG_SYS_MMC_ENV_PART=1
-  Valid values for this parameter are 1 for BOOT0 and 2 for BOOT1.
-  Please never use partition number 0 here!
+
+  Currently configured boot partition can be printed by command:
+  # mmc partconf 0
+  (search for BOOT_PARTITION_ACCESS output, number 7 is user data)
+
+  Change it to BOOT0:
+  # mmc partconf 0 0 1 1
+
+  Change it to BOOT1:
+  # mmc partconf 0 0 2 2
+
+  Change it to user data:
+  # mmc partconf 0 0 7 0
+
 - The partition number is ignored if the target device is SD card.
 - The boot image offset starts at block 0 for eMMC and block 1 for SD devices.
   The block 0 on SD devices is left for MBR storage.
-- 
2.20.1

Reply via email to