public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH 1/1] EmbeddedPkg/MmcDxe: Added MaxBlock Transfer Limit 65535 in R/W.
@ 2020-04-03  9:24 Gaurav Jain
  2020-04-06 14:08 ` Leif Lindholm
  0 siblings, 1 reply; 14+ messages in thread
From: Gaurav Jain @ 2020-04-03  9:24 UTC (permalink / raw)
  To: devel; +Cc: Leif Lindholm, Ard Biesheuvel, Pankaj Bansal, Gaurav Jain

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>
---
 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


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

end of thread, other threads:[~2020-11-26  7:16 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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     ` [EXT] " Gaurav Jain
2020-04-07  7:52       ` 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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox