diff mbox

[v2,1/1] usb: gadget: fastboot: Add fastboot erase

Message ID 1424179103-21702-1-git-send-email-dileep.katta@linaro.org
State Accepted
Commit 897923819cda6f26fe8a5921c595871526ab6a9c
Headers show

Commit Message

Dileep Katta Feb. 17, 2015, 1:18 p.m. UTC
Adds the fastboot erase functionality, to erase a partition
specified by name. The erase is performed based on erase group size,
to avoid erasing other partitions. The start address and the size
is aligned to the erase group size for this.

Currently only supports erasing from eMMC.

Signed-off-by: Dileep Katta <dileep.katta@linaro.org>
---
Changes in v2:
	- Removed unnecessary newline for error() messages
	- Made the command conditional on CONFIG_FASTBOOT_FLASH
	- Updated doc/README.android-fastboot to reflect the support
 common/fb_mmc.c                 | 56 +++++++++++++++++++++++++++++++++++++++++
 doc/README.android-fastboot     |  5 ++--
 drivers/usb/gadget/f_fastboot.c | 25 ++++++++++++++++++
 include/fb_mmc.h                |  1 +
 4 files changed, 84 insertions(+), 3 deletions(-)

Comments

Dileep Katta Feb. 24, 2015, 11:13 a.m. UTC | #1
Thanks Lukasz.

Regards,
Dileep

On 24 February 2015 at 14:44, Lukasz Majewski <l.majewski@samsung.com>
wrote:

