All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frank Bormann <fbormann@yahoo.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/1] Read mmc device memory capacity from EXT_CSD if memory is addressed by sector
Date: Fri, 11 Apr 2014 11:35:28 -0400	[thread overview]
Message-ID: <53480BC0.3000205@yahoo.com> (raw)
In-Reply-To: <52F2986A.1080805@yahoo.com>

Hi Pantos, hi Tom,

I sent this a couple of months ago to the mailing list, never really received a 
response. We are testing 2014.04-rc3 right now and the issue is still there. 
Would you still consider bringing this fix in for the upcoming release?

This is for an eMMC chip with an initial memory size > 2GB whose memory size 
drops below 2GB when turning enhanced (pseudo-SLC) mode on for the user 
partition. u-boot would then fail memory size detection and assume memory size 
if zero. You'd see error messages like:

MMC: block number 0x1 exceeds max(0x0)
MMC: block number 0x800 exceeds max(0x0)
MMC: block number 0x900 exceeds max(0x0)

Thanks,
Frank

On 05/02/14 03:00 PM, Frank Bormann wrote:
> Hello Everyone,
>
> I believe, there is a bug in the mmc driver code pertaining to how u-boot
> detects memory size of an mmc device. However, I am not 100% sure, my solution
> conforms to the JEDEC standard. So I am putting it up for discussion.
>
> Previously, sector count indicated by mmc devices in the EXT_CSD
> would only be used in u-boot if the size indicated is greater than
> 2 GB. This seems to be incorrect. I am working with a 4 GB Micron
> eMMC device that after partition configuration and setting the
> user data area to enhanced mode has a remaining capacity of less
> than 2 GB for the user data area. JESD84-B50 explicitly states in
> 6.2.4 that for these devices SEC_CNT from the EXT_CSD is still
> valid even if the memory size for that device has dropped below
> 2 GB by the partition configuration applied. The access mode bits
> from the OCR register seem to provide a better way to decide
> whether to use the CSD-based C_SIZE & C_MULT or the EXT_CSD-based
> SEC_CNT information when determining the device's capacity.
>
> In particular, this fixes a bug where u-boot SPL would assign 0 to
> mmc->block_dev.lba later on in the mmc_startup() function and
> subsequently fail to load u-boot from that mmc due to the original
> C_SIZE & C_MULT code assigning a 4 TB size to mmc->capacity, that
> incorrect capacity never being overwritten by the SEC_CNT capacity
> calculation (due to its size being less than 2 GB) and then finally
> lldiv(mmc->capacity, mmc->read_bl_len) exceeding the 32-bit result
> data type of mmc->block_dev.lba.
>
> Signed-off-by: Frank Bormann <fbormann@yahoo.com>
> ---
>   drivers/mmc/mmc.c |   10 +++++-----
>   include/mmc.h     |    1 +
>   2 files changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index c6a1c23..c5d1efc 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -935,19 +935,19 @@ static int mmc_startup(struct mmc *mmc)
>          if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
>                  /* check  ext_csd version and capacity */
>                  err = mmc_send_ext_csd(mmc, ext_csd);
> -               if (!err && (ext_csd[EXT_CSD_REV] >= 2)) {
> +               if (!err && (ext_csd[EXT_CSD_REV] >= 2) &&
> +                       (mmc->ocr & OCR_ACCESS_MODE) == OCR_ACCESS_BY_SECTOR) {
>                          /*
>                           * According to the JEDEC Standard, the value of
> -                        * ext_csd's capacity is valid if the value is more
> -                        * than 2GB
> +                        * ext_csd's capacity is valid if the device addresses
> +                        * its memory by sector
>                           */
>                          capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
>                                          | 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;
> -                       if ((capacity >> 20) > 2 * 1024)
> -                               mmc->capacity_user = capacity;
> +                       mmc->capacity_user = capacity;
>                  }
>
>                  switch (ext_csd[EXT_CSD_REV]) {
> diff --git a/include/mmc.h b/include/mmc.h
> index e1060b9..816b580 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -104,6 +104,7 @@
>   #define OCR_HCS                        0x40000000
>   #define OCR_VOLTAGE_MASK       0x007FFF80
>   #define OCR_ACCESS_MODE                0x60000000
> +#define OCR_ACCESS_BY_SECTOR   (1 << 30)
>
>   #define SECURE_ERASE           0x80000000
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>

  reply	other threads:[~2014-04-11 15:35 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-05 20:00 [U-Boot] [RFC PATCH 1/1] Read mmc device memory capacity from EXT_CSD if memory is addressed by sector Frank Bormann
2014-04-11 15:35 ` Frank Bormann [this message]
2014-05-23  8:28   ` [U-Boot] [PATCH " Pantelis Antoniou

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=53480BC0.3000205@yahoo.com \
    --to=fbormann@yahoo.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.