From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steve Rae Date: Fri, 13 Feb 2015 12:45:15 -0800 Subject: [U-Boot] [PATCH v1 1/1] usb: gadget: fastboot: Add fastboot erase In-Reply-To: References: <1423558178-23105-1-git-send-email-dileep.katta@linaro.org> <54DA7735.6070605@broadcom.com> Message-ID: <54DE625B.8050702@broadcom.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 15-02-12 12:29 AM, Dileep Katta wrote: > Hi Steve, > > On 11 February 2015 at 05:25, Steve Rae wrote: >> >> Hi, Dileep >> >> >> On 15-02-10 12:49 AM, Dileep Katta wrote: >>> >>> 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 >>> --- >>> Note: The changes are on top of oem command support added by robh at kernel.org >>> >>> common/fb_mmc.c | 58 +++++++++++++++++++++++++++++++++++++++++ >>> drivers/usb/gadget/f_fastboot.c | 23 ++++++++++++++++ >>> include/fb_mmc.h | 1 + >>> 3 files changed, 82 insertions(+) >>> >>> diff --git a/common/fb_mmc.c b/common/fb_mmc.c >>> index 6ea3938..3911989 100644 >>> --- a/common/fb_mmc.c >>> +++ b/common/fb_mmc.c >>> @@ -10,6 +10,7 @@ >>> #include >>> #include >>> #include >>> +#include >>> >>> #ifndef CONFIG_FASTBOOT_GPT_NAME >>> #define CONFIG_FASTBOOT_GPT_NAME GPT_ENTRY_NAME >>> @@ -110,3 +111,60 @@ 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\n"); >> >> no newline with error() > Will remove >> >>> + 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\n"); >> >> no newline with error() > Will remove >> >> >>> + fastboot_fail("invalid mmc device"); >>> + return; >>> + } >>> + >>> + ret = get_partition_info_efi_by_name(dev_desc, cmd, &info); >>> + if (ret) { >>> + error("cannot find partition: '%s'\n", cmd); >> >> no newline with error() > Will remove >> >>> + fastboot_fail("cannot find partition"); >>> + return; >>> + } >>> + >>> + puts("Erasing partition\n"); >>> + >>> + /* 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; >> >> >> Is this logic correct??? Isn't the "erase_grp_size" in bytes? and the info.start & info.size in LBA's? > Yes, the math will take care of it. Ref: mmc_berase() So, I have a partition: 2 0x00000300 0x000003ff "test" attrs: 0x0000000000000000 type: 9e312af1-18fe-fa41-45f3-37b3bb1d1061 guid: 18a5d0db-d23a-aac1-0d4c-692c7ba9ab1c and 'fastboot erase test' produces: Erasing blocks 1024 to 1024 due to alignment ........ erased 0 bytes from 'test' which is not correct! Furthermore, doesn't the mmc_berase() already handle the "erase_grp_size".... If I remove your alignment logic, then it produces: Erasing blocks 768 to 1024 due to alignment Caution! Your devices Erase group is 0x400 The erase range would be change to 0x0~0x7ff ........ erased 131072 bytes from 'test' which looks correct (except for the "Caution" message).... Thanks, Steve >> >> >>> + >>> + 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\n", dev_desc->dev); >> >> no newline with error() > Will remove >> >>> + fastboot_fail("failed erasing from device"); >>> + return; >>> + } >>> + >>> + printf("........ erased " LBAFU " bytes from '%s'\n", >>> + blks_size * info.blksz, cmd); >>> + fastboot_okay(""); >>> +} >>> diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c >>> index f7d84bf..a8d8205 100644 >>> --- a/drivers/usb/gadget/f_fastboot.c >>> +++ b/drivers/usb/gadget/f_fastboot.c >>> @@ -535,6 +535,26 @@ static void cb_oem(struct usb_ep *ep, struct usb_request *req) >>> } >>> } >>> >>> +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\n"); >> >> no newline with error() > Will remove >> >>> + 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); >>> +} >>> + >>> struct cmd_dispatch_info { >>> char *cmd; >>> void (*cb)(struct usb_ep *ep, struct usb_request *req); >>> @@ -566,6 +586,9 @@ static const struct cmd_dispatch_info cmd_dispatch_info[] = { >>> { >>> .cmd = "oem", >>> .cb = cb_oem, >>> + }, { >>> + .cmd = "erase", >>> + .cb = cb_erase, >>> }, >>> }; >>> >>> 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); >>> > > Thanks for the review. Will send v2 with changes. > > Regards, > Dileep >