> Hi Dileep,
>
> > Adds the fastboot erase functionality, to erase a partition
> > specified by name. The erase is performed based on erase group size,
> > to avoid erasing other partitions. The start address and the size
> > is aligned to the erase group size for this.
> >
> > Currently only supports erasing from eMMC.
> >
> > Signed-off-by: Dileep Katta <dileep.katta@linaro.org>
> > ---
> > Changes in v2:
> >       - Removed unnecessary newline for error() messages
> >       - Made the command conditional on CONFIG_FASTBOOT_FLASH
> >       - Updated doc/README.android-fastboot to reflect the support
> >  common/fb_mmc.c                 | 56
> > +++++++++++++++++++++++++++++++++++++++++
> > doc/README.android-fastboot     |  5 ++--
> > drivers/usb/gadget/f_fastboot.c | 25 ++++++++++++++++++
> > include/fb_mmc.h                |  1 + 4 files changed, 84
> > insertions(+), 3 deletions(-)
> >
> > diff --git a/common/fb_mmc.c b/common/fb_mmc.c
> > index 6ea3938..513b7ab 100644
> > --- a/common/fb_mmc.c
> > +++ b/common/fb_mmc.c
> > @@ -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("");
> > +}
> > diff --git a/doc/README.android-fastboot b/doc/README.android-fastboot
> > index 1677609..5526a43 100644
> > --- a/doc/README.android-fastboot
> > +++ b/doc/README.android-fastboot
> > @@ -6,9 +6,8 @@ Overview
> >  The protocol that is used over USB is described in
> >  README.android-fastboot-protocol in same directory.
> >
> > -The current implementation does not yet support the erase command or
> > the -"oem format" command, and there is minimal support for the flash
> > command; -it only supports eMMC devices.
> > +The current implementation is a minimal support of the erase
> > command,the +"oem format" command and flash command;it only supports
> > eMMC devices.
> >  Client installation
> >  ===================
> > diff --git a/drivers/usb/gadget/f_fastboot.c
> > b/drivers/usb/gadget/f_fastboot.c index f7d84bf..6138906 100644
> > --- a/drivers/usb/gadget/f_fastboot.c
> > +++ b/drivers/usb/gadget/f_fastboot.c
> > @@ -535,6 +535,28 @@ static void cb_oem(struct usb_ep *ep, struct
> > usb_request *req) }
> >  }
> >
> > +#ifdef CONFIG_FASTBOOT_FLASH
> > +static void cb_erase(struct usb_ep *ep, struct usb_request *req)
> > +{
> > +     char *cmd = req->buf;
> > +     char response[RESPONSE_LEN];
> > +
> > +     strsep(&cmd, ":");
> > +     if (!cmd) {
> > +             error("missing partition name");
> > +             fastboot_tx_write_str("FAILmissing partition name");
> > +             return;
> > +     }
> > +
> > +     strcpy(response, "FAILno flash device defined");
> > +
> > +#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
> > +     fb_mmc_erase(cmd, response);
> > +#endif
> > +     fastboot_tx_write_str(response);
> > +}
> > +#endif
> > +
> >  struct cmd_dispatch_info {
> >       char *cmd;
> >       void (*cb)(struct usb_ep *ep, struct usb_request *req);
> > @@ -561,6 +583,9 @@ static const struct cmd_dispatch_info
> > cmd_dispatch_info[] = { {
> >               .cmd = "flash",
> >               .cb = cb_flash,
> > +     }, {
> > +             .cmd = "erase",
> > +             .cb = cb_erase,
> >       },
> >  #endif
> >       {
> > diff --git a/include/fb_mmc.h b/include/fb_mmc.h
> > index 1ad1d13..402ba9b 100644
> > --- a/include/fb_mmc.h
> > +++ b/include/fb_mmc.h
> > @@ -6,3 +6,4 @@
> >
> >  void fb_mmc_flash_write(const char *cmd, void *download_buffer,
> >                       unsigned int download_bytes, char *response);
> > +void fb_mmc_erase(const char *cmd, char *response);
>
> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
>
> I'm going to apply this patch to -dfu tree.
>
> Thanks Dileep!
>
> --
> Best regards,
>
> Lukasz Majewski
>
> Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
>
diff mbox

Patch

diff --git a/common/fb_mmc.c b/common/fb_mmc.c
index 6ea3938..513b7ab 100644
--- a/common/fb_mmc.c
+++ b/common/fb_mmc.c
@@ -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("");
+}
diff --git a/doc/README.android-fastboot b/doc/README.android-fastboot
index 1677609..5526a43 100644
--- a/doc/README.android-fastboot
+++ b/doc/README.android-fastboot
@@ -6,9 +6,8 @@  Overview
 The protocol that is used over USB is described in
 README.android-fastboot-protocol in same directory.
 
-The current implementation does not yet support the erase command or the
-"oem format" command, and there is minimal support for the flash command;
-it only supports eMMC devices.
+The current implementation is a minimal support of the erase command,the
+"oem format" command and flash command;it only supports eMMC devices.
 
 Client installation
 ===================
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c
index f7d84bf..6138906 100644
--- a/drivers/usb/gadget/f_fastboot.c
+++ b/drivers/usb/gadget/f_fastboot.c
@@ -535,6 +535,28 @@  static void cb_oem(struct usb_ep *ep, struct usb_request *req)
 	}
 }
 
+#ifdef CONFIG_FASTBOOT_FLASH
+static void cb_erase(struct usb_ep *ep, struct usb_request *req)
+{
+	char *cmd = req->buf;
+	char response[RESPONSE_LEN];
+
+	strsep(&cmd, ":");
+	if (!cmd) {
+		error("missing partition name");
+		fastboot_tx_write_str("FAILmissing partition name");
+		return;
+	}
+
+	strcpy(response, "FAILno flash device defined");
+
+#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
+	fb_mmc_erase(cmd, response);
+#endif
+	fastboot_tx_write_str(response);
+}
+#endif
+
 struct cmd_dispatch_info {
 	char *cmd;
 	void (*cb)(struct usb_ep *ep, struct usb_request *req);
@@ -561,6 +583,9 @@  static const struct cmd_dispatch_info cmd_dispatch_info[] = {
 	{
 		.cmd = "flash",
 		.cb = cb_flash,
+	}, {
+		.cmd = "erase",
+		.cb = cb_erase,
 	},
 #endif
 	{
diff --git a/include/fb_mmc.h b/include/fb_mmc.h
index 1ad1d13..402ba9b 100644
--- a/include/fb_mmc.h
+++ b/include/fb_mmc.h
@@ -6,3 +6,4 @@ 
 
 void fb_mmc_flash_write(const char *cmd, void *download_buffer,
 			unsigned int download_bytes, char *response);
+void fb_mmc_erase(const char *cmd, char *response);