From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zhang Haijun Date: Fri, 10 Jan 2014 11:49:26 +0800 Subject: [U-Boot] [PATCH 2/7 V5] mmc: Get secure erase information from card In-Reply-To: <39F67368-4E0F-4F01-88CC-9E7499870257@antoniou-consulting.com> References: <1388391658-28560-1-git-send-email-haijun.zhang@freescale.com> <1388391658-28560-2-git-send-email-haijun.zhang@freescale.com> <39F67368-4E0F-4F01-88CC-9E7499870257@antoniou-consulting.com> Message-ID: <52CF6DC6.4060102@freescale.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Ok, Thanks. Regards, Haijun. ? 2014/1/9 19:09, Pantelis Antoniou ??: > Hi Haijun, > > Since this is part of the core mmc functionality, I'll > need to run some test on some board that are affected. > > Pending verification and testing from now on. > > Regards > > -- Pantelis > > On Dec 30, 2013, at 10:20 AM, Haijun Zhang wrote: > >> Read command class from csd register and secure erase >> support bit from ext csd register. Also calculate the erase >> timeout and secure erase timeout. >> >> If read ext csd error, error status should be returned instead of >> giving some incorrect information. >> >> Error log: >> => >> => mmcinfo >> Device: FSL_SDHC >> Manufacturer ID: 0 >> OEM: 0 >> Name: Tran Speed: 0 >> Rd Block Len: 0 >> MMC version 0.0 >> High Capacity: No >> Capacity: 0 Bytes >> Bus Width: 1-bit >> => >> >> Signed-off-by: Haijun Zhang >> --- >> changes for V5: >> - Exclude the judgement of EXT_CSD_REV in case of read EXT_CSD err >> >> drivers/mmc/mmc.c | 54 +++++++++++++++++++++++++++++++++++++++--------------- >> 1 file changed, 39 insertions(+), 15 deletions(-) >> >> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c >> index e1461a9..da06990 100644 >> --- a/drivers/mmc/mmc.c >> +++ b/drivers/mmc/mmc.c >> @@ -871,6 +871,8 @@ static int mmc_startup(struct mmc *mmc) >> } >> } >> >> + mmc->cmdclass = (cmd.response[1] >> 20) & 0xfff; >> + >> /* divide frequency by 10, since the mults are 10x bigger */ >> freq = fbase[(cmd.response[0] & 0x7)]; >> mult = multipliers[((cmd.response[0] >> 3) & 0xf)]; >> @@ -925,8 +927,10 @@ static int mmc_startup(struct mmc *mmc) >> mmc->part_config = MMCPART_NOAVAILABLE; >> if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) { >> /* check ext_csd version and capacity */ >> - err = mmc_send_ext_csd(mmc, ext_csd); >> - if (!err && (ext_csd[EXT_CSD_REV] >= 2)) { >> + if (mmc_send_ext_csd(mmc, ext_csd)) >> + return COMM_ERR; >> + >> + if (ext_csd[EXT_CSD_REV] >= 2) { >> /* >> * According to the JEDEC Standard, the value of >> * ext_csd's capacity is valid if the value is more >> @@ -960,6 +964,39 @@ static int mmc_startup(struct mmc *mmc) >> } >> >> /* >> + * The granularity of the erasable units is the Erase Group:The >> + * smallest number of consecutive write blocks which can be >> + * addressed for erase. The size of the Erase Group is card >> + * specific and stored in the CSD when ERASE_GROUP_DEF is >> + * disabled, and in the EXT_CSD when ERASE_GROUP_DEF is >> + * enabled. >> + */ >> + if (ext_csd[EXT_CSD_ERASE_GROUP_DEF]) { >> + mmc->erase_grp_size = >> + ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024; >> + >> + mmc->erase_timeout_mult = 300 * >> + ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]; >> + } else { >> + /* Calculate the group size from the csd value. */ >> + int erase_gsz, erase_gmul; >> + erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10; >> + erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5; >> + mmc->erase_grp_size = (erase_gsz + 1) >> + * (erase_gmul + 1); >> + } >> + >> + if (ext_csd[EXT_CSD_REV] >= 4) { >> + mmc->sec_feature_support = >> + ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]; >> + mmc->sec_erase_mult = >> + ext_csd[EXT_CSD_SEC_ERASE_MULT]; >> + mmc->sec_erase_timeout = 300 * >> + ext_csd[EXT_CSD_SEC_ERASE_MULT] * >> + ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]; >> + } >> + >> + /* >> * Host needs to enable ERASE_GRP_DEF bit if device is >> * partitioned. This bit will be lost every time after a reset >> * or power off. This will affect erase size. >> @@ -971,20 +1008,7 @@ static int mmc_startup(struct mmc *mmc) >> >> if (err) >> return err; >> - >> - /* Read out group size from ext_csd */ >> - mmc->erase_grp_size = >> - ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * >> - MMC_MAX_BLOCK_LEN * 1024; >> - } else { >> - /* Calculate the group size from the csd value. */ >> - int erase_gsz, erase_gmul; >> - erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10; >> - erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5; >> - mmc->erase_grp_size = (erase_gsz + 1) >> - * (erase_gmul + 1); >> } >> - >> /* store the partition info of emmc */ >> if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) || >> ext_csd[EXT_CSD_BOOT_MULT]) >> -- >> 1.8.4.1 >> >> > >