MMC storage supports 4 hardware partitions:
        * User partition
        * 2 boot partitions
        * RPMB partition

Flashing to the User partition is already supported, and this commit
adds support for flashing to the 2 boot partitions.

User can run the following commands to flash to the boot partitions:
        fastboot flash mmcboot0 myfile
        fastboot flash mmcboot1 myfile

"mmcboot" is the default name of the partition and can be changed via
a Kconfig option.

Signed-off-by: Fabien Parent <fpar...@baylibre.com>
---
 drivers/fastboot/Kconfig  | 17 +++++++++++++++++
 drivers/fastboot/fb_mmc.c | 36 +++++++++++++++++++++++++++++++++++-
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
index d63ecdd27e..f481d7596c 100644
--- a/drivers/fastboot/Kconfig
+++ b/drivers/fastboot/Kconfig
@@ -126,6 +126,23 @@ config FASTBOOT_MBR_NAME
          specified on the "fastboot flash" command line matches the value
          defined here. The default target name for updating MBR is "mbr".
 
+config FASTBOOT_MMC_BOOT_PART_NAME
+       string "Target name for updating MMC's boot partitions"
+       depends on FASTBOOT_FLASH_MMC
+       default "mmcboot"
+       help
+         The fastboot "flash" command supports writing the downloaded
+         image to the MMC's boot partitions.
+         This occurs when the specified "partition name" on the
+         "fastboot flash" command line is starts with the value defined here,
+         and ends with '0' or '1' to specify which boot partition is being
+         targeted.
+         The default name for updating the boot partitions is "mmcboot".
+         For example the two partitions can be flashed using the following
+         commands if the default name is used:
+           - "fastboot flash mmcboot0 myfile",
+           - "fastboot flash mmcboot1 myfile".
+
 config FASTBOOT_CMD_OEM_FORMAT
        bool "Enable the 'oem format' command"
        depends on FASTBOOT_FLASH_MMC && CMD_GPT
diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c
index 90ca81da9b..c2451200f7 100644
--- a/drivers/fastboot/fb_mmc.c
+++ b/drivers/fastboot/fb_mmc.c
@@ -46,6 +46,28 @@ static int part_get_info_by_name_or_alias(struct blk_desc 
*dev_desc,
        return ret;
 }
 
+static int part_get_mmc_boot_info(int hwpart, disk_partition_t *info)
+{
+       struct mmc *mmc;
+       int ret;
+
+       mmc = find_mmc_device(CONFIG_FASTBOOT_FLASH_MMC_DEV);
+       if (!mmc)
+               return -EINVAL;
+
+       ret = blk_select_hwpart_devnum(IF_TYPE_MMC,
+                                      CONFIG_FASTBOOT_FLASH_MMC_DEV, hwpart);
+       if (ret < 0)
+               return ret;
+
+       memset(info, 0, sizeof(*info));
+       info->start = 0;
+       info->size = mmc->capacity_boot;
+       info->blksz = mmc->write_bl_len;
+
+       return 0;
+}
+
 /**
  * fb_mmc_blk_write() - Write/erase MMC in chunks of FASTBOOT_MAX_BLK_WRITE
  *
@@ -394,7 +416,19 @@ void fastboot_mmc_flash_write(const char *cmd, void 
*download_buffer,
        }
 #endif
 
-       if (part_get_info_by_name_or_alias(dev_desc, cmd, &info) < 0) {
+       if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT_PART_NAME "0") == 0) {
+               if (part_get_mmc_boot_info(1, &info) < 0) {
+                       pr_err("cannot find partition: '%s'\n", cmd);
+                       fastboot_fail("cannot find partition", response);
+                       return;
+               }
+       } else if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT_PART_NAME "1") == 0) {
+               if (part_get_mmc_boot_info(2, &info) < 0) {
+                       pr_err("cannot find partition: '%s'\n", cmd);
+                       fastboot_fail("cannot find partition", response);
+                       return;
+               }
+       } else if (part_get_info_by_name_or_alias(dev_desc, cmd, &info) < 0) {
                pr_err("cannot find partition: '%s'\n", cmd);
                fastboot_fail("cannot find partition", response);
                return;
-- 
2.20.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to