Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9ddd629 authored by Kyungmin Park's avatar Kyungmin Park Committed by Chris Ball
Browse files

mmc: core: mmc sanitize feature support for v4.5



In the v4.5, there's no secure erase & trim support.
Instead it supports the sanitize feature.

Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent 4e0a5adf
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -792,11 +792,18 @@ static int mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
	unsigned int from, nr, arg;
	unsigned int from, nr, arg;
	int err = 0, type = MMC_BLK_SECDISCARD;
	int err = 0, type = MMC_BLK_SECDISCARD;


	if (!mmc_can_secure_erase_trim(card)) {
	if (!(mmc_can_secure_erase_trim(card) || mmc_can_sanitize(card))) {
		err = -EOPNOTSUPP;
		err = -EOPNOTSUPP;
		goto out;
		goto out;
	}
	}


	/* The sanitize operation is supported at v4.5 only */
	if (mmc_can_sanitize(card)) {
		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
				EXT_CSD_SANITIZE_START, 1, 0);
		goto out;
	}

	from = blk_rq_pos(req);
	from = blk_rq_pos(req);
	nr = blk_rq_sectors(req);
	nr = blk_rq_sectors(req);


+1 −1
Original line number Original line Diff line number Diff line
@@ -140,7 +140,7 @@ static void mmc_queue_setup_discard(struct request_queue *q,
	/* granularity must not be greater than max. discard */
	/* granularity must not be greater than max. discard */
	if (card->pref_erase > max_discard)
	if (card->pref_erase > max_discard)
		q->limits.discard_granularity = 0;
		q->limits.discard_granularity = 0;
	if (mmc_can_secure_erase_trim(card))
	if (mmc_can_secure_erase_trim(card) || mmc_can_sanitize(card))
		queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, q);
		queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, q);
}
}


+8 −0
Original line number Original line Diff line number Diff line
@@ -1713,6 +1713,14 @@ int mmc_can_trim(struct mmc_card *card)
}
}
EXPORT_SYMBOL(mmc_can_trim);
EXPORT_SYMBOL(mmc_can_trim);


int mmc_can_sanitize(struct mmc_card *card)
{
	if (card->ext_csd.sec_feature_support & EXT_CSD_SEC_SANITIZE)
		return 1;
	return 0;
}
EXPORT_SYMBOL(mmc_can_sanitize);

int mmc_can_secure_erase_trim(struct mmc_card *card)
int mmc_can_secure_erase_trim(struct mmc_card *card)
{
{
	if (card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN)
	if (card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN)
+1 −0
Original line number Original line Diff line number Diff line
@@ -156,6 +156,7 @@ extern int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr,
		     unsigned int arg);
		     unsigned int arg);
extern int mmc_can_erase(struct mmc_card *card);
extern int mmc_can_erase(struct mmc_card *card);
extern int mmc_can_trim(struct mmc_card *card);
extern int mmc_can_trim(struct mmc_card *card);
extern int mmc_can_sanitize(struct mmc_card *card);
extern int mmc_can_secure_erase_trim(struct mmc_card *card);
extern int mmc_can_secure_erase_trim(struct mmc_card *card);
extern int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from,
extern int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from,
				   unsigned int nr);
				   unsigned int nr);
+2 −0
Original line number Original line Diff line number Diff line
@@ -275,6 +275,7 @@ struct _mmc_csd {
#define EXT_CSD_PARTITION_ATTRIBUTE	156	/* R/W */
#define EXT_CSD_PARTITION_ATTRIBUTE	156	/* R/W */
#define EXT_CSD_PARTITION_SUPPORT	160	/* RO */
#define EXT_CSD_PARTITION_SUPPORT	160	/* RO */
#define EXT_CSD_RST_N_FUNCTION		162	/* R/W */
#define EXT_CSD_RST_N_FUNCTION		162	/* R/W */
#define EXT_CSD_SANITIZE_START		165     /* W */
#define EXT_CSD_WR_REL_PARAM		166	/* RO */
#define EXT_CSD_WR_REL_PARAM		166	/* RO */
#define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */
#define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */
#define EXT_CSD_PART_CONFIG		179	/* R/W */
#define EXT_CSD_PART_CONFIG		179	/* R/W */
@@ -343,6 +344,7 @@ struct _mmc_csd {
#define EXT_CSD_SEC_ER_EN	BIT(0)
#define EXT_CSD_SEC_ER_EN	BIT(0)
#define EXT_CSD_SEC_BD_BLK_EN	BIT(2)
#define EXT_CSD_SEC_BD_BLK_EN	BIT(2)
#define EXT_CSD_SEC_GB_CL_EN	BIT(4)
#define EXT_CSD_SEC_GB_CL_EN	BIT(4)
#define EXT_CSD_SEC_SANITIZE	BIT(6)  /* v4.5 only */


#define EXT_CSD_RST_N_EN_MASK	0x3
#define EXT_CSD_RST_N_EN_MASK	0x3
#define EXT_CSD_RST_N_ENABLED	1	/* RST_n is enabled on card */
#define EXT_CSD_RST_N_ENABLED	1	/* RST_n is enabled on card */