[U-Boot] [PATCH 2/2] mmc: Fix erase_grp_size for partitioned card
Pantelis Antoniou
panto at antoniou-consulting.com
Thu Oct 31 08:47:14 CET 2013
Hi Oliver,
On Oct 1, 2013, at 9:32 PM, Oliver Metz wrote:
> EXT_CSD_ERASE_GROUP_DEF is lost every time after a reset or
> power off. Set it if device has enhanced partitions.
>
> Signed-off-by: Oliver Metz <oliver at freetz.org>
> ---
> drivers/mmc/mmc.c | 17 +++++++++++++----
> include/mmc.h | 2 ++
> 2 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index ff11ff9..17c6b11 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -948,15 +948,24 @@ static int mmc_startup(struct mmc *mmc)
> }
>
> /*
> - * Check whether GROUP_DEF is set, if yes, read out
> - * group size from ext_csd directly, or calculate
> - * the group size from the csd value.
> + * 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.
> */
> - if (ext_csd[EXT_CSD_ERASE_GROUP_DEF]) {
> + if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
> + (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB)) {
> + err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
> + EXT_CSD_ERASE_GROUP_DEF, 1);
> +
> + 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;
> diff --git a/include/mmc.h b/include/mmc.h
> index 214b9ed..cb558da 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -148,6 +148,7 @@
> * EXT_CSD fields
> */
> #define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
> +#define EXT_CSD_PARTITIONS_ATTRIBUTE 156 /* R/W */
> #define EXT_CSD_PARTITIONING_SUPPORT 160 /* RO */
> #define EXT_CSD_RPMB_MULT 168 /* RO */
> #define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
> @@ -210,6 +211,7 @@
> #define MMCPART_NOAVAILABLE (0xff)
> #define PART_ACCESS_MASK (0x7)
> #define PART_SUPPORT (0x1)
> +#define PART_ENH_ATTRIB (0x1f)
>
> /* Maximum block size for MMC */
> #define MMC_MAX_BLOCK_LEN 512
> --
> 1.8.4
>
Applied, thanks.
Acked-by: Pantelis Antoniou <panto at antoniou-consulting.com>
More information about the U-Boot
mailing list