diff mbox

[U-Boot] mmc: update MMC_ERASE argument to match Linux kernel.

Message ID 1449499801-3900-1-git-send-email-eric@nelint.com
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Eric Nelson Dec. 7, 2015, 2:50 p.m. UTC
Table 41 of the JEDEC standard for eMMC says that bit 31 of
the command argument is obsolete when issuing the ERASE
command (CMD38) on page 115 of this document:
	http://www.jedec.org/sites/default/files/docs/jesd84-B45.pdf

The SD Card Association Physical Layer Simplified Specification also
makes no mention of the use of bit 31.
	https://www.sdcard.org/downloads/pls/part1_410.pdf

The Linux kernel distinguishes between secure (bit 31 set) and
non-secure erase, and this patch copies the macro names from
include/linux/mmc/core.h.

Tested-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Eric Nelson <eric@nelint.com>
---
 drivers/mmc/mmc_write.c | 2 +-
 include/mmc.h           | 7 ++++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

Comments

Hector Palacios Dec. 9, 2015, 10:55 a.m. UTC | #1
Hi Eric and Fabio,

On 12/07/2015 03:50 PM, Eric Nelson wrote:
> Table 41 of the JEDEC standard for eMMC says that bit 31 of
> the command argument is obsolete when issuing the ERASE
> command (CMD38) on page 115 of this document:
> 	http://www.jedec.org/sites/default/files/docs/jesd84-B45.pdf
> 
> The SD Card Association Physical Layer Simplified Specification also
> makes no mention of the use of bit 31.
> 	https://www.sdcard.org/downloads/pls/part1_410.pdf
> 
> The Linux kernel distinguishes between secure (bit 31 set) and
> non-secure erase, and this patch copies the macro names from
> include/linux/mmc/core.h.
> 
> Tested-by: Fabio Estevam <fabio.estevam@freescale.com>
> Signed-off-by: Eric Nelson <eric@nelint.com>
> ---
>  drivers/mmc/mmc_write.c | 2 +-
>  include/mmc.h           | 7 ++++++-
>  2 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/mmc/mmc_write.c b/drivers/mmc/mmc_write.c
> index 7aea7e9..221bf30 100644
> --- a/drivers/mmc/mmc_write.c
> +++ b/drivers/mmc/mmc_write.c
> @@ -51,7 +51,7 @@ static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
>  		goto err_out;
>  
>  	cmd.cmdidx = MMC_CMD_ERASE;
> -	cmd.cmdarg = SECURE_ERASE;
> +	cmd.cmdarg = MMC_ERASE_ARG;
>  	cmd.resp_type = MMC_RSP_R1b;
>  
>  	err = mmc_send_cmd(mmc, &cmd, NULL);
> diff --git a/include/mmc.h b/include/mmc.h
> index cda9a19..b89962a 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -121,7 +121,12 @@
>  #define OCR_VOLTAGE_MASK	0x007FFF80
>  #define OCR_ACCESS_MODE		0x60000000
>  
> -#define SECURE_ERASE		0x80000000
> +#define MMC_ERASE_ARG		0x00000000
> +#define MMC_SECURE_ERASE_ARG	0x80000000
> +#define MMC_TRIM_ARG		0x00000001
> +#define MMC_DISCARD_ARG		0x00000003
> +#define MMC_SECURE_TRIM1_ARG	0x80000001
> +#define MMC_SECURE_TRIM2_ARG	0x80008000
>  
>  #define MMC_STATUS_MASK		(~0x0206BF7F)
>  #define MMC_STATUS_SWITCH_ERROR	(1 << 7)
> 

This fixes the issue on eMMC. Very good job! Thank you.

Tested-by: Hector Palacios <hector.palacios@digi.com>

