From: Peng Fan <van.freenix@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/5] mmc: sd: extracting erase timeout information from sd status
Date: Fri, 12 Aug 2016 10:55:14 +0800 [thread overview]
Message-ID: <20160812025449.GA810@linux-7smt.suse> (raw)
In-Reply-To: <3fe32cff-3bc2-0d61-4693-3c31228b7bea@samsung.com>
Hi Jaehoon,
On Fri, Aug 12, 2016 at 11:08:28AM +0900, Jaehoon Chung wrote:
>Hi Peng,
>
>On 08/11/2016 08:00 PM, Peng Fan wrote:
>> Add function to read SD_STATUS information.
>> According to the information, get erase_timeout/erase_size/erase_offset.
>> Add a structure sd_ssr to include the erase related information.
>>
>> Signed-off-by: Peng Fan <peng.fan@nxp.com>
>> Cc: Jaehoon Chung <jh80.chung@samsung.com>
>> Cc: Simon Glass <sjg@chromium.org>
>> Cc: Bin Meng <bmeng.cn@gmail.com>
>> Cc: Stefan Wahren <stefan.wahren@i2se.com>
>> Cc: Clemens Gruber <clemens.gruber@pqgruber.com>
>> Cc: Kever Yang <kever.yang@rock-chips.com>
>> Cc: Eric Nelson <eric@nelint.com>
>> Cc: Stephen Warren <swarren@nvidia.com>
>> ---
>> drivers/mmc/mmc.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> include/mmc.h | 8 +++++++
>> 2 files changed, 78 insertions(+)
>>
>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>> index 3daa748..efe517a 100644
>> --- a/drivers/mmc/mmc.c
>> +++ b/drivers/mmc/mmc.c
>> @@ -21,6 +21,13 @@
>> #include <div64.h>
>> #include "mmc_private.h"
>>
>> +static const unsigned int sd_au_size[] = {
>> + 0, SZ_16K / 512, SZ_32K / 512, SZ_64K / 512,
>> + SZ_128K / 512, SZ_256K / 512, SZ_512K / 512, SZ_1M / 512,
>> + SZ_2M / 512, SZ_4M / 512, SZ_8M / 512, (SZ_8M + SZ_4M) / 512,
>> + SZ_16M / 512, (SZ_16M + SZ_8M) / 512, SZ_32M / 512, SZ_64M / 512,
>> +};
>
>WARNING: line over 80 characters
>#37: FILE: drivers/mmc/mmc.c:27:
>+ SZ_2M / 512, SZ_4M / 512, SZ_8M / 512, (SZ_8M + SZ_4M) / 512,
Will fix this in V2.
>
>> +
>> #ifndef CONFIG_DM_MMC_OPS
>> __weak int board_mmc_getwp(struct mmc *mmc)
>> {
>> @@ -942,6 +949,65 @@ retry_scr:
>> return 0;
>> }
>>
>> +static int sd_read_ssr(struct mmc *mmc)
>> +{
>> + int err, i;
>> + struct mmc_cmd cmd;
>> + ALLOC_CACHE_ALIGN_BUFFER(uint, ssr, 16);
>> + struct mmc_data data;
>> + int timeout;
>> + unsigned int au, eo, et, es;
>> +
>> + cmd.cmdidx = MMC_CMD_APP_CMD;
>> + cmd.resp_type = MMC_RSP_R1;
>> + cmd.cmdarg = mmc->rca << 16;
>> +
>> + err = mmc_send_cmd(mmc, &cmd, NULL);
>> + if (err)
>> + return err;
>> +
>> + cmd.cmdidx = SD_CMD_APP_SD_STATUS;
>> + cmd.resp_type = MMC_RSP_R1;
>> + cmd.cmdarg = 0;
>> +
>> + timeout = 3;
>
>Don't need to assign at here.
I just follow retry_scr here. You mean there is no need to try more times?
>
>> +
>> +retry_ssr:
>> + data.dest = (char *)ssr;
>> + data.blocksize = 64;
>> + data.blocks = 1;
>> + data.flags = MMC_DATA_READ;
>> +
>> + err = mmc_send_cmd(mmc, &cmd, &data);
>> + if (err) {
>> + if (timeout--)
>> + goto retry_ssr;
>> +
>> + return err;
>> + }
>> +
>> + for (i = 0; i < 16; i++)
>> + ssr[i] = be32_to_cpu(ssr[i]);
>> +
>> + au = (ssr[2] >> 12) & 0xF;
>> + if ((au <= 9) || (mmc->version == SD_VERSION_3)) {
>> + mmc->ssr.au = sd_au_size[au];
>> + es = (ssr[3] >> 24) & 0xFF;
>> + es |= (ssr[2] & 0xFF) << 8;
>> + et = (ssr[3] >> 18) & 0x3F;
>> + if (es && et) {
>> + eo = (ssr[3] >> 16) & 0x3;
>> + mmc->ssr.erase_timeout = (et * 1000) / es;
>> + mmc->ssr.erase_offset = eo * 1000;
>> + }
>> + } else {
>> + printf("Invalid Allocation Unit Size.\n");
>> + return -EINVAL;
>
>If AU size can't read, then your patch can't also initialize the SD-card.
>AU-size is critical things enough to go to non-initialize??
Not a must. Will use debug here and discard `return -EINVAL`.
>
>> + }
>> +
>> + return 0;
>> +}
>> +
>> /* frequency bases */
>> /* divided by 10 to be nice to platforms without floating point */
>> static const int fbase[] = {
>> @@ -1347,6 +1413,10 @@ static int mmc_startup(struct mmc *mmc)
>> mmc_set_bus_width(mmc, 4);
>> }
>>
>> + err = sd_read_ssr(mmc);
>> + if (err)
>> + return err;
>> +
>> if (mmc->card_caps & MMC_MODE_HS)
>> mmc->tran_speed = 50000000;
>> else
>> diff --git a/include/mmc.h b/include/mmc.h
>> index aa6d5d1..f09c36f 100644
>> --- a/include/mmc.h
>> +++ b/include/mmc.h
>> @@ -102,6 +102,7 @@
>> #define SD_CMD_SWITCH_UHS18V 11
>>
>> #define SD_CMD_APP_SET_BUS_WIDTH 6
>> +#define SD_CMD_APP_SD_STATUS 13
>> #define SD_CMD_ERASE_WR_BLK_START 32
>> #define SD_CMD_ERASE_WR_BLK_END 33
>> #define SD_CMD_APP_SEND_OP_COND 41
>> @@ -392,6 +393,12 @@ struct mmc_config {
>> unsigned char part_type;
>> };
>>
>> +struct sd_ssr {
>> + unsigned int au; /* In sectors */
>> + unsigned int erase_timeout; /* In milliseconds */
>> + unsigned int erase_offset; /* In milliseconds */
>> +};
>> +
>> /*
>> * With CONFIG_DM_MMC enabled, struct mmc can be accessed from the MMC device
>> * with mmc_get_mmc_dev().
>> @@ -426,6 +433,7 @@ struct mmc {
>> uint write_bl_len;
>> uint erase_grp_size; /* in 512-byte sectors */
>> uint hc_wp_grp_size; /* in 512-byte sectors */
>> + struct sd_ssr ssr;
>
>Add the comment what is SSR.
SD Status register. Will add in V2.
Thanks,
Peng.
>
>Best Regards,
>Jaehoon Chung
>
>> u64 capacity;
>> u64 capacity_user;
>> u64 capacity_boot;
>>
>
next prev parent reply other threads:[~2016-08-12 2:55 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20160811110023epcas1p4289773001396502dbc59a4638887cae5@epcas1p4.samsung.com>
2016-08-11 11:00 ` [U-Boot] [PATCH 1/5] mmc: sd: extracting erase timeout information from sd status Peng Fan
2016-08-11 11:00 ` [U-Boot] [PATCH 2/5] mmc: initialize mmc_cmd with 0 Peng Fan
2016-08-12 17:20 ` Simon Glass
2016-08-13 1:41 ` Peng Fan
2016-08-18 3:45 ` Simon Glass
2016-08-18 6:21 ` Peng Fan
2016-08-11 11:00 ` [U-Boot] [PATCH 3/5] mmc: sd: add erase timeout support Peng Fan
2016-08-11 11:00 ` [U-Boot] [PATCH 4/5] mmc: esdhc: change timeout value Peng Fan
2016-08-11 11:00 ` [U-Boot] [PATCH 5/5] mmc: sd: optimize erase Peng Fan
2016-08-12 0:53 ` Fabio Estevam
2016-08-12 3:02 ` Peng Fan
2016-08-12 3:12 ` Fabio Estevam
2016-08-12 2:08 ` [U-Boot] [PATCH 1/5] mmc: sd: extracting erase timeout information from sd status Jaehoon Chung
2016-08-12 2:55 ` Peng Fan [this message]
2016-08-12 3:51 ` Jaehoon Chung
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160812025449.GA810@linux-7smt.suse \
--to=van.freenix@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.