MMC: fix user capacity for partitioned eMMC card
PATCH 1/1 MMC: fix user capacity for partitioned eMMC card
From: Markus Niebel <[email protected]>
if the card claims to be high capacity and the card is partitioned the capacity shall still be read from ext_csd SEC_COUNT even if the resulting capacity is smaller than 2 GiB
--- drivers/mmc/mmc.c | 15 +++++++++++++++ include/mmc.h | 3 +++ 2 files changed, 18 insertions(+)
drivers/mmc/mmc.c +15 -0
@@ -1022,6 +1022,21 @@ static int mmc_startup(struct mmc *mmc) mmc->erase_grp_size = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE ] *MMC_MAX_BLOCK_LEN *1024 ; +/* +* if high capacity and partition setting completed +* SEC_COUNT is valid even if it is smaller than 2 GiB +* JEDEC Standard JESD84-B45, 6.2.4 +*/ +if (mmc->high_capacity && + (ext_csd[EXT_CSD_PARTITION_SETTING ] & +EXT_CSD_PARTITION_SETTING_COMPLETED )) { + capacity = (ext_csd[EXT_CSD_SEC_CNT ]) | + (ext_csd[EXT_CSD_SEC_CNT +1 ] <<8 ) | + (ext_csd[EXT_CSD_SEC_CNT +2 ] <<16 ) | + (ext_csd[EXT_CSD_SEC_CNT +3 ] <<24 ); + capacity *=MMC_MAX_BLOCK_LEN ; + mmc->capacity_user = capacity; + } }else {/* Calculate the group size from the csd value. */ int erase_gsz, erase_gmul;
include/mmc.h +3 -0
@@ -147,6 +147,7 @@* EXT_CSD fields */ #define EXT_CSD_GP_SIZE_MULT 143/* R/W */ +#define EXT_CSD_PARTITION_SETTING 155/* R/W */ #define EXT_CSD_PARTITIONS_ATTRIBUTE 156/* R/W */ #define EXT_CSD_PARTITIONING_SUPPORT 160/* RO */ #define EXT_CSD_RST_N_FUNCTION 162/* R/W */
@@ -197,6 +198,8 @@#define EXT_CSD_BOOT_BUS_WIDTH_RESET (x) (x << 2)#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH (x) (x) +#define EXT_CSD_PARTITION_SETTING_COMPLETED (1 << 0) +#define R1_ILLEGAL_COMMAND (1 << 22)#define R1_APP_CMD (1 << 5)
Signature · 1 line
2.1.1
PATCH 1/1 MMC: fix user capacity for partitioned eMMC card
Hi, Markus.
Quoted 6 lines · Markus Niebel
From: Markus Niebel <[email protected]>
if the card claims to be high capacity and the card is partitioned the capacity shall still be read from
ext_csdSEC_COUNTeven if the resulting capacity is smaller than 2 GiB
I have one question.
"smaller than 2GiB" means the size after completed partition?
Best Regards,
Jaehoon Chung
Quoted 55 lines
Signed-off-by Markus Niebel <[email protected]>--- drivers/mmc/mmc.c | 15 +++++++++++++++ include/mmc.h | 3 +++ 2 files changed, 18 insertions(+)drivers/mmc/mmc.c +15
-0@@ -1022,6 +1022,21 @@ static int mmc_startup(struct mmc *mmc) mmc->erase_grp_size = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE ] *MMC_MAX_BLOCK_LEN *1024 ; +/* +* if high capacity and partition setting completed +* SEC_COUNT is valid even if it is smaller than 2 GiB +* JEDEC Standard JESD84-B45, 6.2.4 +*/ +if (mmc->high_capacity && + (ext_csd[EXT_CSD_PARTITION_SETTING ] & +EXT_CSD_PARTITION_SETTING_COMPLETED )) { + capacity = (ext_csd[EXT_CSD_SEC_CNT ]) | + (ext_csd[EXT_CSD_SEC_CNT +1 ] <<8 ) | + (ext_csd[EXT_CSD_SEC_CNT +2 ] <<16 ) | + (ext_csd[EXT_CSD_SEC_CNT +3 ] <<24 ); + capacity *=MMC_MAX_BLOCK_LEN ; + mmc->capacity_user = capacity; + } }else {/* Calculate the group size from the csd value. */ int erase_gsz, erase_gmul;include/mmc.h +3
-0@@ -147,6 +147,7 @@* EXT_CSD fields */ #define EXT_CSD_GP_SIZE_MULT 143/* R/W */ +#define EXT_CSD_PARTITION_SETTING 155/* R/W */ #define EXT_CSD_PARTITIONS_ATTRIBUTE 156/* R/W */ #define EXT_CSD_PARTITIONING_SUPPORT 160/* RO */ #define EXT_CSD_RST_N_FUNCTION 162/* R/W */ @@ -197,6 +198,8 @@#define EXT_CSD_BOOT_BUS_WIDTH_RESET (x) (x << 2)#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH (x) (x) +#define EXT_CSD_PARTITION_SETTING_COMPLETED (1 << 0) +#define R1_ILLEGAL_COMMAND (1 << 22)#define R1_APP_CMD (1 << 5)
PATCH 1/1 MMC: fix user capacity for partitioned eMMC card
Hello Jaehoon Chung
Am 21.11.2014 um 11:50 schrieb Jaehoon Chung:
Quoted 5 lines
Hi, Markus.
Quoted 2 lines · Markus Niebel
From: Markus Niebel <[email protected]>
Quoted 7 lines
Quoted 4 lines
if the card claims to be high capacity and the card is partitioned the capacity shall still be read from
ext_csdSEC_COUNTeven if the resulting capacity is smaller than 2 GiBI have one question.
"smaller than 2GiB" means the size after completed partition?
Yes. Some cards enable a pseudo SLC mode using the enhanced partition attribute. This results in reduced sizes after completion.
Tested with a 4 GB Micron eMMC (resulting size is around 1.8 GiB)
Quoted 4 lines
Best Regards,
Jaehoon Chung
Best Regards
Markus Niebel
PATCH 1/1 MMC: fix user capacity for partitioned eMMC card
In reply to Jaehoon ChungHi, Markus.
It's reasonable, looks good to me.
Best Regards,
Jaehoon Chung
Quoted 77 lines · Jaehoon Chung
Hi, Markus.
Quoted 6 lines · Markus Niebel
From: Markus Niebel <[email protected]>
if the card claims to be high capacity and the card is partitioned the capacity shall still be read from
ext_csdSEC_COUNTeven if the resulting capacity is smaller than 2 GiBI have one question.
"smaller than 2GiB" means the size after completed partition?Best Regards,
Jaehoon ChungQuoted 47 lines
Signed-off-by Markus Niebel <[email protected]>--- drivers/mmc/mmc.c | 15 +++++++++++++++ include/mmc.h | 3 +++ 2 files changed, 18 insertions(+)drivers/mmc/mmc.c +15
-0@@ -1022,6 +1022,21 @@ static int mmc_startup(struct mmc *mmc) mmc->erase_grp_size = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE ] *MMC_MAX_BLOCK_LEN *1024 ; +/* +* if high capacity and partition setting completed +* SEC_COUNT is valid even if it is smaller than 2 GiB +* JEDEC Standard JESD84-B45, 6.2.4 +*/ +if (mmc->high_capacity && + (ext_csd[EXT_CSD_PARTITION_SETTING ] & +EXT_CSD_PARTITION_SETTING_COMPLETED )) { + capacity = (ext_csd[EXT_CSD_SEC_CNT ]) | + (ext_csd[EXT_CSD_SEC_CNT +1 ] <<8 ) | + (ext_csd[EXT_CSD_SEC_CNT +2 ] <<16 ) | + (ext_csd[EXT_CSD_SEC_CNT +3 ] <<24 ); + capacity *=MMC_MAX_BLOCK_LEN ; + mmc->capacity_user = capacity; + } }else {/* Calculate the group size from the csd value. */ int erase_gsz, erase_gmul;include/mmc.h +1
-0@@ -147,6 +147,7 @@* EXT_CSD fields */ #define EXT_CSD_GP_SIZE_MULT 143/* R/W */ +#define EXT_CSD_PARTITION_SETTING 155/* R/W */ #define EXT_CSD_PARTITIONS_ATTRIBUTE 156/* R/W */ #define EXT_CSD_PARTITIONING_SUPPORT 160/* RO */ #define EXT_CSD_RST_N_FUNCTION 162/* R/W */ include/mmc.h line 205
Quoted 8 lines
include/mmc.h +2
-0@@ -197,6 +198,8 @@#define EXT_CSD_BOOT_BUS_WIDTH_RESET (x) (x << 2)#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH (x) (x) +#define EXT_CSD_PARTITION_SETTING_COMPLETED (1 << 0) +#define R1_ILLEGAL_COMMAND (1 << 22)#define R1_APP_CMD (1 << 5)_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot
Pantelis Antoniou
AppliedPATCH 1/1 MMC: fix user capacity for partitioned eMMC card
In reply to Markus NiebelHi Markus,
Looks good to me.
Quoted 65 lines · Markus Niebel
From: Markus Niebel <[email protected]>
if the card claims to be high capacity and the card is partitioned the capacity shall still be read from
ext_csdSEC_COUNTeven if the resulting capacity is smaller than 2 GiBSigned-off-by Markus Niebel <[email protected]>---
drivers/mmc/mmc.c| 15 +++++++++++++++include/mmc.h| 3 +++2 files changed, 18 insertions(+)drivers/mmc/mmc.c +15
-0@@ -1022,6 +1022,21 @@ static int mmc_startup(struct mmc *mmc) mmc->erase_grp_size = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE ] *MMC_MAX_BLOCK_LEN *1024 ; +/* +* if high capacity and partition setting completed +* SEC_COUNT is valid even if it is smaller than 2 GiB +* JEDEC Standard JESD84-B45, 6.2.4 +*/ +if (mmc->high_capacity && + (ext_csd[EXT_CSD_PARTITION_SETTING ] & +EXT_CSD_PARTITION_SETTING_COMPLETED )) { + capacity = (ext_csd[EXT_CSD_SEC_CNT ]) | + (ext_csd[EXT_CSD_SEC_CNT +1 ] <<8 ) | + (ext_csd[EXT_CSD_SEC_CNT +2 ] <<16 ) | + (ext_csd[EXT_CSD_SEC_CNT +3 ] <<24 ); + capacity *=MMC_MAX_BLOCK_LEN ; + mmc->capacity_user = capacity; + } }else {/* Calculate the group size from the csd value. */ int erase_gsz, erase_gmul;include/mmc.h +3
-0@@ -147,6 +147,7 @@* EXT_CSD fields */ #define EXT_CSD_GP_SIZE_MULT 143/* R/W */ +#define EXT_CSD_PARTITION_SETTING 155/* R/W */ #define EXT_CSD_PARTITIONS_ATTRIBUTE 156/* R/W */ #define EXT_CSD_PARTITIONING_SUPPORT 160/* RO */ #define EXT_CSD_RST_N_FUNCTION 162/* R/W */ @@ -197,6 +198,8 @@#define EXT_CSD_BOOT_BUS_WIDTH_RESET (x) (x << 2)#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH (x) (x) +#define EXT_CSD_PARTITION_SETTING_COMPLETED (1 << 0) +#define R1_ILLEGAL_COMMAND (1 << 22)#define R1_APP_CMD (1 << 5)Signature · 1 line
2.1.1
Thanks, applied.
? Pantelis