On the uSD card, it occasionally works (when it didn't before), but it still fails
many times, after erasing a random number of blocks (at random times).
I guess this must be a different issue, though.
I could reproduce it on my board (4 data lines) and on the SabreSD (8 data lines) with
v2015.04. Here is an output from the SabreSD:

=> time mmc erase 200000 100

MMC erase: dev # 1, block # 2097152, count 256 ... 256 blocks erased: OK

time: 1.866 seconds
=> time mmc erase 200000 1000

MMC erase: dev # 1, block # 2097152, count 4096 ... Timeout waiting for DAT0 to go high!
mmc erase failed
1409 blocks erased: ERROR

time: 11.263 seconds
=> time mmc erase 200000 10000

MMC erase: dev # 1, block # 2097152, count 65536 ... Timeout waiting for DAT0 to go high!
mmc erase failed
8192 blocks erased: ERROR

time: 59.139 seconds


Thank you
--
Hector Palacios
Fabio Estevam Dec. 22, 2015, 9:55 a.m. UTC | #2
Hi Tom and Pantelis,

On Wed, Dec 9, 2015 at 8:55 AM, Hector Palacios
<hector.palacios@digi.com> wrote:
> Hi Eric and Fabio,
>
> On 12/07/2015 03:50 PM, Eric Nelson wrote:
>> Table 41 of the JEDEC standard for eMMC says that bit 31 of
>> the command argument is obsolete when issuing the ERASE
>> command (CMD38) on page 115 of this document:
>>       http://www.jedec.org/sites/default/files/docs/jesd84-B45.pdf
>>
>> The SD Card Association Physical Layer Simplified Specification also
>> makes no mention of the use of bit 31.
>>       https://www.sdcard.org/downloads/pls/part1_410.pdf
>>
>> The Linux kernel distinguishes between secure (bit 31 set) and
>> non-secure erase, and this patch copies the macro names from
>> include/linux/mmc/core.h.
>>
>> Tested-by: Fabio Estevam <fabio.estevam@freescale.com>
>> Signed-off-by: Eric Nelson <eric@nelint.com>
>> ---
>>  drivers/mmc/mmc_write.c | 2 +-
>>  include/mmc.h           | 7 ++++++-
>>  2 files changed, 7 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/mmc/mmc_write.c b/drivers/mmc/mmc_write.c
>> index 7aea7e9..221bf30 100644
>> --- a/drivers/mmc/mmc_write.c
>> +++ b/drivers/mmc/mmc_write.c
>> @@ -51,7 +51,7 @@ static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
>>               goto err_out;
>>
>>       cmd.cmdidx = MMC_CMD_ERASE;
>> -     cmd.cmdarg = SECURE_ERASE;
>> +     cmd.cmdarg = MMC_ERASE_ARG;
>>       cmd.resp_type = MMC_RSP_R1b;
>>
>>       err = mmc_send_cmd(mmc, &cmd, NULL);
>> diff --git a/include/mmc.h b/include/mmc.h
>> index cda9a19..b89962a 100644
>> --- a/include/mmc.h
>> +++ b/include/mmc.h
>> @@ -121,7 +121,12 @@
>>  #define OCR_VOLTAGE_MASK     0x007FFF80
>>  #define OCR_ACCESS_MODE              0x60000000
>>
>> -#define SECURE_ERASE         0x80000000
>> +#define MMC_ERASE_ARG                0x00000000
>> +#define MMC_SECURE_ERASE_ARG 0x80000000
>> +#define MMC_TRIM_ARG         0x00000001
>> +#define MMC_DISCARD_ARG              0x00000003
>> +#define MMC_SECURE_TRIM1_ARG 0x80000001
>> +#define MMC_SECURE_TRIM2_ARG 0x80008000
>>
>>  #define MMC_STATUS_MASK              (~0x0206BF7F)
>>  #define MMC_STATUS_SWITCH_ERROR      (1 << 7)
>>
>
> This fixes the issue on eMMC. Very good job! Thank you.
>
> Tested-by: Hector Palacios <hector.palacios@digi.com>

Could this one be applied to 2016.01?

Thanks
Tom Rini Jan. 4, 2016, 10:23 p.m. UTC | #3
On Mon, Dec 07, 2015 at 07:50:01AM -0700, Eric Nelson wrote:

> Table 41 of the JEDEC standard for eMMC says that bit 31 of
> the command argument is obsolete when issuing the ERASE
> command (CMD38) on page 115 of this document:
> 	http://www.jedec.org/sites/default/files/docs/jesd84-B45.pdf
> 
> The SD Card Association Physical Layer Simplified Specification also
> makes no mention of the use of bit 31.
> 	https://www.sdcard.org/downloads/pls/part1_410.pdf
> 
> The Linux kernel distinguishes between secure (bit 31 set) and
> non-secure erase, and this patch copies the macro names from
> include/linux/mmc/core.h.
> 
> Tested-by: Fabio Estevam <fabio.estevam@freescale.com>
> Signed-off-by: Eric Nelson <eric@nelint.com>
> Tested-by: Hector Palacios <hector.palacios@digi.com>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/drivers/mmc/mmc_write.c b/drivers/mmc/mmc_write.c
index 7aea7e9..221bf30 100644
--- a/drivers/mmc/mmc_write.c
+++ b/drivers/mmc/mmc_write.c
@@ -51,7 +51,7 @@  static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
 		goto err_out;
 
 	cmd.cmdidx = MMC_CMD_ERASE;
-	cmd.cmdarg = SECURE_ERASE;
+	cmd.cmdarg = MMC_ERASE_ARG;
 	cmd.resp_type = MMC_RSP_R1b;
 
 	err = mmc_send_cmd(mmc, &cmd, NULL);
diff --git a/include/mmc.h b/include/mmc.h
index cda9a19..b89962a 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -121,7 +121,12 @@ 
 #define OCR_VOLTAGE_MASK	0x007FFF80
 #define OCR_ACCESS_MODE		0x60000000
 
-#define SECURE_ERASE		0x80000000
+#define MMC_ERASE_ARG		0x00000000
+#define MMC_SECURE_ERASE_ARG	0x80000000
+#define MMC_TRIM_ARG		0x00000001
+#define MMC_DISCARD_ARG		0x00000003
+#define MMC_SECURE_TRIM1_ARG	0x80000001
+#define MMC_SECURE_TRIM2_ARG	0x80008000
 
 #define MMC_STATUS_MASK		(~0x0206BF7F)
 #define MMC_STATUS_SWITCH_ERROR	(1 << 7)