public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Gaurav Jain" <gaurav.jain@nxp.com>
To: Ard Biesheuvel <ard.biesheuvel@arm.com>,
	Leif Lindholm <leif@nuviainc.com>
Cc: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	Pankaj Bansal <pankaj.bansal@nxp.com>,
	Haojian Zhuang <haojian.zhuang@linaro.org>,
	"Loh, Tien Hock" <tien.hock.loh@intel.com>
Subject: Re: [EXT] Re: [PATCH 1/1] EmbeddedPkg/MmcDxe: Added MaxBlock Transfer Limit 65535 in R/W.
Date: Tue, 7 Apr 2020 07:01:37 +0000	[thread overview]
Message-ID: <AM5PR04MB3074312B353011244951CA9FE7C30@AM5PR04MB3074.eurprd04.prod.outlook.com> (raw)
In-Reply-To: <3d55018b-8751-bbe1-b1ac-98ac36e16e1c@arm.com>



> -----Original Message-----
> From: Ard Biesheuvel <ard.biesheuvel@arm.com>
> Sent: Monday, April 6, 2020 7:42 PM
> To: Leif Lindholm <leif@nuviainc.com>; Gaurav Jain <gaurav.jain@nxp.com>
> Cc: devel@edk2.groups.io; Pankaj Bansal <pankaj.bansal@nxp.com>;
> Haojian Zhuang <haojian.zhuang@linaro.org>; Loh, Tien Hock
> <tien.hock.loh@intel.com>
> Subject: [EXT] Re: [PATCH 1/1] EmbeddedPkg/MmcDxe: Added MaxBlock
> Transfer Limit 65535 in R/W.
> 
> Caution: EXT Email
> 
> On 4/6/20 4:08 PM, Leif Lindholm wrote:
> > Hi Gaurav,
> >
> > Haojian, Tien Hock - can you help review/test this change?
> >
> > Best Regards,
> >
> > Leif
> >
> > On Fri, Apr 03, 2020 at 14:54:07 +0530, Gaurav Jain wrote:
> >> Moved BlockCount calculation below BufferSize Validation checks.
> >> First Ensure Buffersize is Not Zero and multiple of Media BlockSize.
> >> then calculate BlockCount and perform Block checks.
> >>
> >> Corrected BlockCount calculation, as BufferSize is multiple of
> >> BlockSize, So adding (BlockSize-1) bytes to BufferSize and then
> >> divide by BlockSize will have no impact on BlockCount.
> >>
> >> Reading Large Images from MMC causes errors.
> >> As per SD Host Controller Spec version 4.20, Restriction of 16-bit
> >> Block Count transfer is 65535.
> >> Max block transfer limit in single cmd is 65535 blocks.
> >> Added Max Block check that can be processed is 0xFFFF.
> >> then Update BlockCount on the basis of MaxBlock.
> >>
> >> Signed-off-by: Gaurav Jain <gaurav.jain@nxp.com>
> 
> 
> Hello Gaurav,
> 
> Could you please elaborate on the underlying need for this change? If you
> are considering using this driver for future NXP platforms, I should point out
> that this legacy driver is only kept around for existing users, and new users
> should use the driver stack in MdeModulePkg, which is based on the UEFI
> spec.
> 
> --
> Ard.

Hello Ard

This change is for existing Platforms as well, that are using EmbeddedPkg driver.
I can see Max Block Transfer Limit in MdeModulePkg also.
This Limit is not defined in EmbeddedPkg, which is causing errors on NXP existing platform While reading Large images from MMC.
Block transfer limit is defined in SD spec.

