linux-mmc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* mmc-utils changes for Erase commands.
@ 2019-12-10 22:51 Kimito Sakata
  2019-12-12 13:43 ` Avri Altman
  0 siblings, 1 reply; 3+ messages in thread
From: Kimito Sakata @ 2019-12-10 22:51 UTC (permalink / raw)
  To: linux-mmc; +Cc: chrisball, Nachi Nachiappan

mmc.h
36a37,45
 > #define MMC_ERASE_GROUP_START   35    /* ac   [31:0] data addr   R1  */
 > #define MMC_ERASE_GROUP_END     36    /* ac   [31:0] data addr   R1  */
 > #define MMC_ERASE               38    /* ac   [31] Secure request
 >                                               [30:16] set to 0
 >                                               [15] Force Garbage 
Collect request4
 >                                               [14:2] set to 0
 >                                               [1] Discard Enable
 >                                               [0] Identify Write 
Blocks for Erase (or TRIM Enable)
 > R1b */

mmc_cmds.h
33a34
 > int do_erase(int nargs, char **argv);

mmc_cmds.c
226a227,291
 > int erase(int fd, __u32 argin, __u32 start, __u32 end)
 > {
 >         int ret = 0;
 >     struct mmc_ioc_cmd idata;
 >     __u32  response;
 >
 >     // Set Start address
 >     memset(&idata, 0, sizeof(idata));
 >     idata.opcode = MMC_ERASE_GROUP_START;
 >     idata.arg = start;
 >     idata.flags = MMC_RSP_R1 | MMC_CMD_AC;
 >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
 >     if (ret)  {
 >       perror("ioctl");
 >       printf("Erase Group Start Address command failed\n");
 >       return ret;
 >     }
 >     ret = send_status(fd, &response);
 >     if (response & 0xFFF900C0) {
 >       printf("CMD13 returns: 0x%08x during CMD35\n", response);
 >     }
 >
 >     // Set end address
 >     memset(&idata, 0, sizeof(idata));
 >     idata.opcode = MMC_ERASE_GROUP_END;
 >     idata.arg = end;
 >     idata.flags = MMC_RSP_R1 | MMC_CMD_AC;
 >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
 >     if (ret) {
 >       perror("ioctl");
 >       printf("Erase Group End Address command failed\n");
 >       return ret;
 >     }
 >     ret = send_status(fd, &response);
 >     if (response & 0xFFF900C0)
 >       printf("CMD13 returns: 0x%08x during CMD36\n", response);
 >
 >     // Send Erase Command
 >     memset(&idata, 0, sizeof(idata));
 >     idata.opcode = MMC_ERASE;
 >     idata.arg = argin;
 >     idata.cmd_timeout_ms = 60000;
 >     idata.data_timeout_ns = 60000000;
 >     idata.flags = MMC_RSP_R1B | MMC_CMD_AC;
 >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
 >     if (ret)  {
 >       perror("ioctl");
 >       printf("Erase command failed\n");
 >       return ret;
 >     }
 >
 >     // Send Status Command
 >     // 1098 7654 3210 9876 5432 1098 7654 3210
 >     // 3322 2222 2222 1111 1111 1100 0000 0000
 >     // 1111 1111 1111 1xx1 xxxx xxxx 11xx xxxx  Device Status Error bits
 >     // F    F    F    9    0    0    C    0     0xFFF900C0
 >     ret = send_status(fd, &response);
 >     if (response & 0xFFF900C0)
 >       printf("CMD13 returns: 0x%08x during CMD38\n", response);
 >     if (ret)
 >       printf("Send Status Command returned 0x%08X\n", response);
 >
 >     return ret;
 > }
 >
1150a1216
 >
1842a1909,1985
 >
 >
 >
 > int do_erase(int nargs, char **argv)
 > {
 >     int fd, ret;
 >     char *device;
 >     char **eptr=NULL;
 >     __u32  argin, start, end;
 >
 >
 >     if (nargs != 5) {
 >         fprintf(stderr, "Usage: mmc erase <arg> <start address> <end 
address> </path/to/mmcblkX>\n");
 >         exit(1);
 >     }
 >
 >     if ((argv[1][0] == '0') && (argv[1][1] == 'x'))
 >       argin = strtol(argv[1], eptr, 16);
 >     else
 >       argin = strtol(argv[1], eptr, 10);
 >     if ((argv[2][0] == '0') && (argv[2][1] == 'x'))
 >       start = strtol(argv[2], eptr, 16);
 >     else
 >       start = strtol(argv[2], eptr, 10);
 >     if ((argv[3][0] == '0') && (argv[3][1] == 'x'))
 >       end   = strtol(argv[3], eptr, 16);
 >     else
 >       end   = strtol(argv[3], eptr, 10);
 >     device = argv[4];
 >
 >     fd = open(device, O_RDWR);
 >     if (fd < 0) {
 >         perror("open");
 >         exit(1);
 >     }
 >
 >     printf("Executing (0x%08X): ", argin);
 >     switch(argin)  {
 >     case 0x00000000:
 >       printf("Erase ");
 >       break;
 >     case 0x00000003:
 >       printf("Discard ");
 >       break;
 >     case 0x80000000:
 >       printf("Secure Erase ");
 >       break;
 >     case 0x80008000:
 >       printf("Secure Trim Step 2 ");
 >       break;
 >     case 0x80000001:
 >       printf("Secure Trim Step 1 ");
 >       break;
 >     case 0x00000001:
 >       printf("Trim ");
 >       break;
 >     default:
 >       printf("Unknown Argument ");
 >     }
 >     printf("From:0x%08X To:0x%08X\n", start, end);
 >
 >     ret = erase(fd, argin, start, end);
 >     if (ret) {
 >         fprintf(stderr, "Error in Erase Command to %s with Arg=0x%08X 
Start=0x%08X End=0x%08X\n",
 >             device,
 >             argin,
 >             start,
 >             end);
 >         exit(1);
 >     }
 >
 >     return ret;
 >
 > }
 >
 >
 >

mmc.c
29c29
< #define MMC_VERSION    "0.1"
---
 > #define MMC_VERSION    "0.1_KS"
135a136,140
 >       NULL
 >     },
 >     { do_erase, -4,
 >       "erase", "<arg> " "<start address> " "<end address> " "<device>\n"
 >         "Send Erase command to the <device>.\nThis will delete all 
user data in the specified region of the device.",




^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: mmc-utils changes for Erase commands.
  2019-12-10 22:51 mmc-utils changes for Erase commands Kimito Sakata
@ 2019-12-12 13:43 ` Avri Altman
  2019-12-12 15:00   ` Kimito Sakata
  0 siblings, 1 reply; 3+ messages in thread
From: Avri Altman @ 2019-12-12 13:43 UTC (permalink / raw)
  To: Kimito Sakata, linux-mmc; +Cc: chrisball, Nachi Nachiappan

Please send your patch in the appropriate format,
So it can be reviewed.

Thanks,
Avri

> 
> 
> mmc.h
> 36a37,45
>  > #define MMC_ERASE_GROUP_START   35    /* ac   [31:0] data addr   R1  */
>  > #define MMC_ERASE_GROUP_END     36    /* ac   [31:0] data addr   R1  */
>  > #define MMC_ERASE               38    /* ac   [31] Secure request
>  >                                               [30:16] set to 0  >                                               [15] Force
> Garbage Collect request4  >                                               [14:2] set to 0
> >                                               [1] Discard Enable  >                                               [0]
> Identify Write Blocks for Erase (or TRIM Enable)  > R1b */
> 
> mmc_cmds.h
> 33a34
>  > int do_erase(int nargs, char **argv);
> 
> mmc_cmds.c
> 226a227,291
>  > int erase(int fd, __u32 argin, __u32 start, __u32 end)  > {  >         int ret = 0;
>  >     struct mmc_ioc_cmd idata;
>  >     __u32  response;
>  >
>  >     // Set Start address
>  >     memset(&idata, 0, sizeof(idata));
>  >     idata.opcode = MMC_ERASE_GROUP_START;
>  >     idata.arg = start;
>  >     idata.flags = MMC_RSP_R1 | MMC_CMD_AC;
>  >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>  >     if (ret)  {
>  >       perror("ioctl");
>  >       printf("Erase Group Start Address command failed\n");
>  >       return ret;
>  >     }
>  >     ret = send_status(fd, &response);
>  >     if (response & 0xFFF900C0) {
>  >       printf("CMD13 returns: 0x%08x during CMD35\n", response);
>  >     }
>  >
>  >     // Set end address
>  >     memset(&idata, 0, sizeof(idata));
>  >     idata.opcode = MMC_ERASE_GROUP_END;
>  >     idata.arg = end;
>  >     idata.flags = MMC_RSP_R1 | MMC_CMD_AC;
>  >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>  >     if (ret) {
>  >       perror("ioctl");
>  >       printf("Erase Group End Address command failed\n");
>  >       return ret;
>  >     }
>  >     ret = send_status(fd, &response);
>  >     if (response & 0xFFF900C0)
>  >       printf("CMD13 returns: 0x%08x during CMD36\n", response);
>  >
>  >     // Send Erase Command
>  >     memset(&idata, 0, sizeof(idata));
>  >     idata.opcode = MMC_ERASE;
>  >     idata.arg = argin;
>  >     idata.cmd_timeout_ms = 60000;
>  >     idata.data_timeout_ns = 60000000;
>  >     idata.flags = MMC_RSP_R1B | MMC_CMD_AC;
>  >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>  >     if (ret)  {
>  >       perror("ioctl");
>  >       printf("Erase command failed\n");
>  >       return ret;
>  >     }
>  >
>  >     // Send Status Command
>  >     // 1098 7654 3210 9876 5432 1098 7654 3210
>  >     // 3322 2222 2222 1111 1111 1100 0000 0000
>  >     // 1111 1111 1111 1xx1 xxxx xxxx 11xx xxxx  Device Status Error bits
>  >     // F    F    F    9    0    0    C    0     0xFFF900C0
>  >     ret = send_status(fd, &response);
>  >     if (response & 0xFFF900C0)
>  >       printf("CMD13 returns: 0x%08x during CMD38\n", response);
>  >     if (ret)
>  >       printf("Send Status Command returned 0x%08X\n", response);
>  >
>  >     return ret;
>  > }
>  >
> 1150a1216
>  >
> 1842a1909,1985
>  >
>  >
>  >
>  > int do_erase(int nargs, char **argv)
>  > {
>  >     int fd, ret;
>  >     char *device;
>  >     char **eptr=NULL;
>  >     __u32  argin, start, end;
>  >
>  >
>  >     if (nargs != 5) {
>  >         fprintf(stderr, "Usage: mmc erase <arg> <start address> <end
> address> </path/to/mmcblkX>\n");
>  >         exit(1);
>  >     }
>  >
>  >     if ((argv[1][0] == '0') && (argv[1][1] == 'x'))
>  >       argin = strtol(argv[1], eptr, 16);
>  >     else
>  >       argin = strtol(argv[1], eptr, 10);
>  >     if ((argv[2][0] == '0') && (argv[2][1] == 'x'))
>  >       start = strtol(argv[2], eptr, 16);
>  >     else
>  >       start = strtol(argv[2], eptr, 10);
>  >     if ((argv[3][0] == '0') && (argv[3][1] == 'x'))
>  >       end   = strtol(argv[3], eptr, 16);
>  >     else
>  >       end   = strtol(argv[3], eptr, 10);
>  >     device = argv[4];
>  >
>  >     fd = open(device, O_RDWR);
>  >     if (fd < 0) {
>  >         perror("open");
>  >         exit(1);
>  >     }
>  >
>  >     printf("Executing (0x%08X): ", argin);
>  >     switch(argin)  {
>  >     case 0x00000000:
>  >       printf("Erase ");
>  >       break;
>  >     case 0x00000003:
>  >       printf("Discard ");
>  >       break;
>  >     case 0x80000000:
>  >       printf("Secure Erase ");
>  >       break;
>  >     case 0x80008000:
>  >       printf("Secure Trim Step 2 ");
>  >       break;
>  >     case 0x80000001:
>  >       printf("Secure Trim Step 1 ");
>  >       break;
>  >     case 0x00000001:
>  >       printf("Trim ");
>  >       break;
>  >     default:
>  >       printf("Unknown Argument ");
>  >     }
>  >     printf("From:0x%08X To:0x%08X\n", start, end);
>  >
>  >     ret = erase(fd, argin, start, end);
>  >     if (ret) {
>  >         fprintf(stderr, "Error in Erase Command to %s with Arg=0x%08X
> Start=0x%08X End=0x%08X\n",
>  >             device,
>  >             argin,
>  >             start,
>  >             end);
>  >         exit(1);
>  >     }
>  >
>  >     return ret;
>  >
>  > }
>  >
>  >
>  >
> 
> mmc.c
> 29c29
> < #define MMC_VERSION    "0.1"
> ---
>  > #define MMC_VERSION    "0.1_KS"
> 135a136,140
>  >       NULL
>  >     },
>  >     { do_erase, -4,
>  >       "erase", "<arg> " "<start address> " "<end address> " "<device>\n"
>  >         "Send Erase command to the <device>.\nThis will delete all
> user data in the specified region of the device.",
> 
> 


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: mmc-utils changes for Erase commands.
  2019-12-12 13:43 ` Avri Altman
