Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <lin.gui@mediatek.com>
Signed-off-by: Bo Ye <bo.ye@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/20231218230532.82427-1-bo.ye@mediatek.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Lin Gui and committed by
Ulf Hansson
e4df56ad b062136d

+17 -1
+15 -1
drivers/mmc/core/mmc.c
··· 136 136 mmc_init_erase(card); 137 137 } 138 138 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 + 139 150 /* 140 151 * Given a 128-bit response, decode to our card CSD structure. 141 152 */ ··· 197 186 b = UNSTUFF_BITS(resp, 37, 5); 198 187 csd->erase_size = (a + 1) * (b + 1); 199 188 csd->erase_size <<= csd->write_blkbits - 9; 189 + csd->wp_grp_size = UNSTUFF_BITS(resp, 32, 5); 200 190 } 201 191 202 192 return 0; ··· 797 785 MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year); 798 786 MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9); 799 787 MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9); 788 + MMC_DEV_ATTR(wp_grp_size, "%u\n", card->wp_grp_size << 9); 800 789 MMC_DEV_ATTR(ffu_capable, "%d\n", card->ext_csd.ffu_capable); 801 790 MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev); 802 791 MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid); ··· 858 845 &dev_attr_date.attr, 859 846 &dev_attr_erase_size.attr, 860 847 &dev_attr_preferred_erase_size.attr, 848 + &dev_attr_wp_grp_size.attr, 861 849 &dev_attr_fwrev.attr, 862 850 &dev_attr_ffu_capable.attr, 863 851 &dev_attr_hwrev.attr, ··· 1773 1759 mmc_set_erase_size(card); 1774 1760 } 1775 1761 } 1776 - 1762 + mmc_set_wp_grp_size(card); 1777 1763 /* 1778 1764 * Ensure eMMC user default partition is enabled 1779 1765 */
+2
include/linux/mmc/card.h
··· 32 32 unsigned int r2w_factor; 33 33 unsigned int max_dtr; 34 34 unsigned int erase_size; /* In sectors */ 35 + unsigned int wp_grp_size; 35 36 unsigned int read_blkbits; 36 37 unsigned int write_blkbits; 37 38 unsigned int capacity; ··· 304 303 unsigned int eg_boundary; /* don't cross erase-group boundaries */ 305 304 unsigned int erase_arg; /* erase / trim / discard */ 306 305 u8 erased_byte; /* value of erased bytes */ 306 + unsigned int wp_grp_size; /* write group size in sectors */ 307 307 308 308 u32 raw_cid[4]; /* raw card CID */ 309 309 u32 raw_csd[4]; /* raw card CSD */