Merge branch '2022-08-04-assorted-fixed'
[platform/kernel/u-boot.git] / drivers / fastboot / fb_mmc.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2014 Broadcom Corporation.
4  */
5
6 #include <config.h>
7 #include <common.h>
8 #include <blk.h>
9 #include <env.h>
10 #include <fastboot.h>
11 #include <fastboot-internal.h>
12 #include <fb_mmc.h>
13 #include <flash.h>
14 #include <image-sparse.h>
15 #include <image.h>
16 #include <log.h>
17 #include <part.h>
18 #include <mmc.h>
19 #include <div64.h>
20 #include <linux/compat.h>
21 #include <android_image.h>
22
23 #define FASTBOOT_MAX_BLK_WRITE 16384
24
25 #define BOOT_PARTITION_NAME "boot"
26
27 struct fb_mmc_sparse {
28         struct blk_desc *dev_desc;
29 };
30
31 static int raw_part_get_info_by_name(struct blk_desc *dev_desc,
32                                      const char *name,
33                                      struct disk_partition *info)
34 {
35         /* strlen("fastboot_raw_partition_") + PART_NAME_LEN + 1 */
36         char env_desc_name[23 + PART_NAME_LEN + 1];
37         char *raw_part_desc;
38         const char *argv[2];
39         const char **parg = argv;
40
41         /* check for raw partition descriptor */
42         strcpy(env_desc_name, "fastboot_raw_partition_");
43         strlcat(env_desc_name, name, sizeof(env_desc_name));
44         raw_part_desc = strdup(env_get(env_desc_name));
45         if (raw_part_desc == NULL)
46                 return -ENODEV;
47
48         /*
49          * parse partition descriptor
50          *
51          * <lba_start> <lba_size> [mmcpart <num>]
52          */
53         for (; parg < argv + sizeof(argv) / sizeof(*argv); ++parg) {
54                 *parg = strsep(&raw_part_desc, " ");
55                 if (*parg == NULL) {
56                         pr_err("Invalid number of arguments.\n");
57                         return -ENODEV;
58                 }
59         }
60
61         info->start = simple_strtoul(argv[0], NULL, 0);
62         info->size = simple_strtoul(argv[1], NULL, 0);
63         info->blksz = dev_desc->blksz;
64         strlcpy((char *)info->name, name, PART_NAME_LEN);
65
66         if (raw_part_desc) {
67                 if (strcmp(strsep(&raw_part_desc, " "), "mmcpart") == 0) {
68                         ulong mmcpart = simple_strtoul(raw_part_desc, NULL, 0);
69                         int ret = blk_dselect_hwpart(dev_desc, mmcpart);
70
71                         if (ret)
72                                 return ret;
73                 }
74         }
75
76         return 0;
77 }
78
79 static int do_get_part_info(struct blk_desc **dev_desc, const char *name,
80                             struct disk_partition *info)
81 {
82         int ret;
83
84         /* First try partition names on the default device */
85         *dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
86         if (*dev_desc) {
87                 ret = part_get_info_by_name(*dev_desc, name, info);
88                 if (ret >= 0)
89                         return ret;
90
91                 /* Then try raw partitions */
92                 ret = raw_part_get_info_by_name(*dev_desc, name, info);
93                 if (ret >= 0)
94                         return ret;
95         }
96
97         /* Then try dev.hwpart:part */
98         ret = part_get_info_by_dev_and_name_or_num("mmc", name, dev_desc,
99                                                    info, true);
100         return ret;
101 }
102
103 static int part_get_info_by_name_or_alias(struct blk_desc **dev_desc,
104                                           const char *name,
105                                           struct disk_partition *info)
106 {
107         /* strlen("fastboot_partition_alias_") + PART_NAME_LEN + 1 */
108         char env_alias_name[25 + PART_NAME_LEN + 1];
109         char *aliased_part_name;
110
111         /* check for alias */
112         strlcpy(env_alias_name, "fastboot_partition_alias_", sizeof(env_alias_name));
113         strlcat(env_alias_name, name, sizeof(env_alias_name));
114         aliased_part_name = env_get(env_alias_name);
115         if (aliased_part_name)
116                 name = aliased_part_name;
117
118         return do_get_part_info(dev_desc, name, info);
119 }
120
121 /**
122  * fb_mmc_blk_write() - Write/erase MMC in chunks of FASTBOOT_MAX_BLK_WRITE
123  *
124  * @block_dev: Pointer to block device
125  * @start: First block to write/erase
126  * @blkcnt: Count of blocks
127  * @buffer: Pointer to data buffer for write or NULL for erase
128  */
129 static lbaint_t fb_mmc_blk_write(struct blk_desc *block_dev, lbaint_t start,
130                                  lbaint_t blkcnt, const void *buffer)
131 {
132         lbaint_t blk = start;
133         lbaint_t blks_written;
134         lbaint_t cur_blkcnt;
135         lbaint_t blks = 0;
136         int i;
137
138         for (i = 0; i < blkcnt; i += FASTBOOT_MAX_BLK_WRITE) {
139                 cur_blkcnt = min((int)blkcnt - i, FASTBOOT_MAX_BLK_WRITE);
140                 if (buffer) {
141                         if (fastboot_progress_callback)
142                                 fastboot_progress_callback("writing");
143                         blks_written = blk_dwrite(block_dev, blk, cur_blkcnt,
144                                                   buffer + (i * block_dev->blksz));
145                 } else {
146                         if (fastboot_progress_callback)
147                                 fastboot_progress_callback("erasing");
148                         blks_written = blk_derase(block_dev, blk, cur_blkcnt);
149                 }
150                 blk += blks_written;
151                 blks += blks_written;
152         }
153         return blks;
154 }
155
156 static lbaint_t fb_mmc_sparse_write(struct sparse_storage *info,
157                 lbaint_t blk, lbaint_t blkcnt, const void *buffer)
158 {
159         struct fb_mmc_sparse *sparse = info->priv;
160         struct blk_desc *dev_desc = sparse->dev_desc;
161
162         return fb_mmc_blk_write(dev_desc, blk, blkcnt, buffer);
163 }
164
165 static lbaint_t fb_mmc_sparse_reserve(struct sparse_storage *info,
166                 lbaint_t blk, lbaint_t blkcnt)
167 {
168         return blkcnt;
169 }
170
171 static void write_raw_image(struct blk_desc *dev_desc,
172                             struct disk_partition *info, const char *part_name,
173                             void *buffer, u32 download_bytes, char *response)
174 {
175         lbaint_t blkcnt;
176         lbaint_t blks;
177
178         /* determine number of blocks to write */
179         blkcnt = ((download_bytes + (info->blksz - 1)) & ~(info->blksz - 1));
180         blkcnt = lldiv(blkcnt, info->blksz);
181
182         if (blkcnt > info->size) {
183                 pr_err("too large for partition: '%s'\n", part_name);
184                 fastboot_fail("too large for partition", response);
185                 return;
186         }
187
188         puts("Flashing Raw Image\n");
189
190         blks = fb_mmc_blk_write(dev_desc, info->start, blkcnt, buffer);
191
192         if (blks != blkcnt) {
193                 pr_err("failed writing to device %d\n", dev_desc->devnum);
194                 fastboot_fail("failed writing to device", response);
195                 return;
196         }
197
198         printf("........ wrote " LBAFU " bytes to '%s'\n", blkcnt * info->blksz,
199                part_name);
200         fastboot_okay(NULL, response);
201 }
202
203 #if defined(CONFIG_FASTBOOT_MMC_BOOT_SUPPORT) || \
204         defined(CONFIG_FASTBOOT_MMC_USER_SUPPORT)
205 static int fb_mmc_erase_mmc_hwpart(struct blk_desc *dev_desc)
206 {
207         lbaint_t blks;
208
209         debug("Start Erasing mmc hwpart[%u]...\n", dev_desc->hwpart);
210
211         blks = fb_mmc_blk_write(dev_desc, 0, dev_desc->lba, NULL);
212
213         if (blks != dev_desc->lba) {
214                 pr_err("Failed to erase mmc hwpart[%u]\n", dev_desc->hwpart);
215                 return 1;
216         }
217
218         printf("........ erased %lu bytes from mmc hwpart[%u]\n",
219                dev_desc->lba * dev_desc->blksz, dev_desc->hwpart);
220
221         return 0;
222 }
223 #endif
224
225 #ifdef CONFIG_FASTBOOT_MMC_BOOT_SUPPORT
226 static void fb_mmc_boot_ops(struct blk_desc *dev_desc, void *buffer,
227                             int hwpart, u32 buff_sz, char *response)
228 {
229         lbaint_t blkcnt;
230         lbaint_t blks;
231         unsigned long blksz;
232
233         // To operate on EMMC_BOOT1/2 (mmc0boot0/1) we first change the hwpart
234         if (blk_dselect_hwpart(dev_desc, hwpart)) {
235                 pr_err("Failed to select hwpart\n");
236                 fastboot_fail("Failed to select hwpart", response);
237                 return;
238         }
239
240         if (buffer) { /* flash */
241
242                 /* determine number of blocks to write */
243                 blksz = dev_desc->blksz;
244                 blkcnt = ((buff_sz + (blksz - 1)) & ~(blksz - 1));
245                 blkcnt = lldiv(blkcnt, blksz);
246
247                 if (blkcnt > dev_desc->lba) {
248                         pr_err("Image size too large\n");
249                         fastboot_fail("Image size too large", response);
250                         return;
251                 }
252
253                 debug("Start Flashing Image to EMMC_BOOT%d...\n", hwpart);
254
255                 blks = fb_mmc_blk_write(dev_desc, 0, blkcnt, buffer);
256
257                 if (blks != blkcnt) {
258                         pr_err("Failed to write EMMC_BOOT%d\n", hwpart);
259                         fastboot_fail("Failed to write EMMC_BOOT part",
260                                       response);
261                         return;
262                 }
263
264                 printf("........ wrote %lu bytes to EMMC_BOOT%d\n",
265                        blkcnt * blksz, hwpart);
266         } else { /* erase */
267                 if (fb_mmc_erase_mmc_hwpart(dev_desc)) {
268                         pr_err("Failed to erase EMMC_BOOT%d\n", hwpart);
269                         fastboot_fail("Failed to erase EMMC_BOOT part",
270                                       response);
271                         return;
272                 }
273         }
274
275         fastboot_okay(NULL, response);
276 }
277 #endif
278
279 #ifdef CONFIG_ANDROID_BOOT_IMAGE
280 /**
281  * Read Android boot image header from boot partition.
282  *
283  * @param[in] dev_desc MMC device descriptor
284  * @param[in] info Boot partition info
285  * @param[out] hdr Where to store read boot image header
286  *
287  * Return: Boot image header sectors count or 0 on error
288  */
289 static lbaint_t fb_mmc_get_boot_header(struct blk_desc *dev_desc,
290                                        struct disk_partition *info,
291                                        struct andr_img_hdr *hdr,
292                                        char *response)
293 {
294         ulong sector_size;              /* boot partition sector size */
295         lbaint_t hdr_sectors;           /* boot image header sectors count */
296         int res;
297
298         /* Calculate boot image sectors count */
299         sector_size = info->blksz;
300         hdr_sectors = DIV_ROUND_UP(sizeof(struct andr_img_hdr), sector_size);
301         if (hdr_sectors == 0) {
302                 pr_err("invalid number of boot sectors: 0\n");
303                 fastboot_fail("invalid number of boot sectors: 0", response);
304                 return 0;
305         }
306
307         /* Read the boot image header */
308         res = blk_dread(dev_desc, info->start, hdr_sectors, (void *)hdr);
309         if (res != hdr_sectors) {
310                 pr_err("cannot read header from boot partition\n");
311                 fastboot_fail("cannot read header from boot partition",
312                               response);
313                 return 0;
314         }
315
316         /* Check boot header magic string */
317         res = android_image_check_header(hdr);
318         if (res != 0) {
319                 pr_err("bad boot image magic\n");
320                 fastboot_fail("boot partition not initialized", response);
321                 return 0;
322         }
323
324         return hdr_sectors;
325 }
326
327 /**
328  * Write downloaded zImage to boot partition and repack it properly.
329  *
330  * @param dev_desc MMC device descriptor
331  * @param download_buffer Address to fastboot buffer with zImage in it
332  * @param download_bytes Size of fastboot buffer, in bytes
333  *
334  * Return: 0 on success or -1 on error
335  */
336 static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
337                                 void *download_buffer,
338                                 u32 download_bytes,
339                                 char *response)
340 {
341         uintptr_t hdr_addr;                     /* boot image header address */
342         struct andr_img_hdr *hdr;               /* boot image header */
343         lbaint_t hdr_sectors;                   /* boot image header sectors */
344         u8 *ramdisk_buffer;
345         u32 ramdisk_sector_start;
346         u32 ramdisk_sectors;
347         u32 kernel_sector_start;
348         u32 kernel_sectors;
349         u32 sectors_per_page;
350         struct disk_partition info;
351         int res;
352
353         puts("Flashing zImage\n");
354
355         /* Get boot partition info */
356         res = part_get_info_by_name(dev_desc, BOOT_PARTITION_NAME, &info);
357         if (res < 0) {
358                 pr_err("cannot find boot partition\n");
359                 fastboot_fail("cannot find boot partition", response);
360                 return -1;
361         }
362
363         /* Put boot image header in fastboot buffer after downloaded zImage */
364         hdr_addr = (uintptr_t)download_buffer + ALIGN(download_bytes, PAGE_SIZE);
365         hdr = (struct andr_img_hdr *)hdr_addr;
366
367         /* Read boot image header */
368         hdr_sectors = fb_mmc_get_boot_header(dev_desc, &info, hdr, response);
369         if (hdr_sectors == 0) {
370                 pr_err("unable to read boot image header\n");
371                 fastboot_fail("unable to read boot image header", response);
372                 return -1;
373         }
374
375         /* Check if boot image has second stage in it (we don't support it) */
376         if (hdr->second_size > 0) {
377                 pr_err("moving second stage is not supported yet\n");
378                 fastboot_fail("moving second stage is not supported yet",
379                               response);
380                 return -1;
381         }
382
383         /* Extract ramdisk location */
384         sectors_per_page = hdr->page_size / info.blksz;
385         ramdisk_sector_start = info.start + sectors_per_page;
386         ramdisk_sector_start += DIV_ROUND_UP(hdr->kernel_size, hdr->page_size) *
387                                              sectors_per_page;
388         ramdisk_sectors = DIV_ROUND_UP(hdr->ramdisk_size, hdr->page_size) *
389                                        sectors_per_page;
390
391         /* Read ramdisk and put it in fastboot buffer after boot image header */
392         ramdisk_buffer = (u8 *)hdr + (hdr_sectors * info.blksz);
393         res = blk_dread(dev_desc, ramdisk_sector_start, ramdisk_sectors,
394                         ramdisk_buffer);
395         if (res != ramdisk_sectors) {
396                 pr_err("cannot read ramdisk from boot partition\n");
397                 fastboot_fail("cannot read ramdisk from boot partition",
398                               response);
399                 return -1;
400         }
401
402         /* Write new kernel size to boot image header */
403         hdr->kernel_size = download_bytes;
404         res = blk_dwrite(dev_desc, info.start, hdr_sectors, (void *)hdr);
405         if (res == 0) {
406                 pr_err("cannot writeback boot image header\n");
407                 fastboot_fail("cannot write back boot image header", response);
408                 return -1;
409         }
410
411         /* Write the new downloaded kernel */
412         kernel_sector_start = info.start + sectors_per_page;
413         kernel_sectors = DIV_ROUND_UP(hdr->kernel_size, hdr->page_size) *
414                                       sectors_per_page;
415         res = blk_dwrite(dev_desc, kernel_sector_start, kernel_sectors,
416                          download_buffer);
417         if (res == 0) {
418                 pr_err("cannot write new kernel\n");
419                 fastboot_fail("cannot write new kernel", response);
420                 return -1;
421         }
422
423         /* Write the saved ramdisk back */
424         ramdisk_sector_start = info.start + sectors_per_page;
425         ramdisk_sector_start += DIV_ROUND_UP(hdr->kernel_size, hdr->page_size) *
426                                              sectors_per_page;
427         res = blk_dwrite(dev_desc, ramdisk_sector_start, ramdisk_sectors,
428                          ramdisk_buffer);
429         if (res == 0) {
430                 pr_err("cannot write back original ramdisk\n");
431                 fastboot_fail("cannot write back original ramdisk", response);
432                 return -1;
433         }
434
435         puts("........ zImage was updated in boot partition\n");
436         fastboot_okay(NULL, response);
437         return 0;
438 }
439 #endif
440
441 /**
442  * fastboot_mmc_get_part_info() - Lookup eMMC partion by name
443  *
444  * @part_name: Named partition to lookup
445  * @dev_desc: Pointer to returned blk_desc pointer
446  * @part_info: Pointer to returned struct disk_partition
447  * @response: Pointer to fastboot response buffer
448  */
449 int fastboot_mmc_get_part_info(const char *part_name,
450                                struct blk_desc **dev_desc,
451                                struct disk_partition *part_info, char *response)
452 {
453         int ret;
454
455         if (!part_name || !strcmp(part_name, "")) {
456                 fastboot_fail("partition not given", response);
457                 return -ENOENT;
458         }
459
460         ret = part_get_info_by_name_or_alias(dev_desc, part_name, part_info);
461         if (ret < 0) {
462                 switch (ret) {
463                 case -ENOSYS:
464                 case -EINVAL:
465                         fastboot_fail("invalid partition or device", response);
466                         break;
467                 case -ENODEV:
468                         fastboot_fail("no such device", response);
469                         break;
470                 case -ENOENT:
471                         fastboot_fail("no such partition", response);
472                         break;
473                 case -EPROTONOSUPPORT:
474                         fastboot_fail("unknown partition table type", response);
475                         break;
476                 default:
477                         fastboot_fail("unanticipated error", response);
478                         break;
479                 }
480         }
481
482         return ret;
483 }
484
485 static struct blk_desc *fastboot_mmc_get_dev(char *response)
486 {
487         struct blk_desc *ret = blk_get_dev("mmc",
488                                            CONFIG_FASTBOOT_FLASH_MMC_DEV);
489
490         if (!ret || ret->type == DEV_TYPE_UNKNOWN) {
491                 pr_err("invalid mmc device\n");
492                 fastboot_fail("invalid mmc device", response);
493                 return NULL;
494         }
495         return ret;
496 }
497
498 /**
499  * fastboot_mmc_flash_write() - Write image to eMMC for fastboot
500  *
501  * @cmd: Named partition to write image to
502  * @download_buffer: Pointer to image data
503  * @download_bytes: Size of image data
504  * @response: Pointer to fastboot response buffer
505  */
506 void fastboot_mmc_flash_write(const char *cmd, void *download_buffer,
507                               u32 download_bytes, char *response)
508 {
509         struct blk_desc *dev_desc;
510         struct disk_partition info = {0};
511
512 #ifdef CONFIG_FASTBOOT_MMC_BOOT_SUPPORT
513         if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT1_NAME) == 0) {
514                 dev_desc = fastboot_mmc_get_dev(response);
515                 if (dev_desc)
516                         fb_mmc_boot_ops(dev_desc, download_buffer, 1,
517                                         download_bytes, response);
518                 return;
519         }
520         if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT2_NAME) == 0) {
521                 dev_desc = fastboot_mmc_get_dev(response);
522                 if (dev_desc)
523                         fb_mmc_boot_ops(dev_desc, download_buffer, 2,
524                                         download_bytes, response);
525                 return;
526         }
527 #endif
528
529 #if CONFIG_IS_ENABLED(EFI_PARTITION)
530         if (strcmp(cmd, CONFIG_FASTBOOT_GPT_NAME) == 0) {
531                 dev_desc = fastboot_mmc_get_dev(response);
532                 if (!dev_desc)
533                         return;
534
535                 printf("%s: updating MBR, Primary and Backup GPT(s)\n",
536                        __func__);
537                 if (is_valid_gpt_buf(dev_desc, download_buffer)) {
538                         printf("%s: invalid GPT - refusing to write to flash\n",
539                                __func__);
540                         fastboot_fail("invalid GPT partition", response);
541                         return;
542                 }
543                 if (write_mbr_and_gpt_partitions(dev_desc, download_buffer)) {
544                         printf("%s: writing GPT partitions failed\n", __func__);
545                         fastboot_fail("writing GPT partitions failed",
546                                       response);
547                         return;
548                 }
549                 part_init(dev_desc);
550                 printf("........ success\n");
551                 fastboot_okay(NULL, response);
552                 return;
553         }
554 #endif
555
556 #if CONFIG_IS_ENABLED(DOS_PARTITION)
557         if (strcmp(cmd, CONFIG_FASTBOOT_MBR_NAME) == 0) {
558                 dev_desc = fastboot_mmc_get_dev(response);
559                 if (!dev_desc)
560                         return;
561
562                 printf("%s: updating MBR\n", __func__);
563                 if (is_valid_dos_buf(download_buffer)) {
564                         printf("%s: invalid MBR - refusing to write to flash\n",
565                                __func__);
566                         fastboot_fail("invalid MBR partition", response);
567                         return;
568                 }
569                 if (write_mbr_sector(dev_desc, download_buffer)) {
570                         printf("%s: writing MBR partition failed\n", __func__);
571                         fastboot_fail("writing MBR partition failed",
572                                       response);
573                         return;
574                 }
575                 part_init(dev_desc);
576                 printf("........ success\n");
577                 fastboot_okay(NULL, response);
578                 return;
579         }
580 #endif
581
582 #ifdef CONFIG_ANDROID_BOOT_IMAGE
583         if (strncasecmp(cmd, "zimage", 6) == 0) {
584                 dev_desc = fastboot_mmc_get_dev(response);
585                 if (dev_desc)
586                         fb_mmc_update_zimage(dev_desc, download_buffer,
587                                              download_bytes, response);
588                 return;
589         }
590 #endif
591
592 #if CONFIG_IS_ENABLED(FASTBOOT_MMC_USER_SUPPORT)
593         if (strcmp(cmd, CONFIG_FASTBOOT_MMC_USER_NAME) == 0) {
594                 dev_desc = fastboot_mmc_get_dev(response);
595                 if (!dev_desc)
596                         return;
597
598                 strlcpy((char *)&info.name, cmd, sizeof(info.name));
599                 info.size       = dev_desc->lba;
600                 info.blksz      = dev_desc->blksz;
601         }
602 #endif
603
604         if (!info.name[0] &&
605             fastboot_mmc_get_part_info(cmd, &dev_desc, &info, response) < 0)
606                 return;
607
608         if (is_sparse_image(download_buffer)) {
609                 struct fb_mmc_sparse sparse_priv;
610                 struct sparse_storage sparse;
611                 int err;
612
613                 sparse_priv.dev_desc = dev_desc;
614
615                 sparse.blksz = info.blksz;
616                 sparse.start = info.start;
617                 sparse.size = info.size;
618                 sparse.write = fb_mmc_sparse_write;
619                 sparse.reserve = fb_mmc_sparse_reserve;
620                 sparse.mssg = fastboot_fail;
621
622                 printf("Flashing sparse image at offset " LBAFU "\n",
623                        sparse.start);
624
625                 sparse.priv = &sparse_priv;
626                 err = write_sparse_image(&sparse, cmd, download_buffer,
627                                          response);
628                 if (!err)
629                         fastboot_okay(NULL, response);
630         } else {
631                 write_raw_image(dev_desc, &info, cmd, download_buffer,
632                                 download_bytes, response);
633         }
634 }
635
636 /**
637  * fastboot_mmc_flash_erase() - Erase eMMC for fastboot
638  *
639  * @cmd: Named partition to erase
640  * @response: Pointer to fastboot response buffer
641  */
642 void fastboot_mmc_erase(const char *cmd, char *response)
643 {
644         struct blk_desc *dev_desc;
645         struct disk_partition info;
646         lbaint_t blks, blks_start, blks_size, grp_size;
647         struct mmc *mmc = find_mmc_device(CONFIG_FASTBOOT_FLASH_MMC_DEV);
648
649 #ifdef CONFIG_FASTBOOT_MMC_BOOT_SUPPORT
650         if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT1_NAME) == 0) {
651                 /* erase EMMC boot1 */
652                 dev_desc = fastboot_mmc_get_dev(response);
653                 if (dev_desc)
654                         fb_mmc_boot_ops(dev_desc, NULL, 1, 0, response);
655                 return;
656         }
657         if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT2_NAME) == 0) {
658                 /* erase EMMC boot2 */
659                 dev_desc = fastboot_mmc_get_dev(response);
660                 if (dev_desc)
661                         fb_mmc_boot_ops(dev_desc, NULL, 2, 0, response);
662                 return;
663         }
664 #endif
665
666 #ifdef CONFIG_FASTBOOT_MMC_USER_SUPPORT
667         if (strcmp(cmd, CONFIG_FASTBOOT_MMC_USER_NAME) == 0) {
668                 /* erase EMMC userdata */
669                 dev_desc = fastboot_mmc_get_dev(response);
670                 if (!dev_desc)
671                         return;
672
673                 if (fb_mmc_erase_mmc_hwpart(dev_desc))
674                         fastboot_fail("Failed to erase EMMC_USER", response);
675                 else
676                         fastboot_okay(NULL, response);
677                 return;
678         }
679 #endif
680
681         if (fastboot_mmc_get_part_info(cmd, &dev_desc, &info, response) < 0)
682                 return;
683
684         /* Align blocks to erase group size to avoid erasing other partitions */
685         grp_size = mmc->erase_grp_size;
686         blks_start = (info.start + grp_size - 1) & ~(grp_size - 1);
687         if (info.size >= grp_size)
688                 blks_size = (info.size - (blks_start - info.start)) &
689                                 (~(grp_size - 1));
690         else
691                 blks_size = 0;
692
693         printf("Erasing blocks " LBAFU " to " LBAFU " due to alignment\n",
694                blks_start, blks_start + blks_size);
695
696         blks = fb_mmc_blk_write(dev_desc, blks_start, blks_size, NULL);
697
698         if (blks != blks_size) {
699                 pr_err("failed erasing from device %d\n", dev_desc->devnum);
700                 fastboot_fail("failed erasing from device", response);
701                 return;
702         }
703
704         printf("........ erased " LBAFU " bytes from '%s'\n",
705                blks_size * info.blksz, cmd);
706         fastboot_okay(NULL, response);
707 }