Regards
Gaurav Jain
> 
> 
> 
> >> ---
> >>   EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c | 38
> ++++++++++++++++++++-----------
> >>   1 file changed, 25 insertions(+), 13 deletions(-)
> >>
> >> diff --git a/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c
> >> b/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c
> >> index 17c20c0159ba..b508c466d9c5 100644
> >> --- a/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c
> >> +++ b/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c
> >> @@ -242,6 +242,8 @@ MmcIoBlocks (
> >>     UINTN                   BytesRemainingToBeTransfered;
> >>     UINTN                   BlockCount;
> >>     UINTN                   ConsumeSize;
> >> +  UINT32                  MaxBlock;
> >> +  UINTN                   RemainingBlock;
> >>
> >>     BlockCount = 1;
> >>     MmcHostInstance = MMC_HOST_INSTANCE_FROM_BLOCK_IO_THIS
> (This); @@
> >> -262,19 +264,6 @@ MmcIoBlocks (
> >>       return EFI_NO_MEDIA;
> >>     }
> >>
> >> -  if (MMC_HOST_HAS_ISMULTIBLOCK(MmcHost) && MmcHost-
> >IsMultiBlock(MmcHost)) {
> >> -    BlockCount = (BufferSize + This->Media->BlockSize - 1) / This->Media-
> >BlockSize;
> >> -  }
> >> -
> >> -  // All blocks must be within the device
> >> -  if ((Lba + (BufferSize / This->Media->BlockSize)) > (This->Media-
> >LastBlock + 1)) {
> >> -    return EFI_INVALID_PARAMETER;
> >> -  }
> >> -
> >> -  if ((Transfer == MMC_IOBLOCKS_WRITE) && (This->Media->ReadOnly
> == TRUE)) {
> >> -    return EFI_WRITE_PROTECTED;
> >> -  }
> >> -
> >>     // Reading 0 Byte is valid
> >>     if (BufferSize == 0) {
> >>       return EFI_SUCCESS;
> >> @@ -285,14 +274,36 @@ MmcIoBlocks (
> >>       return EFI_BAD_BUFFER_SIZE;
> >>     }
> >>
> >> +  if (MMC_HOST_HAS_ISMULTIBLOCK(MmcHost) && MmcHost-
> >IsMultiBlock(MmcHost)) {
> >> +    BlockCount = BufferSize / This->Media->BlockSize;  }
> >> +
> >> +  // All blocks must be within the device  if ((Lba + (BufferSize /
> >> + This->Media->BlockSize)) > (This->Media->LastBlock + 1)) {
> >> +    return EFI_INVALID_PARAMETER;
> >> +  }
> >> +
> >> +  if ((Transfer == MMC_IOBLOCKS_WRITE) && (This->Media->ReadOnly
> == TRUE)) {
> >> +    return EFI_WRITE_PROTECTED;
> >> +  }
> >> +
> >>     // Check the alignment
> >>     if ((This->Media->IoAlign > 2) && (((UINTN)Buffer & (This->Media-
> >IoAlign - 1)) != 0)) {
> >>       return EFI_INVALID_PARAMETER;
> >>     }
> >>
> >> +  // Max block number in single cmd is 65535 blocks.
> >> +  MaxBlock = 0xFFFF;
> >> +  RemainingBlock = BlockCount;
> >>     BytesRemainingToBeTransfered = BufferSize;
> >>     while (BytesRemainingToBeTransfered > 0) {
> >>
> >> +    if (RemainingBlock <= MaxBlock) {
> >> +      BlockCount = RemainingBlock;
> >> +    } else {
> >> +      BlockCount = MaxBlock;
> >> +    }
> >> +
> >>       // Check if the Card is in Ready status
> >>       CmdArg = MmcHostInstance->CardInfo.RCA << 16;
> >>       Response[0] = 0;
> >> @@ -338,6 +349,7 @@ MmcIoBlocks (
> >>         DEBUG ((EFI_D_ERROR, "%a(): Failed to transfer block and
> Status:%r\n", __func__, Status));
> >>       }
> >>
> >> +    RemainingBlock -= BlockCount;
> >>       BytesRemainingToBeTransfered -= ConsumeSize;
> >>       if (BytesRemainingToBeTransfered > 0) {
> >>         Lba    += BlockCount;
> >> --
> >> 2.7.4
> >>


  reply	other threads:[~2020-04-07  7:01 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-03  9:24 [PATCH 1/1] EmbeddedPkg/MmcDxe: Added MaxBlock Transfer Limit 65535 in R/W Gaurav Jain
2020-04-06 14:08 ` Leif Lindholm
2020-04-06 14:12   ` Ard Biesheuvel
2020-04-07  7:01     ` Gaurav Jain [this message]
2020-04-07  7:52       ` [EXT] " Loh, Tien Hock
2020-04-21  6:39         ` Gaurav Jain
2020-04-27  2:15           ` Loh, Tien Hock
2020-04-27  6:19     ` Pankaj Bansal
2020-04-29  5:17       ` Loh, Tien Hock
2020-04-29 11:16         ` Leif Lindholm
2020-04-30  1:16           ` Loh, Tien Hock
2020-05-27 11:21             ` [EXT] " Gaurav Jain
2020-06-12  8:12               ` Ard Biesheuvel
2020-11-26  7:16               ` [edk2-devel] " Gaurav Jain

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-list 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=AM5PR04MB3074312B353011244951CA9FE7C30@AM5PR04MB3074.eurprd04.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox