|
@@ -10,6 +10,7 @@
|
|
|
#include <part.h>
|
|
|
#include <aboot.h>
|
|
|
#include <sparse_format.h>
|
|
|
+#include <mmc.h>
|
|
|
|
|
|
#ifndef CONFIG_FASTBOOT_GPT_NAME
|
|
|
#define CONFIG_FASTBOOT_GPT_NAME GPT_ENTRY_NAME
|
|
@@ -110,3 +111,58 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
|
|
|
write_raw_image(dev_desc, &info, cmd, download_buffer,
|
|
|
download_bytes);
|
|
|
}
|
|
|
+
|
|
|
+void fb_mmc_erase(const char *cmd, char *response)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ block_dev_desc_t *dev_desc;
|
|
|
+ disk_partition_t info;
|
|
|
+ lbaint_t blks, blks_start, blks_size, grp_size;
|
|
|
+ struct mmc *mmc = find_mmc_device(CONFIG_FASTBOOT_FLASH_MMC_DEV);
|
|
|
+
|
|
|
+ if (mmc == NULL) {
|
|
|
+ error("invalid mmc device");
|
|
|
+ fastboot_fail("invalid mmc device");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* initialize the response buffer */
|
|
|
+ response_str = response;
|
|
|
+
|
|
|
+ dev_desc = get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
|
|
|
+ if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
|
|
|
+ error("invalid mmc device");
|
|
|
+ fastboot_fail("invalid mmc device");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = get_partition_info_efi_by_name(dev_desc, cmd, &info);
|
|
|
+ if (ret) {
|
|
|
+ error("cannot find partition: '%s'", cmd);
|
|
|
+ fastboot_fail("cannot find partition");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Align blocks to erase group size to avoid erasing other partitions */
|
|
|
+ grp_size = mmc->erase_grp_size;
|
|
|
+ blks_start = (info.start + grp_size - 1) & ~(grp_size - 1);
|
|
|
+ if (info.size >= grp_size)
|
|
|
+ blks_size = (info.size - (blks_start - info.start)) &
|
|
|
+ (~(grp_size - 1));
|
|
|
+ else
|
|
|
+ blks_size = 0;
|
|
|
+
|
|
|
+ printf("Erasing blocks " LBAFU " to " LBAFU " due to alignment\n",
|
|
|
+ blks_start, blks_start + blks_size);
|
|
|
+
|
|
|
+ blks = dev_desc->block_erase(dev_desc->dev, blks_start, blks_size);
|
|
|
+ if (blks != blks_size) {
|
|
|
+ error("failed erasing from device %d", dev_desc->dev);
|
|
|
+ fastboot_fail("failed erasing from device");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("........ erased " LBAFU " bytes from '%s'\n",
|
|
|
+ blks_size * info.blksz, cmd);
|
|
|
+ fastboot_okay("");
|
|
|
+}
|