Merge pull request #74 from hzhuang1/sd_2

Sd 2
diff --git a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h
index 4e175b9..4fe040e 100644
--- a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h
+++ b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h
@@ -139,6 +139,7 @@
   VOID                                *DmaMap;

 

   BOOLEAN                             UseFifo;

+  BOOLEAN                             UseBE;                  // Big-endian

 

   DW_MMC_HC_PRIVATE_DATA              *Private;

 } DW_MMC_HC_TRB;

diff --git a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
index 9ca044b..cf34e30 100644
--- a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
+++ b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
@@ -1214,17 +1214,23 @@
   UINT32                    Intsts;

   UINT32                    Sts;

   UINT32                    FifoCount;

+  UINT32                    Index;     // count with bytes

+  UINT32                    Ascending;

+  UINT32                    Descending;

 

   PciIo   = Trb->Private->PciIo;

   Received = 0;

-  Count = (Trb->DataLen + 3) / 4;

-  while (1) {

+  Count = 0;

+  Index = 0;

+  Ascending = 0;

+  Descending = ((Trb->DataLen + 3) & ~3) - 4;

+  do {

     Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_RINTSTS, TRUE, sizeof (Intsts), &Intsts);

     if (EFI_ERROR (Status)) {

       DEBUG ((DEBUG_ERROR, "ReadFifo: failed to read RINTSTS, Status:%r\n", Status));

       return Status;

     }

-    if (Intsts & DW_MMC_INT_DTO) {

+    if (Trb->DataLen && ((Intsts & DW_MMC_INT_RXDR) || (Intsts & DW_MMC_INT_DTO))) {

       Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_STATUS, TRUE, sizeof (Sts), &Sts);

       if (EFI_ERROR (Status)) {

         DEBUG ((DEBUG_ERROR, "ReadFifo: failed to read STATUS, Status:%r\n", Status));

@@ -1232,28 +1238,30 @@
       }

       // Convert to bytes

       FifoCount = GET_STS_FIFO_COUNT (Sts) << 2;

-      Count = (MIN (FifoCount, Trb->DataLen) + 3) / 4;

-      Received = 0;

-      // Read FIFO

-      while (Count && (Received < Count)) {

+      if ((FifoCount == 0) && (Received < Trb->DataLen)) {

+        continue;

+      }

+      Index = 0;

+      Count = (MIN (FifoCount, Trb->DataLen) + 3) & ~3;

+      while (Index < Count) {

         Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_FIFO_START, TRUE, sizeof (Data), &Data);

         if (EFI_ERROR (Status)) {

           DEBUG ((DEBUG_ERROR, "ReadFifo: failed to read FIFO, Status:%r\n", Status));

           return Status;

         }

-        *(UINT32 *)((UINTN)Trb->Data + ((Count - Received - 1) << 2)) = SwapBytes32 (Data);

-        Received++;

-      }

-    }

-    if (Intsts & DW_MMC_INT_CMD_DONE) {

-      if ((Intsts == DW_MMC_INT_CMD_DONE) && Count) {

-        // CMD_DONE interrupt comes earlier before other interrupts. Just wait for a while.

-        continue;

-      } else {

-        break;

-      }

-    }

-  }

+        if (Trb->UseBE) {

+          *(UINT32 *)((UINTN)Trb->Data + Descending) = SwapBytes32 (Data);

+          Descending = Descending - 4;

+        } else {

+          *(UINT32 *)((UINTN)Trb->Data + Ascending) = Data;

+          Ascending += 4;

+        }

+        Index += 4;

+        Received += 4;

+      } // while

+    } // if

+  } while (((Intsts & DW_MMC_INT_CMD_DONE) == 0) || (Received < Trb->DataLen));

+  // Clear RINTSTS

   Intsts = ~0;

   Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_RINTSTS, FALSE, sizeof (Intsts), &Intsts);

   if (EFI_ERROR (Status)) {

@@ -1334,9 +1342,13 @@
     }

 

     PciIo = Private->PciIo;