@ 2019-12-12 15:00   ` Kimito Sakata
  0 siblings, 0 replies; 3+ messages in thread
From: Kimito Sakata @ 2019-12-12 15:00 UTC (permalink / raw)
  To: Avri Altman, linux-mmc; +Cc: chrisball, Nachi Nachiappan

Avri

Sorry new to this. Is there a doc on the "format" I can reference to?

Kimito

On 12/12/2019 6:43 AM, Avri Altman wrote:
> Please send your patch in the appropriate format,
> So it can be reviewed.
>
> Thanks,
> Avri
>
>>
>> mmc.h
>> 36a37,45
>>   > #define MMC_ERASE_GROUP_START   35    /* ac   [31:0] data addr   R1  */
>>   > #define MMC_ERASE_GROUP_END     36    /* ac   [31:0] data addr   R1  */
>>   > #define MMC_ERASE               38    /* ac   [31] Secure request
>>   >                                               [30:16] set to 0  >                                               [15] Force
>> Garbage Collect request4  >                                               [14:2] set to 0
>>>                                                 [1] Discard Enable  >                                               [0]
>> Identify Write Blocks for Erase (or TRIM Enable)  > R1b */
>>
>> mmc_cmds.h
>> 33a34
>>   > int do_erase(int nargs, char **argv);
>>
>> mmc_cmds.c
>> 226a227,291
>>   > int erase(int fd, __u32 argin, __u32 start, __u32 end)  > {  >         int ret = 0;
>>   >     struct mmc_ioc_cmd idata;
>>   >     __u32  response;
>>   >
>>   >     // Set Start address
>>   >     memset(&idata, 0, sizeof(idata));
>>   >     idata.opcode = MMC_ERASE_GROUP_START;
>>   >     idata.arg = start;
>>   >     idata.flags = MMC_RSP_R1 | MMC_CMD_AC;
>>   >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>>   >     if (ret)  {
>>   >       perror("ioctl");
>>   >       printf("Erase Group Start Address command failed\n");
>>   >       return ret;
>>   >     }
>>   >     ret = send_status(fd, &response);
>>   >     if (response & 0xFFF900C0) {
>>   >       printf("CMD13 returns: 0x%08x during CMD35\n", response);
>>   >     }
>>   >
>>   >     // Set end address
>>   >     memset(&idata, 0, sizeof(idata));
>>   >     idata.opcode = MMC_ERASE_GROUP_END;
>>   >     idata.arg = end;
>>   >     idata.flags = MMC_RSP_R1 | MMC_CMD_AC;
>>   >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>>   >     if (ret) {
>>   >       perror("ioctl");
>>   >       printf("Erase Group End Address command failed\n");
>>   >       return ret;
>>   >     }
>>   >     ret = send_status(fd, &response);
>>   >     if (response & 0xFFF900C0)
>>   >       printf("CMD13 returns: 0x%08x during CMD36\n", response);
>>   >
>>   >     // Send Erase Command
>>   >     memset(&idata, 0, sizeof(idata));
>>   >     idata.opcode = MMC_ERASE;
>>   >     idata.arg = argin;
>>   >     idata.cmd_timeout_ms = 60000;
>>   >     idata.data_timeout_ns = 60000000;
>>   >     idata.flags = MMC_RSP_R1B | MMC_CMD_AC;
>>   >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>>   >     if (ret)  {
>>   >       perror("ioctl");
>>   >       printf("Erase command failed\n");
>>   >       return ret;
>>   >     }
>>   >
>>   >     // Send Status Command
>>   >     // 1098 7654 3210 9876 5432 1098 7654 3210
>>   >     // 3322 2222 2222 1111 1111 1100 0000 0000
>>   >     // 1111 1111 1111 1xx1 xxxx xxxx 11xx xxxx  Device Status Error bits
>>   >     // F    F    F    9    0    0    C    0     0xFFF900C0
>>   >     ret = send_status(fd, &response);
>>   >     if (response & 0xFFF900C0)
>>   >       printf("CMD13 returns: 0x%08x during CMD38\n", response);
>>   >     if (ret)
>>   >       printf("Send Status Command returned 0x%08X\n", response);
>>   >
>>   >     return ret;
>>   > }
>>   >
>> 1150a1216
>>   >
>> 1842a1909,1985
>>   >
>>   >
>>   >
>>   > int do_erase(int nargs, char **argv)
>>   > {
>>   >     int fd, ret;
>>   >     char *device;
>>   >     char **eptr=NULL;
>>   >     __u32  argin, start, end;
>>   >
>>   >
>>   >     if (nargs != 5) {
>>   >         fprintf(stderr, "Usage: mmc erase <arg> <start address> <end
>> address> </path/to/mmcblkX>\n");
>>   >         exit(1);
>>   >     }
>>   >
>>   >     if ((argv[1][0] == '0') && (argv[1][1] == 'x'))
>>   >       argin = strtol(argv[1], eptr, 16);
>>   >     else
>>   >       argin = strtol(argv[1], eptr, 10);
>>   >     if ((argv[2][0] == '0') && (argv[2][1] == 'x'))
>>   >       start = strtol(argv[2], eptr, 16);
>>   >     else
>>   >       start = strtol(argv[2], eptr, 10);
>>   >     if ((argv[3][0] == '0') && (argv[3][1] == 'x'))
>>   >       end   = strtol(argv[3], eptr, 16);
>>   >     else
>>   >       end   = strtol(argv[3], eptr, 10);
>>   >     device = argv[4];
>>   >
>>   >     fd = open(device, O_RDWR);
>>   >     if (fd < 0) {
>>   >         perror("open");
>>   >         exit(1);
>>   >     }
>>   >
>>   >     printf("Executing (0x%08X): ", argin);
>>   >     switch(argin)  {
>>   >     case 0x00000000:
>>   >       printf("Erase ");
>>   >       break;
>>   >     case 0x00000003:
>>   >       printf("Discard ");
>>   >       break;
>>   >     case 0x80000000:
>>   >       printf("Secure Erase ");
>>   >       break;
>>   >     case 0x80008000:
>>   >       printf("Secure Trim Step 2 ");
>>   >       break;
>>   >     case 0x80000001:
>>   >       printf("Secure Trim Step 1 ");
>>   >       break;
>>   >     case 0x00000001:
>>   >       printf("Trim ");
>>   >       break;
>>   >     default:
>>   >       printf("Unknown Argument ");
>>   >     }
>>   >     printf("From:0x%08X To:0x%08X\n", start, end);
>>   >
>>   >     ret = erase(fd, argin, start, end);
>>   >     if (ret) {
>>   >         fprintf(stderr, "Error in Erase Command to %s with Arg=0x%08X
>> Start=0x%08X End=0x%08X\n",
>>   >             device,
>>   >             argin,
>>   >             start,
>>   >             end);
>>   >         exit(1);
>>   >     }
>>   >
>>   >     return ret;
>>   >
>>   > }
>>   >
>>   >
>>   >
>>
>> mmc.c
>> 29c29
>> < #define MMC_VERSION    "0.1"
>> ---
>>   > #define MMC_VERSION    "0.1_KS"
>> 135a136,140
>>   >       NULL
>>   >     },
>>   >     { do_erase, -4,
>>   >       "erase", "<arg> " "<start address> " "<end address> " "<device>\n"
>>   >         "Send Erase command to the <device>.\nThis will delete all
>> user data in the specified region of the device.",
>>
>>


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-12-12 15:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-10 22:51 mmc-utils changes for Erase commands Kimito Sakata
2019-12-12 13:43 ` Avri Altman
2019-12-12 15:00   ` Kimito Sakata

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).