summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorPeng Fan <van.freenix@gmail.com>2016-09-01 11:13:39 +0800
committerPeng Fan <peng.fan@nxp.com>2016-10-18 15:34:19 +0800
commita9beae5f9be6358036ef328c75bf5b40eaf94581 (patch)
treeac0412cf433ca7e4617634cb05a5f4b4346aba77 /drivers/mmc
parentbe950ab9d0625ae1a23c7a5e03dde8e5a676ea80 (diff)
downloadu-boot-imx-a9beae5f9be6358036ef328c75bf5b40eaf94581.zip
u-boot-imx-a9beae5f9be6358036ef328c75bf5b40eaf94581.tar.gz
u-boot-imx-a9beae5f9be6358036ef328c75bf5b40eaf94581.tar.bz2
mmc: sd: optimize erase
To SD, there is no erase group, then the value erase_grp_size will be default 1. When erasing SD blocks, the blocks will be erased one by one, which is time consuming. We use AU_SIZE as a group to speed up the erasing. Erasing 4MB with a SD2.0 Card with AU_SIZE 4MB. `time mmc erase 0x100000 0x2000` time: 44.856 seconds (before optimization) time: 0.335 seconds (after optimization) Signed-off-by: Peng Fan <peng.fan@nxp.com> Cc: Jaehoon Chung <jh80.chung@samsung.com> Cc: Simon Glass <sjg@chromium.org> Cc: Bin Meng <bmeng.cn@gmail.com> Cc: Stefan Wahren <stefan.wahren@i2se.com> Cc: Clemens Gruber <clemens.gruber@pqgruber.com> Cc: Kever Yang <kever.yang@rock-chips.com> Cc: Eric Nelson <eric@nelint.com> Cc: Stephen Warren <swarren@nvidia.com> (cherry picked from commit e492dbb41e025ac1a7d7934b1df52b2f0485f8dd)
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/mmc_write.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/mmc/mmc_write.c b/drivers/mmc/mmc_write.c
index 79b8c4d..d26c25f 100644
--- a/drivers/mmc/mmc_write.c
+++ b/drivers/mmc/mmc_write.c
@@ -98,8 +98,13 @@ unsigned long mmc_berase(block_dev_desc_t *block_dev, lbaint_t start,
& ~(mmc->erase_grp_size - 1)) - 1);
while (blk < blkcnt) {
- blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
- mmc->erase_grp_size : (blkcnt - blk);
+ if (IS_SD(mmc) && mmc->ssr.au) {
+ blk_r = ((blkcnt - blk) > mmc->ssr.au) ?
+ mmc->ssr.au : (blkcnt - blk);
+ } else {
+ blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
+ mmc->erase_grp_size : (blkcnt - blk);
+ }
err = mmc_erase_t(mmc, start + blk, blk_r);
if (err)
break;