+#if 0

     if ((Private->Slot[Trb->Slot].CardType == SdCardType) &&

         (Trb->DataLen != 0) &&

         (Trb->DataLen <= DWMMC_FIFO_THRESHOLD)) {

+#else

+    if (Private->Slot[Trb->Slot].CardType == SdCardType) {

+#endif

       Trb->UseFifo = TRUE;

     } else {

       Trb->UseFifo = FALSE;

@@ -1689,6 +1701,9 @@
     case SD_STOP_TRANSMISSION:

       Cmd |= BIT_CMD_STOP_ABORT_CMD;

       break;

+    case SD_SEND_SCR:

+      Trb->UseBE = TRUE;

+      break;

     }

     if (Packet->InTransferLength) {

       Cmd |= BIT_CMD_WAIT_PRVDATA_COMPLETE | BIT_CMD_DATA_EXPECTED | BIT_CMD_READ;

@@ -1725,7 +1740,11 @@
     if (EFI_ERROR (Status)) {

       return Status;

     }

-    BlkSize = Packet->InTransferLength;

+    if (Packet->InTransferLength > DW_MMC_BLOCK_SIZE) {

+      BlkSize = DW_MMC_BLOCK_SIZE;

+    } else {

+      BlkSize = Packet->InTransferLength;

+    }

     Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_BLKSIZ, FALSE, sizeof (BlkSize), &BlkSize);

     if (EFI_ERROR (Status)) {

       DEBUG ((DEBUG_ERROR, "DwMmcHcReset: set block size fails: %r\n", Status));

@@ -1761,6 +1780,9 @@
   } else {

     Timeout = 10000;

     do {

+      if (--Timeout == 0) {

+        break;

+      }

       Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_RINTSTS, TRUE, sizeof (IntStatus), &IntStatus);

       if (EFI_ERROR (Status)) {

         return Status;

@@ -1768,13 +1790,12 @@
       if (IntStatus & ErrMask) {

         return EFI_DEVICE_ERROR;

       }

-      if (IntStatus & DW_MMC_INT_DTO) {  // Transfer Done

-        break;

+      if (Trb->DataLen && ((IntStatus & DW_MMC_INT_DTO) == 0)) {  // Transfer Done

+        MicroSecondDelay (10);

+        continue;

+      } else {

+        MicroSecondDelay (10);

       }

-      if (--Timeout == 0) {

-        break;

-      }

-      MicroSecondDelay (10);

     } while (!(IntStatus & DW_MMC_INT_CMD_DONE));

     if (Packet->InTransferLength) {

       do {

diff --git a/Drivers/SdMmc/DwMmcHcDxe/SdDevice.c b/Drivers/SdMmc/DwMmcHcDxe/SdDevice.c
index fdbe383..4f14b60 100644
--- a/Drivers/SdMmc/DwMmcHcDxe/SdDevice.c
+++ b/Drivers/SdMmc/DwMmcHcDxe/SdDevice.c
@@ -949,16 +949,7 @@
     return Status;

   }

   //

-  // 3. Send SDIO Cmd5 to the device to the SDIO device OCR register.

-  //

-  Status = SdioSendOpCond (PassThru, Slot, 0, FALSE);

-  if (!EFI_ERROR (Status)) {

-    DEBUG ((DEBUG_INFO, "SdCardIdentification: Found SDIO device, ignore it as we don't support\n"));

-    return EFI_DEVICE_ERROR;

-  }

-  MicroSecondDelay (10000);

-  //

-  // 4. Send Acmd41 with voltage window 0 to the device

+  // 3. Send Acmd41 with voltage window 0 to the device

   //

   Status = SdCardSendOpCond (PassThru, Slot, 0, 0, FALSE, FALSE, FALSE, &Ocr);

   if (EFI_ERROR (Status)) {

@@ -996,7 +987,7 @@
   }

 

   //

-  // 5. Repeatly send Acmd41 with supply voltage window to the device.

+  // 4. Repeatly send Acmd41 with supply voltage window to the device.

   //    Note here we only support the cards complied with SD physical

   //    layer simplified spec version 2.0 and version 3.0 and above.

   //

diff --git a/Platforms/Hisilicon/HiKey/HiKey.dsc b/Platforms/Hisilicon/HiKey/HiKey.dsc
index 3a6b554..3b99cf5 100644
--- a/Platforms/Hisilicon/HiKey/HiKey.dsc
+++ b/Platforms/Hisilicon/HiKey/HiKey.dsc
@@ -358,7 +358,7 @@
   # Android Loader

   #

   gEmbeddedTokenSpaceGuid.PcdAndroidBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00D023F70000000000)/eMMC(0x0)/Ctrl(0x0)/HD(6,GPT,5C0F213C-17E1-4149-88C8-8B50FB4EC70E,0x7000,0x20000)"

-  gEmbeddedTokenSpaceGuid.PcdSdBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00E023F70000000000)/SD(0x0)/HD(1,MBR,0x00000000,0x3F,0x21FC0)"

+  gEmbeddedTokenSpaceGuid.PcdSdBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00E023F70000000000)/SD(0x0)/HD(1,MBR,0x263000B1,0x3F,0x21FC0)"

 

   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|1

 

diff --git a/Platforms/Hisilicon/HiKey960/HiKey960.dsc b/Platforms/Hisilicon/HiKey960/HiKey960.dsc
index ae979d5..4f40969 100644
--- a/Platforms/Hisilicon/HiKey960/HiKey960.dsc
+++ b/Platforms/Hisilicon/HiKey960/HiKey960.dsc
@@ -369,7 +369,7 @@
   # Android Loader

   #

   gEmbeddedTokenSpaceGuid.PcdAndroidBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00003BFF0000000000)/UFS(0x0,0x3)/HD(7,GPT,D3340696-9B95-4C64-8DF6-E6D4548FBA41,0x12100,0x4000)"

-  gEmbeddedTokenSpaceGuid.PcdSdBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00F037FF0000000000)/SD(0x0)/HD(1,MBR,0x00000000,0x3F,0x21FC0)"

+  gEmbeddedTokenSpaceGuid.PcdSdBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00F037FF0000000000)/SD(0x0)/HD(1,MBR,0x263000B1,0x3F,0x21FC0)"

 

   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|1