Skip to content

Commit e4df56a

Browse files
Lin Guistorulf
authored andcommitted
mmc: core: Add wp_grp_size sysfs node
The eMMC card can be set into write-protected mode to prevent data from being accidentally modified or deleted. Wp_grp_size (Write Protect Group Size) refers to an attribute of the eMMC card, used to manage write protection and is the CSD register [36:32] of the eMMC device. Wp_grp_size (Write Protect Group Size) indicates how many eMMC blocks are contained in each write protection group on the eMMC card. To allow userspace easy access of the CSD register bits, let's add sysfs node "wp_grp_size". Signed-off-by: Lin Gui <[email protected]> Signed-off-by: Bo Ye <[email protected]> Reviewed-by: AngeloGioacchino Del Regno <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Ulf Hansson <[email protected]>
1 parent b062136 commit e4df56a

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

drivers/mmc/core/mmc.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,17 @@ static void mmc_set_erase_size(struct mmc_card *card)
136136
mmc_init_erase(card);
137137
}
138138

139+
140+
static void mmc_set_wp_grp_size(struct mmc_card *card)
141+
{
142+
if (card->ext_csd.erase_group_def & 1)
143+
card->wp_grp_size = card->ext_csd.hc_erase_size *
144+
card->ext_csd.raw_hc_erase_gap_size;
145+
else
146+
card->wp_grp_size = card->csd.erase_size *
147+
(card->csd.wp_grp_size + 1);
148+
}
149+
139150
/*
140151
* Given a 128-bit response, decode to our card CSD structure.
141152
*/
@@ -186,6 +197,7 @@ static int mmc_decode_csd(struct mmc_card *card)
186197
b = UNSTUFF_BITS(resp, 37, 5);
187198
csd->erase_size = (a + 1) * (b + 1);
188199
csd->erase_size <<= csd->write_blkbits - 9;
200+
csd->wp_grp_size = UNSTUFF_BITS(resp, 32, 5);
189201
}
190202

191203
return 0;
@@ -785,6 +797,7 @@ MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
785797
MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
786798
MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9);
787799
MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9);
800+
MMC_DEV_ATTR(wp_grp_size, "%u\n", card->wp_grp_size << 9);
788801
MMC_DEV_ATTR(ffu_capable, "%d\n", card->ext_csd.ffu_capable);
789802
MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
790803
MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
@@ -845,6 +858,7 @@ static struct attribute *mmc_std_attrs[] = {
845858
&dev_attr_date.attr,
846859
&dev_attr_erase_size.attr,
847860
&dev_attr_preferred_erase_size.attr,
861+
&dev_attr_wp_grp_size.attr,
848862
&dev_attr_fwrev.attr,
849863
&dev_attr_ffu_capable.attr,
850864
&dev_attr_hwrev.attr,
@@ -1759,7 +1773,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
17591773
mmc_set_erase_size(card);
17601774
}
17611775
}
1762-
1776+
mmc_set_wp_grp_size(card);
17631777
/*
17641778
* Ensure eMMC user default partition is enabled
17651779
*/

include/linux/mmc/card.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ struct mmc_csd {
3232
unsigned int r2w_factor;
3333
unsigned int max_dtr;
3434
unsigned int erase_size; /* In sectors */
35+
unsigned int wp_grp_size;
3536
unsigned int read_blkbits;
3637
unsigned int write_blkbits;
3738
unsigned int capacity;
@@ -303,6 +304,7 @@ struct mmc_card {
303304
unsigned int eg_boundary; /* don't cross erase-group boundaries */
304305
unsigned int erase_arg; /* erase / trim / discard */
305306
u8 erased_byte; /* value of erased bytes */
307+
unsigned int wp_grp_size; /* write group size in sectors */
306308

307309
u32 raw_cid[4]; /* raw card CID */
308310
u32 raw_csd[4]; /* raw card CSD */

0 commit comments

Comments
 (0)