* 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.