Exemplo n.º 1
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;

	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;
}
Exemplo n.º 2
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;
}