[PATCH] drivers: mmc: support secure erase.
Jaehoon Chung
jh80.chung at samsung.com
Tue Dec 22 00:05:30 CET 2020
Hi,
CC'd Peng (mmc maintainer).
On 12/18/20 10:21 PM, dennis wrote:
> According to the JEDEC Standard, eMMC v4.4 cards can supoort secure erase.
> the first bit in ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] - EXT_CSD_SEC_ER_EN
> is used to check if secure erase supoort by the device.
%s/supoort/supports/
Anyway, i don't know what
>
> Signed-off-by: dennis <dennislaplacian1 at gmail.com>
> ---
> drivers/mmc/Kconfig | 8 ++++++++
> drivers/mmc/mmc.c | 4 ++++
> drivers/mmc/mmc_write.c | 16 +++++++++++++---
> include/mmc.h | 5 ++++-
> 4 files changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig
> index 14d7913986..6105cbe960 100644
> --- a/drivers/mmc/Kconfig
> +++ b/drivers/mmc/Kconfig
> @@ -18,6 +18,14 @@ config MMC_WRITE
> help
> Enable write access to MMC and SD Cards
>
> +config MMC_SECURE_ERASE
> + bool "Enable secure erase for eMMC"
> + depends on MMC_WRITE
> + default n
> + help
> + This option replace the default erase with secure erase in eMMC v4.4
> + and above cards.
> +
> config MMC_BROKEN_CD
> bool "Poll for broken card detection case"
> help
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index a6394bcf30..56b17070e7 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -2272,6 +2272,10 @@ static int mmc_startup_v4(struct mmc *mmc)
> if ((capacity >> 20) > 2 * 1024)
> mmc->capacity_user = capacity;
> }
> +#if CONFIG_IS_ENABLED(MMC_SECURE_ERASE)
> + if (mmc->version >= MMC_VERSION_4_4 && IS_MMC(mmc))
if (IS_ENABLED())?
> + mmc->sec_feature_support = ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
> +#endif
>
> if (mmc->version >= MMC_VERSION_4_5)
> mmc->gen_cmd6_time = ext_csd[EXT_CSD_GENERIC_CMD6_TIME];
> diff --git a/drivers/mmc/mmc_write.c b/drivers/mmc/mmc_write.c
> index 6a4453ca02..0b720ccf7e 100644
> --- a/drivers/mmc/mmc_write.c
> +++ b/drivers/mmc/mmc_write.c
> @@ -15,7 +15,7 @@
> #include <linux/math64.h>
> #include "mmc_private.h"
>
> -static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
> +static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt, uint arg)
> {
> struct mmc_cmd cmd;
> ulong end;
> @@ -52,7 +52,7 @@ static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
> goto err_out;
>
> cmd.cmdidx = MMC_CMD_ERASE;
> - cmd.cmdarg = MMC_ERASE_ARG;
> + cmd.cmdarg = arg;
> cmd.resp_type = MMC_RSP_R1b;
>
> err = mmc_send_cmd(mmc, &cmd, NULL);
> @@ -81,6 +81,7 @@ ulong mmc_berase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt)
> struct mmc *mmc = find_mmc_device(dev_num);
> lbaint_t blk = 0, blk_r = 0;
> int timeout_ms = 1000;
> + uint arg = MMC_ERASE_ARG;
>
> if (!mmc)
> return -1;
> @@ -105,6 +106,15 @@ ulong mmc_berase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt)
> ((start + blkcnt + mmc->erase_grp_size)
> & ~(mmc->erase_grp_size - 1)) - 1);
>
> +#if CONFIG_IS_ENABLED(MMC_SECURE_ERASE)
> + if (!(mmc->sec_feature_support & EXT_CSD_SEC_ER_EN)) {
ditto. if (IS_ENABLED()) instead of #if.
And i don't know why doesn't check this in mmc_erase_t().
Then it doesn't need to pass arg as argument.
> + printf("secure erase not supported on device\n"
> + "perform insecure erase\n");
> + } else {
> + arg = MMC_SECURE_ERASE_ARG;
> + }
> +#endif
> +
> while (blk < blkcnt) {
> if (IS_SD(mmc) && mmc->ssr.au) {
> blk_r = ((blkcnt - blk) > mmc->ssr.au) ?
> @@ -113,7 +123,7 @@ ulong mmc_berase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt)
> blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
> mmc->erase_grp_size : (blkcnt - blk);
> }
> - err = mmc_erase_t(mmc, start + blk, blk_r);
> + err = mmc_erase_t(mmc, start + blk, blk_r, arg);
> if (err)
> break;
>
> diff --git a/include/mmc.h b/include/mmc.h
> index 1d377e0281..bfdc712bdd 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -80,7 +80,6 @@ struct bd_info;
> #define MMC_MODE_1BIT BIT(28)
> #define MMC_MODE_SPI BIT(27)
>
> -
Not need to touch this.
> #define SD_DATA_4BIT 0x00040000
>
> #define IS_SD(x) ((x)->version & SD_VERSION_SD)
> @@ -240,6 +239,7 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
> #define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */
> #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
> #define EXT_CSD_BOOT_MULT 226 /* RO */
> +#define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */
> #define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
> #define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
>
> @@ -247,6 +247,8 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
> * EXT_CSD field definitions
> */
>
> +#define EXT_CSD_SEC_ER_EN BIT(0)
> +
> #define EXT_CSD_CMD_SET_NORMAL (1 << 0)
> #define EXT_CSD_CMD_SET_SECURE (1 << 1)
> #define EXT_CSD_CMD_SET_CPSECURE (1 << 2)
> @@ -690,6 +692,7 @@ struct mmc {
> uint tran_speed;
> uint legacy_speed; /* speed for the legacy mode provided by the card */
> uint read_bl_len;
> + u8 sec_feature_support;
This is located at below under MMC_WRITE and it's only used when MMC_SECURE_ERASE is enabled.
Best Regards,
Jaehoon Chung
> #if CONFIG_IS_ENABLED(MMC_WRITE)
> uint write_bl_len;
> uint erase_grp_size; /* in 512-byte sectors */
>
More information about the U-Boot
mailing list