/* * Function: mmc erase card * Arg : Block address & length * Return : Returns 0 * Flow : Erase the card from specified addr */ uint32_t mmc_erase_card(uint64_t addr, uint64_t len) { struct mmc_device *dev; dev = target_mmc_device(); ASSERT(!(addr % MMC_BLK_SZ)); ASSERT(!(len % MMC_BLK_SZ)); if (mmc_sdhci_erase(dev, (addr / MMC_BLK_SZ), len)) { dprintf(CRITICAL, "MMC erase failed\n"); return 1; } return 0; }
/* * Function: mmc erase card * Arg : Block address & length * Return : Returns 0 * Flow : Erase the card from specified addr */ uint32_t mmc_erase_card(uint64_t addr, uint64_t len) { struct mmc_device *dev; uint32_t block_size; uint32_t unaligned_blks; uint32_t head_unit; uint32_t tail_unit; uint32_t erase_unit_sz; uint32_t blk_addr; uint32_t blk_count; uint64_t blks_to_erase; block_size = mmc_get_device_blocksize(); dev = target_mmc_device(); ASSERT(!(addr % block_size)); ASSERT(!(len % block_size)); if (target_mmc_device()) { erase_unit_sz = mmc_get_eraseunit_size(); dprintf(SPEW, "erase_unit_sz:0x%x\n", erase_unit_sz); blk_addr = addr / block_size; blk_count = len / block_size; dprintf(INFO, "Erasing card: 0x%x:0x%x\n", blk_addr, blk_count); head_unit = blk_addr / erase_unit_sz; tail_unit = (blk_addr + blk_count - 1) / erase_unit_sz; if (tail_unit - head_unit <= 1) { dprintf(INFO, "SDHCI unit erase not required\n"); return mmc_zero_out(dev, blk_addr, blk_count); } unaligned_blks = erase_unit_sz - (blk_addr % erase_unit_sz); if (unaligned_blks < erase_unit_sz) { dprintf(SPEW, "Handling unaligned head blocks\n"); if (mmc_zero_out(dev, blk_addr, unaligned_blks)) return 1; blk_addr += unaligned_blks; blk_count -= unaligned_blks; head_unit = blk_addr / erase_unit_sz; tail_unit = (blk_addr + blk_count - 1) / erase_unit_sz; if (tail_unit - head_unit <= 1) { dprintf(INFO, "SDHCI unit erase not required\n"); return mmc_zero_out(dev, blk_addr, blk_count); } } unaligned_blks = blk_count % erase_unit_sz; blks_to_erase = blk_count - unaligned_blks; dprintf(SPEW, "Performing SDHCI erase: 0x%x:0x%x\n", blk_addr,(unsigned int)blks_to_erase); if (mmc_sdhci_erase((struct mmc_device *)dev, blk_addr, blks_to_erase * block_size)) { dprintf(CRITICAL, "MMC erase failed\n"); return 1; } blk_addr += blks_to_erase; if (unaligned_blks) { dprintf(SPEW, "Handling unaligned tail blocks\n"); if (mmc_zero_out(dev, blk_addr, unaligned_blks)) return 1; } } else { if(ufs_erase((struct ufs_dev *)dev, addr, (len / block_size))) { dprintf(CRITICAL, "mmc_erase_card: UFS erase failed\n"); return 1; } } return 0; }